summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Felder <jfelder@src.gnome.org>2020-11-21 17:43:25 +0100
committerJean Felder <jfelder@src.gnome.org>2020-11-21 18:04:00 +0100
commit0453702ff4e3001aae89594243b746258782b2d5 (patch)
tree2e6b3575fc27baa2fba81b3b96022066409473d8
parentd1221d0a98703db57db3659b2534b4dafdcef0ae (diff)
downloadpygobject-0453702ff4e3001aae89594243b746258782b2d5.tar.gz
gtk overrides: Make GTK4 widgets iterable
GTK4 removed the Gtk.Container interface, and added API on Gtk.Widget to iterate over children instead. Making Widgets iterable allows to easily loop over the children and check is a widget is a child of an other one. A new test is also added.
-rw-r--r--gi/overrides/Gtk.py10
-rw-r--r--tests/test_overrides_gtk.py31
2 files changed, 41 insertions, 0 deletions
diff --git a/gi/overrides/Gtk.py b/gi/overrides/Gtk.py
index 5b810b60..721e5317 100644
--- a/gi/overrides/Gtk.py
+++ b/gi/overrides/Gtk.py
@@ -135,6 +135,16 @@ class Widget(Gtk.Widget):
translate_coordinates = strip_boolean_result(Gtk.Widget.translate_coordinates)
+ if GTK4:
+ def __contains__(self, child):
+ return child in list(self)
+
+ def __iter__(self):
+ child = self.get_first_child()
+ while child:
+ yield child
+ child = child.get_next_sibling()
+
if GTK2 or GTK3:
def freeze_child_notify(self):
super(Widget, self).freeze_child_notify()
diff --git a/tests/test_overrides_gtk.py b/tests/test_overrides_gtk.py
index 61cff2cb..6337d7c4 100644
--- a/tests/test_overrides_gtk.py
+++ b/tests/test_overrides_gtk.py
@@ -902,6 +902,37 @@ class TestGtk(unittest.TestCase):
pixbuf = button.render_icon(Gtk.STOCK_OK, Gtk.IconSize.BUTTON)
self.assertTrue(pixbuf is not None)
+ @unittest.skipUnless(
+ Gtk_version == "4.0", "GtkWidget prior to gtk4 is not iterable")
+ def test_widget_iterable(self):
+ widget = Gtk.Box()
+
+ children = [child for child in widget]
+ self.assertEqual(len(children), 0)
+
+ nr_children = 7
+ for i in range(nr_children):
+ widget.append(Gtk.Label())
+
+ children = [child for child in widget]
+ self.assertEqual(len(children), nr_children)
+
+ first_child = children[0]
+ last_child = children[-1]
+ self.assertEqual(first_child, widget.get_first_child())
+ self.assertEqual(last_child, widget.get_last_child())
+
+ self.assertTrue(first_child in widget)
+ self.assertTrue(last_child in widget)
+
+ widget.remove(first_child)
+ self.assertTrue(first_child not in widget)
+ self.assertTrue(last_child in widget)
+
+ widget.remove(last_child)
+ self.assertTrue(first_child not in widget)
+ self.assertTrue(last_child not in widget)
+
@unittest.skipUnless(Gtk, 'Gtk not available')
class TestWidget(unittest.TestCase):