# HG changeset patch # User Neil Muller # Date 1316082245 -7200 # Node ID 74ae1645df6e78691751aa4403e63f41b4f11722 # Parent 2c9cc902928fdf45ae7a981ece1c2e8c8f3e1d63 Move hackery into list widget diff -r 2c9cc902928f -r 74ae1645df6e mamba/habitats/editor.py --- 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() diff -r 2c9cc902928f -r 74ae1645df6e mamba/widgets/toollist.py --- /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