Allow for centring text buttons and display levels centred.
[tabakrolletjie.git] / tabakrolletjie / widgets.py
index 3d12a30840b20cf49c40390a6be5707b8801342b..043c22e3680d46e4b6438be954f22c2b19c94b22 100644 (file)
@@ -6,7 +6,7 @@ import pygame.locals as pgl
 
 from .loader import loader
 from .constants import FONTS
-from .transforms import NullTransform
+from .transforms import NullTransform, Multiply
 
 
 class Button(object):
@@ -16,6 +16,13 @@ class Button(object):
         self._padding = padding
         self.position = pos
         self.name = name
+        self.enabled = True
+
+    def enable(self):
+        self.enabled = True
+
+    def disable(self):
+        self.enabled = False
 
     @property
     def position(self):
@@ -40,6 +47,8 @@ class Button(object):
         pass
 
     def pressed(self, ev):
+        if not self.enabled:
+            return False
         if self._pos is None:
             # Unplaced buttons can't be pressed
             return False
@@ -50,16 +59,34 @@ class Button(object):
         return False
 
 
+class SpacerButton(Button):
+    """ Add a nothing object which can be used to space other things,
+        but is never pressed """
+
+    def pressed(self, ev):
+        return False
+
+
 class TextButton(Button):
 
-    def __init__(self, text, colour, name=None, pos=None, padding=10):
-        font = loader.load_font(FONTS['sans'], size=24)
+    def __init__(
+            self, text, colour, name=None, pos=None, padding=10, size=24,
+            font='sans', centre=False):
+        font = loader.load_font(FONTS[font], size=size)
         self._text = font.render(text, True, colour)
+        if centre:
+            w, h = self._text.get_size()
+            pos = pos[0] - (w / 2), pos[1] - (h / 2)
+        self._disabled_text = self._text.copy()
+        Multiply(colour=(80, 80, 80)).apply(self._disabled_text)
         super(TextButton, self).__init__(self._text.get_size(), name,
                                          pos, padding)
 
     def render(self, surface):
-        surface.blit(self._text, self._pos, None)
+        if self.enabled:
+            surface.blit(self._text, self._pos, None)
+        else:
+            surface.blit(self._disabled_text, self._pos, None)
 
 
 class ImageButton(Button):
@@ -78,6 +105,7 @@ class ImageButton(Button):
     def update_image(self, *imgparts, **kwargs):
         transform = kwargs.pop("transform", NullTransform())
         self._img = loader.load_image(*imgparts, transform=transform)
-        
+        Multiply((128, 128, 128)).apply(self._disabled_img)
+
     def render(self, surface):
         surface.blit(self._img, self._pos, None)