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):
72 def __init__(self, text, colour, name=None, pos=None, padding=10):
73 font = loader.load_font(FONTS['sans'], size=24)
74 self._text = font.render(text, True, colour)
75 self._disabled_text = self._text.copy()
76 Multiply(colour=(80, 80, 80)).apply(self._disabled_text)
77 super(TextButton, self).__init__(self._text.get_size(), name,
80 def render(self, surface):
82 surface.blit(self._text, self._pos, None)
84 surface.blit(self._disabled_text, self._pos, None)
87 class ImageButton(Button):
89 def __init__(self, *imgparts, **kwargs):
90 transform = kwargs.pop("transform", NullTransform())
91 self._img = kwargs.pop("image", None)
93 self._img = loader.load_image(*imgparts, transform=transform)
94 name = kwargs.get('name')
95 pos = kwargs.get('pos')
96 padding = kwargs.get('padding', 0)
97 super(ImageButton, self).__init__(self._img.get_size(), name,
100 def update_image(self, *imgparts, **kwargs):
101 transform = kwargs.pop("transform", NullTransform())
102 self._img = loader.load_image(*imgparts, transform=transform)
103 Multiply((128, 128, 128)).apply(self._disabled_img)
105 def render(self, surface):
106 surface.blit(self._img, self._pos, None)