# HG changeset patch # User Stefano Rivera # Date 1316282578 -7200 # Node ID 72f21094557656c8e5bc947cbf014f6c56e76264 # Parent 93ba8c966cb959ba07914e1462058f3fb2898fbc Paging in level menu diff -r 93ba8c966cb9 -r 72f210945576 mamba/habitats/levelmenu.py --- a/mamba/habitats/levelmenu.py Sat Sep 17 20:02:49 2011 +0200 +++ b/mamba/habitats/levelmenu.py Sat Sep 17 20:02:58 2011 +0200 @@ -1,12 +1,13 @@ """Level menu.""" -from pygame.locals import KEYDOWN +from pygame.locals import KEYDOWN, K_PAGEUP, K_PAGEDOWN from mamba.constants import ESCAPE_KEYS from mamba.engine import Habitat, NewHabitatEvent, HabitatSetupEvent from mamba.gamestate import done_levels from mamba.data import get_official_levels from mamba.level import Level +from mamba.widgets.text import TextButton from mamba.widgets.base import GridContainer from mamba.widgets.levelbutton import LevelButton @@ -17,13 +18,25 @@ class LevelMenu(Habitat): - WIDTH = 5 + WIDTH = 6 + HEIGHT = 4 def __init__(self): super(LevelMenu, self).__init__() self.level_buttons = {} + self.page = 0 + self.grid_container = GridContainer(width=self.WIDTH) self.container.add(self.grid_container) + + self.prev_button = TextButton((50, 550), "<-") + self.prev_button.add_callback('clicked', self.change_page, -1) + self.container.add(self.prev_button) + + self.next_button = TextButton((700, 550), "->") + self.next_button.add_callback('clicked', self.change_page, 1) + self.container.add(self.next_button) + self.container.add_callback(KEYDOWN, self.keydown_event) def on_enter(self): @@ -39,15 +52,13 @@ def _setup_levels(self, ev=None): if ev is not None: self.setup_levels() - # We now have widgets, let's give them focus - self.container.adjust_focus(1) else: HabitatSetupEvent.post() def setup_level(self, i, name): level = self.get_level(name) - button = LevelButton((20 + 120 * (i % self.WIDTH), - 20 + 120 * (i // self.WIDTH)), + button = LevelButton((50 + 120 * (i % self.WIDTH), + 50 + 120 * (i // self.WIDTH)), level) button.add_callback('clicked', self.level_selected, name) button.done = level.unique_name() in done_levels @@ -55,9 +66,34 @@ self.level_buttons[name] = button def setup_levels(self): - for i, name in enumerate(self.list_levels()): + del self.grid_container.children[:] + levels = list(self.list_levels()) + if self.page * self.WIDTH * self.HEIGHT > len(levels): + self.page = len(levels) // self.WIDTH // self.HEIGHT + elif self.page < 0: + self.page = 0 + first = self.page * self.WIDTH * self.HEIGHT + last = first + (self.WIDTH * self.HEIGHT) + for i, name in enumerate(levels[first:last]): self.setup_level(i, name) + if self.page == 0: + self.prev_button.disable() + else: + self.prev_button.enable() + if len(levels) <= last: + self.next_button.disable() + else: + self.next_button.enable() + self.container.defocus() + # We now have widgets, let's give them focus + self.container.adjust_focus(1) + + def change_page(self, ev, widget, direction): + self.page += direction + self.setup_levels() + return True + def list_levels(self): raise NotImplementedError() @@ -81,6 +117,10 @@ def keydown_event(self, ev, widget): if ev.key in ESCAPE_KEYS: return self.return_to_mainmenu(ev, widget) + if ev.key == K_PAGEUP: + return self.change_page(ev, widget, -1) + if ev.key == K_PAGEDOWN: + return self.change_page(ev, widget, 1) def return_to_mainmenu(self, ev, widget): from mamba.habitats.mainmenu import MainMenu