Fix bug in text box widget and multiline strings with markup
[naja.git] / naja / scenes / menu.py
index e0383b5ca3159a3d3abd63b4a0e04f56cb2c4107..327bb0b371f6222883d9370d68f4e469170fec4a 100644 (file)
@@ -4,12 +4,13 @@ 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.scenes.game import GameScene
 from naja.events import SceneChangeEvent, QuitGameEvent
 from naja.scenes.scene import Scene
 from naja.scenes.credits import CreditsScene
 from naja.scenes.game import GameScene
-from naja.scenes.load_save import SaveGameScene
+from naja.scenes.load_save import LoadGameScene, SaveGameScene
+from naja.scenes.new_game import NewGameScene
 from naja.widgets.selector import SelectorWidget
 from naja.widgets.text import TextWidget
 
 from naja.widgets.selector import SelectorWidget
 from naja.widgets.text import TextWidget
 
@@ -19,27 +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, 100), '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)
 
 
-        credits = TextWidget(
-            (100, 150), 'Credits', fontsize=32, colour='white')
-        credits.add_callback(
-            'click', lambda event: SceneChangeEvent.post(CreditsScene))
-        selector.add(credits)
+        y_offset += 50
+        new = TextWidget((100, y_offset), 'New Game', colour=PALETTE.WHITE)
+        new.add_callback('click', self.scene_callback(NewGameScene))
+        selector.add(new)
+
+        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)
 
         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: