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
 
-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
@@ -20,37 +20,47 @@ class MenuScene(Scene):
         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)
 
-        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)
 
-        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)
 
+    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: