changeset 441:72f210945576

Paging in level menu
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 17 Sep 2011 20:02:58 +0200
parents 93ba8c966cb9
children 54803d6cac57
files mamba/habitats/levelmenu.py
diffstat 1 files changed, 47 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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