34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
import gi
|
|
|
|
gi.require_version("GObject", "2.0")
|
|
|
|
from gi.repository import GObject
|
|
|
|
# from variable import Variable
|
|
|
|
class Binding(GObject.Object):
|
|
def __init__(self, emitter: GObject.GObject, property: str | None = None, transform_fn = lambda x: x):
|
|
self.emitter = emitter
|
|
self.property = property
|
|
self.transform_fn = transform_fn
|
|
|
|
def get(self):
|
|
return self.transform_fn(self.emitter.get_property(self.property) if self.property else self.emitter.get())
|
|
|
|
def transform(self, fn):
|
|
return Binding(self.emitter, self.property, lambda x: fn(self.transform_fn(x)))
|
|
|
|
def subscribe(self, callback):
|
|
id = self.emitter.connect(
|
|
f'notify::{self.property}' if self.property else 'changed',
|
|
lambda gobject, _=None: callback(self.transform_fn(self.emitter.get_property(self.property) if self.property else self.emitter.get()))
|
|
)
|
|
|
|
def unsubscribe(_=None):
|
|
self.emitter.disconnect(id)
|
|
|
|
return unsubscribe
|
|
|
|
def bind(*args, **kwargs):
|
|
return Binding(*args, **kwargs)
|