diff options
author | Aylur <[email protected]> | 2024-05-19 02:39:53 +0200 |
---|---|---|
committer | Aylur <[email protected]> | 2024-05-19 02:39:53 +0200 |
commit | 1425b396b08f0e91d45bbd0f92b1309115c7c870 (patch) | |
tree | 8af1a899a14d8a01a9ef50e248c077b48aed25bc /python/astal/binding.py |
init 0.1.0
Diffstat (limited to 'python/astal/binding.py')
-rw-r--r-- | python/astal/binding.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/python/astal/binding.py b/python/astal/binding.py new file mode 100644 index 0000000..0fe1b6c --- /dev/null +++ b/python/astal/binding.py @@ -0,0 +1,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) |