+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):
# 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):
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