2 # This just unifies some logic.
3 # There is no implied container / window system (yet)
5 import pygame.locals as pgl
7 from .loader import loader
8 from .constants import FONTS
9 from .transforms import NullTransform, Multiply
14 def __init__(self, size, name=None, pos=None, padding=10):
16 self._padding = padding
32 def position(self, pos):
35 self._min_x = pos[0] - self._padding
36 self._max_x = pos[0] + self._size[0] + self._padding
37 self._min_y = pos[1] - self._padding
38 self._max_y = pos[1] + self._size[1] + self._padding
46 def render(self, surface):
49 def pressed(self, ev):
53 # Unplaced buttons can't be pressed
55 if ev.type == pgl.MOUSEBUTTONDOWN and ev.button == 1:
56 if self._min_x < ev.pos[0] < self._max_x:
57 if self._min_y < ev.pos[1] < self._max_y:
62 class SpacerButton(Button):
63 """ Add a nothing object which can be used to space other things,
64 but is never pressed """
66 def pressed(self, ev):
70 class TextButton(Button):
73 self, text, colour, name=None, pos=None, padding=10, size=24,
74 font='sans', centre=False):
75 font = loader.load_font(FONTS[font], size=size)
76 self._text = font.render(text, True, colour)
78 w, h = self._text.get_size()
79 pos = pos[0] - (w / 2), pos[1] - (h / 2)
80 self._disabled_text = self._text.copy()
81 Multiply(colour=(80, 80, 80)).apply(self._disabled_text)
82 super(TextButton, self).__init__(self._text.get_size(), name,
85 def render(self, surface):
87 surface.blit(self._text, self._pos, None)
89 surface.blit(self._disabled_text, self._pos, None)
92 class ImageButton(Button):
94 def __init__(self, *imgparts, **kwargs):
95 transform = kwargs.pop("transform", NullTransform())
96 self._img = kwargs.pop("image", None)
98 self._img = loader.load_image(*imgparts, transform=transform)
99 name = kwargs.get('name')
100 pos = kwargs.get('pos')
101 padding = kwargs.get('padding', 0)
102 super(ImageButton, self).__init__(self._img.get_size(), name,
105 def update_image(self, *imgparts, **kwargs):
106 transform = kwargs.pop("transform", NullTransform())
107 self._img = loader.load_image(*imgparts, transform=transform)
109 def render(self, surface):
110 surface.blit(self._img, self._pos, None)