changeset 479:3f37e011c3b6

Neater buttons
author Neil Muller <drnlmuller@gmail.com>
date Sat, 17 Sep 2011 22:12:16 +0200
parents ce3a50c4caaa
children 90a59251c93b
files mamba/habitats/editor.py mamba/widgets/imagebutton.py mamba/widgets/text.py mamba/widgets/toollist.py
diffstat 4 files changed, 70 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Sat Sep 17 22:10:01 2011 +0200
+++ b/mamba/habitats/editor.py	Sat Sep 17 22:12:16 2011 +0200
@@ -28,6 +28,7 @@
 class EditorHabitat(Habitat):
     def __init__(self, level):
         super(EditorHabitat, self).__init__(EDIT_SCREEN)
+        self.toolbar = {}
         self.level = level
         self.container.paused = False
         self.edit_widget = EditLevelWidget(self.level)
@@ -130,38 +131,43 @@
             self.edit_widget.set_tool('.')
             button_height += (self.floor_button.surface.get_height()
                     + button_padding)
-        if self.mode == 'Tiles':
-            tile_map = TILE_MAP
-        elif self.mode == 'Things':
-            tile_map = THING_MAP
+        if self.mode in self.toolbar:
+            # FIXME: This needs to be recreated on tileset changes
+            self.tool_widget = self.toolbar[self.mode]
         else:
-            tile_map = []
-        tool_list = []
-        for tile_char in sorted(tile_map):
-            try:
-                tile = self.level.tileset[tile_char]
-            except pygame.error:
-                # Ignore stuff we can't load for now
-                continue
-            if tile is None:
-                continue
-            if tile.name:
-                text = tile.name
+            if self.mode == 'Tiles':
+                tile_map = TILE_MAP
+            elif self.mode == 'Things':
+                tile_map = THING_MAP
             else:
-                text = 'Tile'
-            tile_button = ImageButtonWidget((0, 0), tile.image, text,
-                    color='white')
-            tile_button.add_callback('clicked', self.change_tool,
-                    tile_char, text)
-            tool_list.append(tile_button)
-        if self.mode == "Sprites":
-            for name in ['Add', 'Edit', 'Delete']:
-                tile_button = TextButton((0, 0), '%s Sprite' % name)
-                tile_button.add_callback('clicked', self.sprite_tool,
-                        name)
+                tile_map = []
+            tool_list = []
+            for tile_char in sorted(tile_map):
+                try:
+                    tile = self.level.tileset[tile_char]
+                except pygame.error:
+                    # Ignore stuff we can't load for now
+                    continue
+                if tile is None:
+                    continue
+                if tile.name:
+                    text = tile.name
+                else:
+                    text = 'Tile'
+                tile_button = ImageButtonWidget((0, 0), tile.image, text,
+                        color='white')
+                tile_button.add_callback('clicked', self.change_tool,
+                        tile_char, text)
                 tool_list.append(tile_button)
-        self.tool_widget = ToolListWidget((button_left, button_height),
-                tool_list, MAX_TOOLS, start_key=K_2)
+            if self.mode == "Sprites":
+                for name in ['Add', 'Edit', 'Delete']:
+                    tile_button = TextButton((0, 0), '%s Sprite' % name)
+                    tile_button.add_callback('clicked', self.sprite_tool,
+                            name)
+                    tool_list.append(tile_button)
+            self.tool_widget = ToolListWidget((button_left, button_height),
+                    tool_list, MAX_TOOLS, start_key=K_2)
+            self.toolbar[self.mode] = self.tool_widget
         self.container.add(self.tool_widget)
         button_height = self.container.rect.top + MODE_HEIGHT
         if self.mode == 'Tiles':
--- a/mamba/widgets/imagebutton.py	Sat Sep 17 22:10:01 2011 +0200
+++ b/mamba/widgets/imagebutton.py	Sat Sep 17 22:12:16 2011 +0200
@@ -24,10 +24,12 @@
         self._focussed = self.focussed
         color = self.focus_color if self.focussed else self.color
 
