X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fwidgets%2Fbase.py;h=815d1d3a3f1cf23fedcc776ff980b5d4b727b051;hb=19e7cc079734bf556fcc8cf2a02945a4dd2f7367;hp=133cc532c2ae8fb0886117255decbba65f1e374c;hpb=d9ded620200ed74517f17f83f01313470ffca222;p=naja.git diff --git a/naja/widgets/base.py b/naja/widgets/base.py index 133cc53..815d1d3 100644 --- a/naja/widgets/base.py +++ b/naja/widgets/base.py @@ -1,12 +1,19 @@ +from collections import defaultdict + import pygame -from naja.events import InvalidateTheWorld +from pygame import locals as pgl + +from naja.events import InvalidateTheWorld, SelectEvent class Widget(object): + _is_selectable_func = None + def __init__(self, pos, size=None): self.pos = pos self.size = size or (0, 0) self._prepared = False + self.callbacks = defaultdict(list) @property def rect(self): @@ -33,8 +40,28 @@ class Widget(object): # True for for this event self._prepared = False return False + if SelectEvent.matches(ev) or ev.type == pgl.MOUSEBUTTONDOWN: + return self.callback('click') return False + def add_callback(self, event, callback): + self.callbacks[event].append(callback) + + def callback(self, event): + for callback in self.callbacks[event]: + callback(event) + return bool(self.callbacks[event]) + + def set_selectable_callback(self, func): + self._is_selectable_func = func + + def is_selectable(self): + """Return False if this widget isn't selectable by SelectorWidget.""" + if self._is_selectable_func is not None: + return self._is_selectable_func() + else: + return True + class Container(object): def __init__(self, *widgets): @@ -50,7 +77,16 @@ class Container(object): widget.render(surface) def handle_event(self, ev): - for widget in self.widgets: - if widget.handle_event(ev): - return True + if hasattr(ev, 'pos'): + for widget in self.widgets: + if isinstance(widget, Container): + if widget.handle_event(ev): + return True + elif widget.rect.collidepoint(ev.pos): + if widget.handle_event(ev): + return True + else: + for widget in self.widgets: + if widget.handle_event(ev): + return True return False