Skip to content

Commit 85841a1

Browse files
committed
Add (minimal) signal support to classes
1 parent 3473a44 commit 85841a1

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

scripts/generate_tmpl.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"Dictionary",
7474
"PackedStringArray",
7575
"Callable",
76+
"Signal",
7677
}
7778

7879

src/godot/classes.pyx.j2

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,23 +219,30 @@ cdef object _load_class(str name):
219219
attrs.pop("free", None)
220220

221221
def _generate_property(spec):
222-
propname = spec["name"]
222+
prop_name = spec["name"]
223+
prop_name_py = str(prop_name)
223224
@property
224225
def _property(self):
225-
return _property_getter(self, propname)
226+
return _property_getter(self, prop_name)
226227
@_property.setter
227228
def _property(self, value):
228-
_property_setter(self, propname, value)
229-
_property.fget.__name__ = str(spec["name"])
230-
_property.fset.__name__ = str(spec["name"])
229+
_property_setter(self, prop_name, value)
230+
_property.fget.__name__ = prop_name_py
231+
_property.fset.__name__ = prop_name_py
231232
return _property
232233

233234
properties = _object_call(classdb, "class_get_property_list", [gdname])
234235
for prop in properties:
235236
attrs[str(prop["name"])] = _generate_property(prop)
236237

237238
signals = _object_call(classdb, "class_get_signal_list", [gdname])
238-
# TODO
239+
for signal in signals:
240+
signal_name = signal["name"]
241+
signal_name_py = str(signal_name)
242+
@property
243+
def _signal(self):
244+
return Signal(self, signal_name)
245+
attrs[signal_name_py] = _signal
239246

240247
constants = _object_call(classdb, "class_get_integer_constant_list", [gdname, True])
241248
for constant_name in constants:

tests/4-use-godot-from-python/tests/test_classes.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,22 @@ def test_property(kind: str):
202202
clodotest.skip("TODO")
203203

204204

205+
@clodotest.xfail(reason="TODO: Signal constructor from object + signal name is not implemented")
205206
def test_signal():
206-
clodotest.skip("TODO")
207+
from godot.classes import Node
208+
209+
node = Node.new()
210+
node2 = Node.new()
211+
try:
212+
assert_isinstance(node.ready, godot.Signal)
213+
assert_eq(node.ready, node.ready)
214+
assert_ne(node.ready, node.replacing_by)
215+
216+
# TODO: Connect a callable and emit the signal
217+
218+
finally:
219+
node2.free()
220+
node.free()
207221

208222

209223
def test_constant():

0 commit comments

Comments
 (0)