-        self.rect.width = text_surface.get_width() + self.image.get_width() \
-                + 5 + self.padding * 2
-        self.rect.height = max(text_surface.get_height(),
+        width = (text_surface.get_width() + self.image.get_width()
+                + 5 + self.padding * 2)
+        height = max(text_surface.get_height(),
                 self.image.get_height()) + self.padding * 2
+        self.rect.width = max(self.rect.width, width)
+        self.rect.height = max(self.rect.height, height)
         self.surface = pygame.Surface(self.rect.size, SRCALPHA)
         self.surface.fill(0)
         self.surface.blit(self.image, (self.padding, self.padding))
--- a/mamba/widgets/text.py	Sat Sep 17 22:10:01 2011 +0200
+++ b/mamba/widgets/text.py	Sat Sep 17 22:12:16 2011 +0200
@@ -29,7 +29,9 @@
         if not isinstance(self.color, pygame.Color):
             self.color = pygame.Color(self.color)
         self.surface = self.font.render(self.text, True, self.color)
-        self.rect.width, self.rect.height = self.surface.get_rect().size
+        width, height = self.surface.get_rect().size
+        self.rect.width = max(self.rect.width, width)
+        self.rect.height = max(self.rect.height, height)
 
     def draw(self, surface):
         surface.blit(self.surface, self.rect)
@@ -57,8 +59,10 @@
         else:
             color = self.color
 
-        self.rect.width = text_rect.width + self.padding * 2
-        self.rect.height = text_rect.height + self.padding * 2
+        width = text_rect.width + self.padding * 2
+        height = text_rect.height + self.padding * 2
+        self.rect.width = max(self.rect.width, width)
+        self.rect.height = max(self.rect.height, height)
         self.surface = pygame.Surface(self.rect.size, SRCALPHA)
         self.surface.fill(0)
         self.surface.blit(text, text.get_rect().move(self.padding,
--- a/mamba/widgets/toollist.py	Sat Sep 17 22:10:01 2011 +0200
+++ b/mamba/widgets/toollist.py	Sat Sep 17 22:12:16 2011 +0200
@@ -15,6 +15,8 @@
         self.page = 0
         self.start_key = start_key
         super(ToolListWidget, self).__init__(rect)
+        self.prev_but = None
+        self.next_but = None
         self.fill_page()
         # We do this to avoid needing to worry about focus too much
         self.add_callback(KEYUP, self.handle_key)
@@ -24,7 +26,6 @@
         for widget in self.children[:]:
             self.remove(widget)
         self.hot_keys = {}
-        self.prev_but = self.next_but = None
         start_page = self.page * self.page_length
         end_page = start_page + self.page_length
         button_height = self.rect.top + self.padding
@@ -37,15 +38,32 @@
                 self.hot_keys[key] = widget
                 key += 1
             button_height += widget.rect.height + self.padding
-        if start_page > 0:
+        if not self.prev_but:
             self.prev_but = TextButton((button_left, button_height), 'Prev')
             self.prev_but.add_callback('clicked', self.change_page, -1)
-            self.add(self.prev_but)
-        if end_page < len(self.widget_list):
+        else:
+            self.prev_but.rect.top = max(button_height, self.prev_but.rect.top)
+        if not self.next_but:
             self.next_but = TextButton((button_left + 100, button_height),
                     'Next')
             self.next_but.add_callback('clicked', self.change_page, 1)
-            self.add(self.next_but)
+        else:
+            self.next_but.rect.top = max(button_height, self.next_but.rect.top)
+        if start_page > 0:
+            self.prev_but.enable()
+        else:
+            self.prev_but.disable()
+        if end_page < len(self.widget_list):
+            self.next_but.enable()
+        else:
+            self.next_but.disable()
+        self.add(self.prev_but)
+        self.add(self.next_but)
+        for widget in self.children[:]:
+            if widget in self.widget_list:
+                # Standardise widdths
+                widget.rect.width = self.rect.width - 2
+                widget.prepare()
 
     def handle_key(self, ev, widget):
         if hasattr(self.parent, 'paused') and self.parent.paused: