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)
|