# HG changeset patch # User Stefano Rivera # Date 1301945439 -7200 # Node ID 982f34d0aac03c46de2e9efa6bc1546b7459c06e # Parent 5037bf06d7cdefd67006398e61dd104f2fd2111f Add optional data to identify TextChoice options diff -r 5037bf06d7cd -r 982f34d0aac0 skaapsteker/menuscene.py --- 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')) diff -r 5037bf06d7cd -r 982f34d0aac0 skaapsteker/widgets/text.py --- 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)