Mercurial > boomslang
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