changeset 265:74ae1645df6e

Move hackery into list widget
author Neil Muller <drnlmuller@gmail.com>
date Thu, 15 Sep 2011 12:24:05 +0200
parents 2c9cc902928f
children 190aa1481908
files mamba/habitats/editor.py mamba/widgets/toollist.py
diffstat 2 files changed, 49 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Thu Sep 15 12:09:55 2011 +0200
+++ b/mamba/habitats/editor.py	Thu Sep 15 12:24:05 2011 +0200
@@ -9,6 +9,7 @@
 from mamba.widgets.imagebutton import ImageButtonWidget
 #from mamba.widgets.messagebox import MessageBox
 from mamba.widgets.entrybox import EntryBox
+from mamba.widgets.toollist import ToolListWidget
 from mamba.level import Level, TILE_MAP, THING_MAP
 from mamba.data import check_level_exists
 from mamba.constants import SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS
@@ -24,7 +25,6 @@
         self.container.add(self.edit_widget)
         self.container.add_callback(KEYDOWN, self.keydown_event)
         self.mode = 'Tile'
-        self.tool_page = 0
 
     def on_enter(self):
         # We need to juggle the display to the correct size
@@ -96,11 +96,8 @@
         elif self.mode == 'Thing':
             tile_map = THING_MAP
             change_mode_text = 'Switch to Tiles'
-        total_tools = len(tile_map)
-        start_page = MAX_TOOLS * self.tool_page
-        end_page = start_page + MAX_TOOLS
-        tile_map = sorted(tile_map)[start_page:end_page]
-        for tile_char in tile_map:
+        tool_list = []
+        for tile_char in sorted(tile_map):
             try:
                 tile = self.level.tileset[tile_char]
             except pygame.error:
@@ -112,32 +109,16 @@
                 text = tile.name
             else:
                 text = 'Tile'
-            tile_button = ImageButtonWidget(
-                    (button_left, button_height), tile.image,
-                    text, color='white')
+            tile_button = ImageButtonWidget((0, 0), tile.image, text,
+                    color='white')
             tile_button.add_callback('clicked', self.change_tool,
                     tile_char, text)
-            self.container.add(tile_button)
-            button_height += \
-                    tile_button.surface.get_height() + button_padding
-        button_height += 2
+            tool_list.append(tile_button)
+        tool_widget = ToolListWidget((button_left, button_height),
+                tool_list, MAX_TOOLS)
+        self.container.add(tool_widget)
+        button_height += tool_widget.rect.height + 2
 
-        prev_page = None
-        next_page = None
-        if start_page > 0:
-            prev_page = TextButton((button_left, button_height),
-                    'Prev')
-            prev_page.add_callback('clicked', self.change_page, -1)
-            self.container.add(prev_page)
-        if end_page < total_tools:
-            next_page = TextButton((button_left + 100, button_height),
-                    'Next')
-            next_page.add_callback('clicked', self.change_page, +1)
-            self.container.add(next_page)
-        if prev_page:
-            button_height += prev_page.rect.height
-        elif next_page:
-            button_height += next_page.rect.height
         mode_button = TextButton((button_left, button_height),
                 change_mode_text)
         mode_button.add_callback('clicked', self.change_toolbar)
@@ -162,12 +143,6 @@
             self.mode = 'Thing'
         elif self.mode == 'Thing':
             self.mode = 'Tile'
-        self.tool_page = 0
-        self.clear_toolbar()
-        self.setup_toolbar()
-
-    def change_page(self, ev, widget, change):
-        self.tool_page += change
         self.clear_toolbar()
         self.setup_toolbar()
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mamba/widgets/toollist.py	Thu Sep 15 12:24:05 2011 +0200
@@ -0,0 +1,39 @@
+from mamba.widgets.base import Container
+from mamba.widgets.text import TextButton
+
+
+class ToolListWidget(Container):
+    """List of other widgets, with some paging trickery"""
+
+    def __init__(self, rect, widget_list, page_length, padding=2):
+        self.widget_list = widget_list
+        self.page_length = page_length
+        self.padding = padding
+        self.page = 0
+        super(ToolListWidget, self).__init__(rect)
+        self.fill_page()
+
+    def fill_page(self):
+        start_page = self.page * self.page_length
+        end_page = start_page + self.page_length
+        button_height = self.rect.top + self.padding
+        button_left = self.rect.left + self.padding
+        for widget in self.widget_list[start_page:end_page]:
+            widget.rect.topleft = (button_left, button_height)
+            self.add(widget)
+            button_height += widget.rect.height + self.padding
+        if start_page > 0:
+            prev_but = TextButton((button_left, button_height), 'Prev')
+            prev_but.add_callback('clicked', self.change_page, -1)
+            self.add(prev_but)
+        if end_page < len(self.widget_list):
+            next_but = TextButton((button_left + 100, button_height), 'Next')
+            next_but.add_callback('clicked', self.change_page, 1)
+            self.add(next_but)
+
+    def change_page(self, ev, widget, change):
+        self.page += change
+        for widget in self.children[:]:
+            self.remove(widget)
+        self.fill_page()
+        return True