The world is invalid (sometimes, when desirable)
[naja.git] / naja / widgets / base.py
1 import pygame
2 from naja.events import InvalidateTheWorld
3
4
5 class Widget(object):
6     def __init__(self, pos, size=None):
7         self.pos = pos
8         self.size = size or (0, 0)
9         self._prepared = False
10
11     @property
12     def rect(self):
13         return pygame.Rect(self.pos, self.size)
14
15     def render(self, surface):
16         '''Draw the widget onto surface'''
17         if not self._prepared:
18             self.prepare()
19             self._prepared = True
20         self.draw(surface)
21
22     def draw(self, surface):
23         '''The overrideable bit of widget drawing'''
24         raise NotImplemented()
25
26     def prepare(self):
27         '''Prepare the widget for drawing. This usually caches a surface.'''
28
29     def handle_event(self, ev):
30         '''Return True if the event has been handled'''
31         if InvalidateTheWorld.matches(ev):
32             # Invalidate has special handling. Widgets should never return
33             # True for for this event
34             self._prepared = False
35             return False
36         return False
37
38
39 class Container(object):
40     def __init__(self, *widgets):
41         self.widgets = []
42         for widget in widgets:
43             self.add(widget)
44
45     def add(self, widget):
46         self.widgets.append(widget)
47
48     def render(self, surface):
49         for widget in self.widgets:
50             widget.render(surface)
51
52     def handle_event(self, ev):
53         for widget in self.widgets:
54             if widget.handle_event(ev):
55                 return True
56         return False