changeset 408:98ccef2a1a3c

Level loading refactorage.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 17 Sep 2011 14:33:50 +0200
parents c81d5551cb17
children 7f6a28456fda
files mamba/__main__.py mamba/engine.py mamba/habitats/levelmenu.py mamba/habitats/mainmenu.py
diffstat 4 files changed, 69 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/__main__.py	Sat Sep 17 14:28:39 2011 +0200
+++ b/mamba/__main__.py	Sat Sep 17 14:33:50 2011 +0200
@@ -10,7 +10,7 @@
 from mamba.gamestate import load_state
 from mamba.sound import SoundSystem
 from mamba.habitats.mainmenu import MainMenu
-from mamba.habitats.levelmenu import LevelMenu
+from mamba.habitats.levelmenu import OfficialLevelMenu
 from mamba.habitats.userlevelmenu import UserLevelApi
 from mamba.habitats.level import LevelHabitat
 from mamba.habitats.editor import EditorHabitat
@@ -40,7 +40,7 @@
         start = EditorHabitat(Level(options.level, 'official'))
     elif options.level is not None:
         start = LevelHabitat(Level(options.level, 'official'),
-                             LevelMenu.go_menu)
+                             OfficialLevelMenu.go_menu)
     elif options.uncurated is not None:
         api = UserLevelApi("uncurated")
         start = LevelHabitat(api.get_level(options.uncurated),
--- a/mamba/engine.py	Sat Sep 17 14:28:39 2011 +0200
+++ b/mamba/engine.py	Sat Sep 17 14:33:50 2011 +0200
@@ -124,3 +124,12 @@
     @classmethod
     def post(cls):
         super(FlipArrowsEvent, cls).post()
+
+
+class HabitatSetupEvent(UserEvent):
+
+    TYPE = "SETUP_HABITAT"
+
+    @classmethod
+    def post(cls):
+        super(HabitatSetupEvent, cls).post()
--- a/mamba/habitats/levelmenu.py	Sat Sep 17 14:28:39 2011 +0200
+++ b/mamba/habitats/levelmenu.py	Sat Sep 17 14:33:50 2011 +0200
@@ -3,7 +3,7 @@
 from pygame.locals import KEYDOWN
 
 from mamba.constants import ESCAPE_KEYS
-from mamba.engine import Habitat, NewHabitatEvent
+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
@@ -11,37 +11,50 @@
 from mamba.widgets.levelbutton import LevelButton
 
 
+OFFICIAL_LEVELS = []
+
+
 class LevelMenu(Habitat):
 
-    level_namespace = 'official'
+    WIDTH = 5
 
     def __init__(self):
+        print "init"
         super(LevelMenu, self).__init__()
         self.level_buttons = {}
-        WIDTH = 5
-        container = GridContainer(width=WIDTH)
-        self.container.add(container)
+        self.container.add(GridContainer(width=self.WIDTH))
+        self.container.add_callback(KEYDOWN, self.keydown_event)
+
+    def on_enter(self):
+        print "enter"
+        super(LevelMenu, self).on_enter()
+        self.setup_levels()
+
+    def dispatch(self, ev):
+        if HabitatSetupEvent.matches(ev):
+            self.setup_levels(ev)
+            return
+        super(LevelMenu, self).dispatch(ev)
+
+    def setup_level(self, i, name):
+        level = self.get_level(name)
+        button = LevelButton((20 + 120 * (i % self.WIDTH),
+                              20 + 120 * (i // self.WIDTH)),
+                             level)
+        button.add_callback('clicked', self.level_selected, name)
+        button.done = level.unique_name() in done_levels
+        self.container.add(button)
+        self.level_buttons[name] = button
+
+    def setup_levels(self, ev=None):
         for i, name in enumerate(self.list_levels()):
-            level = self.get_level(name)
-            button = LevelButton((20 + 120 * (i % WIDTH),
-                                  20 + 120 * (i // WIDTH)),
-                                 level)
-            button.add_callback('clicked', self.level_selected, name)
-            container.add(button)
-            self.level_buttons[name] = button
-
-        self.container.add_callback(KEYDOWN, self.keydown_event)
-        self.update_buttons()
+            self.setup_level(i, name)
 
     def list_levels(self):
-        return get_official_levels()
+        raise NotImplementedError()
 
     def get_level(self, name):
-        return Level(name, self.level_namespace)
-
-    def update_buttons(self):
-        for button in self.level_buttons.itervalues():
-            button.done = button.level.unique_name() in done_levels
+        raise NotImplementedError()
 
     def level_selected(self, ev, widget, name):
         from mamba.habitats.level import LevelHabitat
@@ -60,3 +73,25 @@
         from mamba.habitats.mainmenu import MainMenu
         NewHabitatEvent.post(MainMenu())
         return True
+
+
+class OfficialLevelMenu(LevelMenu):
+
+    level_namespace = 'official'
+
+    def setup_levels(self, ev=None):
+        if ev is not None:
+            self._setup_levels()
+        else:
+            HabitatSetupEvent.post()
+
+    def _setup_levels(self):
+        super(OfficialLevelMenu, self).setup_levels()
+
+    def list_levels(self):
+        if not OFFICIAL_LEVELS:
+            OFFICIAL_LEVELS.extend(get_official_levels())
+        return OFFICIAL_LEVELS[:]
+
+    def get_level(self, name):
+        return Level(name, self.level_namespace)
--- a/mamba/habitats/mainmenu.py	Sat Sep 17 14:28:39 2011 +0200
+++ b/mamba/habitats/mainmenu.py	Sat Sep 17 14:33:50 2011 +0200
@@ -36,8 +36,8 @@
         return button
 
     def start_event(self, ev, widget):
-        from mamba.habitats.levelmenu import LevelMenu
-        NewHabitatEvent.post(LevelMenu())
+        from mamba.habitats.levelmenu import OfficialLevelMenu
+        NewHabitatEvent.post(OfficialLevelMenu())
         return True
 
     def userlevels_event(self, ev, widget):