Better menus, no default game.
[naja.git] / naja / scenes / menu.py
index 560e104449a5808bdc064cb7d823ad4b52359476..327bb0b371f6222883d9370d68f4e469170fec4a 100644 (file)
@@ -4,7 +4,7 @@ Main menu scene.
 
 import pygame.locals as pgl
 
 
 import pygame.locals as pgl
 
-from naja.constants import KEYS
+from naja.constants import KEYS, PALETTE
 from naja.events import SceneChangeEvent, QuitGameEvent
 from naja.scenes.scene import Scene
 from naja.scenes.credits import CreditsScene
 from naja.events import SceneChangeEvent, QuitGameEvent
 from naja.scenes.scene import Scene
 from naja.scenes.credits import CreditsScene
@@ -20,37 +20,47 @@ class MenuScene(Scene):
         super(MenuScene, self).__init__(state)
         selector = SelectorWidget()
         self.add(selector)
         super(MenuScene, self).__init__(state)
         selector = SelectorWidget()
         self.add(selector)
+        y_offset = 0
 
 
-        run_game = TextWidget((100, 50), 'Game', fontsize=32, colour='white')
-        run_game.add_callback(
-            'click', lambda event: SceneChangeEvent.post(GameScene))
-        selector.add(run_game)
+        y_offset += 50
+        resume = TextWidget(
+            (100, y_offset), 'Resume Game', colour=PALETTE.WHITE,
+            unselectable_colour=PALETTE.GREY)
+        resume.add_callback('click', self.scene_callback(GameScene))
+        resume.set_selectable_callback(lambda: state is not None)
+        selector.add(resume)
 
 
-        new_game = TextWidget((100, 100), 'New', fontsize=32, colour='white')
-        new_game.add_callback(
-            'click', lambda event: SceneChangeEvent.post(NewGameScene))
-        selector.add(new_game)
+        y_offset += 50
+        new = TextWidget((100, y_offset), 'New Game', colour=PALETTE.WHITE)
+        new.add_callback('click', self.scene_callback(NewGameScene))
+        selector.add(new)
 
 
-        credits = TextWidget(
-            (100, 150), 'Credits', fontsize=32, colour='white')
-        credits.add_callback(
-            'click', lambda event: SceneChangeEvent.post(CreditsScene))
-        selector.add(credits)
-
-        load = TextWidget((100, 200), 'Load', fontsize=32, colour='white')
-        load.add_callback(
-            'click', lambda event: SceneChangeEvent.post(LoadGameScene))
+        y_offset += 50
+        load = TextWidget((100, y_offset), 'Load', colour=PALETTE.WHITE)
+        load.add_callback('click', self.scene_callback(LoadGameScene))
         selector.add(load)
 
         selector.add(load)
 
-        save = TextWidget((100, 250), 'Save', fontsize=32, colour='white')
-        save.add_callback(
-            'click', lambda event: SceneChangeEvent.post(SaveGameScene))
+        y_offset += 50
+        save = TextWidget(
+            (100, y_offset), 'Save', colour=PALETTE.WHITE,
+            unselectable_colour=PALETTE.GREY)
+        save.add_callback('click', self.scene_callback(SaveGameScene))
+        save.set_selectable_callback(lambda: state is not None)
         selector.add(save)
 
         selector.add(save)
 
-        quit = TextWidget((100, 300), 'Quit', fontsize=32, colour='white')
+        y_offset += 50
+        credits = TextWidget((100, y_offset), 'Credits', colour=PALETTE.WHITE)
+        credits.add_callback('click', self.scene_callback(CreditsScene))
+        selector.add(credits)
+
+        y_offset += 50
+        quit = TextWidget((100, y_offset), 'Quit', colour=PALETTE.WHITE)
         quit.add_callback('click', lambda event: QuitGameEvent.post())
         selector.add(quit)
 
         quit.add_callback('click', lambda event: QuitGameEvent.post())
         selector.add(quit)
 
+    def scene_callback(self, scene_class):
+        return lambda event: SceneChangeEvent.post(scene_class)
+
     def handle_scene_event(self, ev):
         if ev.type == pgl.KEYDOWN:
             if ev.key in KEYS.QUIT:
     def handle_scene_event(self, ev):
         if ev.type == pgl.KEYDOWN:
             if ev.key in KEYS.QUIT: