Add name to buttons to simplify logic
[tabakrolletjie.git] / tabakrolletjie / widgets.py
1 # Simple widgets
2 # This just unifies some logic.
3 # There is no implied container / window system (yet)
4
5 import pygame.locals as pgl
6
7 from .loader import loader
8 from .constants import FONTS
9
10
11 class Button(object):
12
13     def __init__(self, size, name=None, pos=None, padding=10):
14         self._size = size
15         self._padding = padding
16         self.position = pos
17         self.name = name
18
19     @property
20     def position(self):
21         return self._pos
22
23     @position.setter
24     def position(self, pos):
25         self._pos = pos
26         if pos is not None:
27             self._min_x = pos[0] - self._padding
28             self._max_x = pos[0] + self._size[0] + self._padding
29             self._min_y = pos[1] - self._padding
30             self._max_y = pos[1] + self._size[1] + self._padding
31
32     def get_width(self):
33         return self._size[0]
34
35     def get_height(self):
36         return self._size[1]
37
38     def render(self, surface):
39         pass
40
41     def pressed(self, ev):
42         if self._pos is None:
43             # Unplaced buttons can't be pressed
44             return False
45         if ev.type == pgl.MOUSEBUTTONDOWN and ev.button == 1:
46             if self._min_x < ev.pos[0] < self._max_x:
47                 if self._min_y < ev.pos[1] < self._max_y:
48                     return True
49         return False
50
51
52 class TextButton(Button):
53
54     def __init__(self, text, colour, name=None, pos=None, padding=10):
55         font = loader.load_font(FONTS['sans'], size=24)
56         self._text = font.render(text, True, colour)
57         super(TextButton, self).__init__(self._text.get_size(), name,
58                                          pos, padding)
59
60     def render(self, surface):
61         surface.blit(self._text, self._pos, None)
62
63
64 class ImageButton(Button):
65
66     def __init__(self, *imgparts, **kwargs):
67         self._img = loader.load_image(*imgparts)
68         name = kwargs.get('name')
69         pos = kwargs.get('pos')
70         padding = kwargs.get('padding', 0)
71         super(ImageButton, self).__init__(self._img.get_size(), name,
72                                           pos, padding)
73
74     def render(self, surface):
75         surface.blit(self._img, self._pos, None)