From 32584313b0adb20210d6fabf3bafbe82ce1bb235 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Hamal=20Dvo=C5=99=C3=A1k?= <mordae@anilinux.org>
Date: Fri, 14 Mar 2025 19:51:49 +0100
Subject: [PATCH] Add GObject reactive utility

---
 .../{reactive.py => reactive/__init__.py}     |  0
 lazy_player/reactive/gobject.py               | 27 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 rename lazy_player/{reactive.py => reactive/__init__.py} (100%)
 create mode 100644 lazy_player/reactive/gobject.py

diff --git a/lazy_player/reactive.py b/lazy_player/reactive/__init__.py
similarity index 100%
rename from lazy_player/reactive.py
rename to lazy_player/reactive/__init__.py
diff --git a/lazy_player/reactive/gobject.py b/lazy_player/reactive/gobject.py
new file mode 100644
index 0000000..0e245fe
--- /dev/null
+++ b/lazy_player/reactive/gobject.py
@@ -0,0 +1,27 @@
+from __future__ import annotations
+
+from typing import Any, TypeVar
+
+from gi.repository import GObject
+
+from . import Ref
+
+__all__ = ["GRef"]
+
+T = TypeVar("T")
+
+
+class GRef(Ref[T]):
+    _prop_name: str
+    _gobject: GObject.Object
+
+    def __init__(self, gobj: GObject.Object, prop_name: str):
+        super().__init__(gobj.get_property(prop_name))
+        self._prop_name = prop_name
+        gobj.connect(f"notify::{prop_name}", self._on_notify)
+
+    def _on_notify(self, *args: Any):
+        self.value = self._gobject.get_property(self._prop_name)
+
+    def __repr__(self):
+        return f"GRef(gobj={self._gobject!r}, prop_name={self._prop_name!r})"