summaryrefslogtreecommitdiff
path: root/python/astal/binding.py
blob: 0fe1b6c3fc362a05330850abccd797cb8385b050 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import re


def kebabify(string):
    return re.sub(r"([a-z])([A-Z])", r"\1-\2", string).replace("_", "-").lower()


class Binding:
    def __init__(self, emitter, prop=None):
        self.emitter = emitter
        self.prop = kebabify(prop) if prop else None
        self.transform_fn = lambda v: v

    def __str__(self):
        return f"Binding<{self.emitter}{', ' + self.prop if self.prop else ''}>"

    def as_(self, fn):
        bind = Binding(self.emitter, self.prop)
        bind.transform_fn = lambda v: fn(self.transform_fn(v))
        return bind

    def get(self):
        if hasattr(self.emitter, "get") and callable(self.emitter.get):
            return self.transform_fn(self.emitter.get())

        return self.transform_fn(self.emitter[f"get_{self.prop}"]())

    def subscribe(self, callback):
        if hasattr(self.emitter, "subscribe") and callable(self.emitter.subscribe):
            return self.emitter.subscribe(lambda _: callback(self.get()))

        i = self.emitter.connect(f"notify::{self.prop}", lambda: callback(self.get()))
        return lambda: self.emitter.disconnect(i)