changeset 109:982f34d0aac0

Add optional data to identify TextChoice options
author Stefano Rivera <stefano@rivera.za.net>
date Mon, 04 Apr 2011 21:30:39 +0200
parents 5037bf06d7cd
children f64c38c5512d
files skaapsteker/menuscene.py skaapsteker/widgets/text.py
diffstat 2 files changed, 21 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/menuscene.py	Mon Apr 04 21:31:53 2011 +0200
+++ b/skaapsteker/menuscene.py	Mon Apr 04 21:30:39 2011 +0200
@@ -17,7 +17,7 @@
         self.choice.callbacks.append(self.selected)
         self.widgets.append(self.choice)
 
-    def selected(self, option):
+    def selected(self, option, data):
         "Callback from menu TextChoice"
         if option == 0:
             ChangeScene.post(LevelScene('level1'))
--- a/skaapsteker/widgets/text.py	Mon Apr 04 21:31:53 2011 +0200
+++ b/skaapsteker/widgets/text.py	Mon Apr 04 21:30:39 2011 +0200
@@ -44,8 +44,13 @@
 
 
 class TextChoice(Widget):
+    """Render a list of options, and a selector.
+    options can be text or a tuple of (text, data).
+    When selected, calls everything registered in callbacks with (index, data)
+    """
     def __init__(self, options, pos, **kwargs):
         self.options = []
+        self.option_widgets = []
         self.rect = pygame.Rect(pos, (0, 0))
         self.selector = Text(u'ยป ', pos, **kwargs)
         self.selected = 0
@@ -53,9 +58,17 @@
 
         pos = self.rect.move(self.selector.rect.width, 0)
         for option in options:
-            t = Text(option, pos, **kwargs)
+            if not isinstance(option, tuple):
+                option = (option, None)
+            self.options.append(option)
+            text, data = option
+            t = Text(text, pos, **kwargs)
             pos = pos.move(0, t.rect.height)
-            self.options.append(t)
+            self.option_widgets.append(t)
+
+        self.rect.width = max(line.rect.width for line in self.option_widgets
+                             ) + self.selector.rect.width
+        self.rect.height = sum(line.rect.height for line in self.option_widgets)
 
     def dispatch(self, ev):
         if ev.type is KEYDOWN:
@@ -64,12 +77,13 @@
             elif ev.key == K_DOWN:
                 self.selected += 1
             elif ev.key == K_RETURN:
-                all(callback(self.selected) for callback in self.callbacks)
+                for callback in self.callbacks:
+                    callback(self.selected, self.options[self.selected][1])
 
-        self.selected %= len(self.options)
-        self.selector.rect.top = self.options[self.selected].rect.top
+        self.selected %= len(self.option_widgets)
+        self.selector.rect.top = self.option_widgets[self.selected].rect.top
 
     def draw(self, surface):
-        for option in self.options:
+        for option in self.option_widgets:
             option.draw(surface)
         self.selector.draw(surface)