Added add_event_listener and remove_event_listener

This commit is contained in:
2025-11-09 18:05:41 +01:00
parent d62b135cee
commit 0ef9523e6b
4 changed files with 594 additions and 24 deletions

View File

@@ -150,6 +150,82 @@ data.value = "final"
# Callback2: test -> final
```
#### Event listener
I can register a listener for the `ObservableEvent.AFTER_PROPERTY_CHANGE` event.
```python
from dataclasses import dataclass
from myutils.observable import make_observable, bind, add_event_listener, ObservableEvent
@dataclass
class Data:
number: int = 1
data = Data()
make_observable(data)
on_change_results = []
on_after_change_results = []
def on_change(old, new):
on_change_results.append((old, new))
return new + 1
def on_after_change(attr, old, new, results):
on_after_change_results.append((attr, old, new, results))
bind(data, 'number', on_change)
add_event_listener(ObservableEvent.AFTER_PROPERTY_CHANGE, data, "number", on_after_change)
data.number = 5
data.number = 10
assert on_change_results == [(1, 5), (5, 10)]
assert on_after_change_results == [("number", 1, 5, [6]), ("number", 5, 10, [11])]
```
I can register for all attributes change events.
```python
from myutils.observable import make_observable, bind, add_event_listener, ObservableEvent
class Data:
number: int = 1
value: str = "initial"
data = Data()
make_observable(data)
def on_change_1(old, new):
return new
def on_change_2(old, new):
return str(new) + "_1"
on_after_change_results = []
def on_after_change(attr, old, new, results):
on_after_change_results.append((attr, old, new, results))
add_event_listener(ObservableEvent.AFTER_PROPERTY_CHANGE, data, "", on_after_change)
bind(data, 'number', on_change_1)
bind(data, 'number', on_change_2)
bind(data, 'value', on_change_1)
data.number = 5
data.value = "new value"
assert on_after_change_results == [("number", 1, 5, [5, "5_1"]), ("value", "initial", "new value", ["new value"])]
```
#### Using Helper Functions
```python
@@ -319,4 +395,5 @@ Special thanks to the Python and open-source community for their tools, inspirat
* 0.1.0 : Initial release
* 0.2.0 : Observable results can be collected using `collect_return_values`
* 0.3.0 : Added `unbind`, `unbind_all`, `has_listeners` `get_listener_count` to Observable
* 0.3.0 : Added `unbind`, `unbind_all`, `has_listeners` `get_listener_count` to Observable
* 0.4.0 : Added `add_event_listener` and `remove_event_listener`