diff pyntnclick/widgets/base.py @ 693:c8b683dd56d3 pyntnclick

Better modal message and result handling.
author Jeremy Thurgood <firxen@gmail.com>
date Tue, 14 Feb 2012 15:36:28 +0200
parents d6ded808cc33
children 58d78038a197
line wrap: on
line diff
--- a/pyntnclick/widgets/base.py	Tue Feb 14 13:39:05 2012 +0200
+++ b/pyntnclick/widgets/base.py	Tue Feb 14 15:36:28 2012 +0200
@@ -143,20 +143,27 @@
             obscure_color = gd.constants.modal_obscure_color
         self.obscure_color = convert_color(obscure_color)
 
+    @property
+    def top(self):
+        if self.children:
+            return self.children[-1]
+        return None
+
     def event(self, ev):
         """Only the topmost child gets events.
         """
-        self.mouseover_widget = self.children[-1].mouseover_widget
-        if self.children[-1].event(ev):
-            return True
+        self.mouseover_widget = self
+        if self.top:
+            self.mouseover_widget = self.top.mouseover_widget
+            if self.top.event(ev):
+                return True
 
+        # We skip Container's event() method and hop straight to its parent's.
         if super(Container, self).event(ev):
             return True
 
     def is_top(self, widget):
-        if self.children:
-            return self.children[-1] is widget
-        return False
+        return self.top is widget
 
     def draw(self, surface):
         obscure = pygame.Surface(self.rect.size, SRCALPHA)
@@ -205,3 +212,20 @@
     if isinstance(color, basestring):
         return pygame.Color(color)
     return pygame.Color(*color)
+
+
+class ModalWrapper(Container):
+    "A wrapper around a widget that removes itself when a mouse click occurs"
+
+    def __init__(self, widget, close_callback=None):
+        super(ModalWrapper, self).__init__(widget.rect, widget.gd)
+        self.close_callback = close_callback
+        self.add(widget)
+        widget.add_callback(MOUSEBUTTONDOWN, self.close)
+
+    def close(self, ev, widget):
+        if self.parent:
+            self.parent.remove(self)
+            if self.close_callback:
+                self.close_callback()
+            return True