[pygobject] Gdk.Event: Override __setattr__ to set fields based on the event type



commit 906977047df2fb2f394410e4ebf360b69af8dcfe
Author: Christoph Reiter <reiter christoph gmail com>
Date:   Mon Apr 14 15:40:50 2014 +0200

    Gdk.Event: Override __setattr__ to set fields based on the event type
    
    Pass the setting of attributes through to the underlying union based
    on event type. This mirrors the logic in __getattr__.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=727810

 gi/overrides/Gdk.py         |    7 +++++++
 tests/test_overrides_gdk.py |   13 ++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)
---
diff --git a/gi/overrides/Gdk.py b/gi/overrides/Gdk.py
index d1128ad..95030f8 100644
--- a/gi/overrides/Gdk.py
+++ b/gi/overrides/Gdk.py
@@ -202,6 +202,13 @@ class Event(Gdk.Event):
         else:
             raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
 
+    def __setattr__(self, name, value):
+        real_event = getattr(self, '_UNION_MEMBERS').get(self.type)
+        if real_event:
+            setattr(getattr(self, real_event), name, value)
+        else:
+            Gdk.Event.__setattr__(self, name, value)
+
     def __repr__(self):
         base_repr = Gdk.Event.__repr__(self).strip("><")
         return "<%s type=%r>" % (base_repr, self.type)
diff --git a/tests/test_overrides_gdk.py b/tests/test_overrides_gdk.py
index bc3f968..60d5ae4 100644
--- a/tests/test_overrides_gdk.py
+++ b/tests/test_overrides_gdk.py
@@ -66,14 +66,21 @@ class TestGdk(unittest.TestCase):
         self.assertEqual(event.type, Gdk.EventType.CONFIGURE)
         self.assertEqual(event.send_event, 0)
 
+        event = Gdk.Event()
+        event.type = Gdk.EventType.SCROLL
+        self.assertRaises(AttributeError, lambda: getattr(event, 'foo_bar'))
+
+    def test_event_setattr(self):
         event = Gdk.Event.new(Gdk.EventType.DRAG_MOTION)
         event.x_root, event.y_root = 0, 5
+        self.assertEqual(event.dnd.x_root, 0)
+        self.assertEqual(event.dnd.y_root, 5)
         self.assertEqual(event.x_root, 0)
         self.assertEqual(event.y_root, 5)
 
-        event = Gdk.Event()
-        event.type = Gdk.EventType.SCROLL
-        self.assertRaises(AttributeError, lambda: getattr(event, 'foo_bar'))
+        # this used to work, keep it that way
+        self.assertFalse(hasattr(event, "foo_bar"))
+        event.foo_bar = 42
 
     def test_event_repr(self):
         event = Gdk.Event.new(Gdk.EventType.CONFIGURE)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]