Mercurial > boomslang
diff pyntnclick/widgets/editsprite.py @ 555:c0474fe18b96 pyntnclick
Copy in widgets from mamba (currently unused)
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 11 Feb 2012 14:09:46 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pyntnclick/widgets/editsprite.py Sat Feb 11 14:09:46 2012 +0200 @@ -0,0 +1,148 @@ +from mamba.widgets.base import Box +from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget + + +class EditSpriteBox(Box): + """Edit details for a special sprite on the level map""" + + def __init__(self, rect, sprite_pos, sprite_info, post_callback=None): + super(EditSpriteBox, self).__init__(rect) + self.sprite_pos = sprite_pos + sprite_cls_name, sprite_cls, sprite_id, args = sprite_info + self.sprite_cls_name = sprite_cls_name + self.sprite_cls = sprite_cls + if sprite_id: + self.sprite_id = sprite_id + else: + self.sprite_id = '' + self.sprite_parameters = args + self.new_sprite_parameters = [] + self.post_callback = post_callback + self.parameter_widgets = [] + self.prepare() + self.modal = True + + def prepare(self): + title = TextWidget(self.rect, "Specify Sprite Details") + self.add(title) + height = self.rect.top + title.rect.height + 2 + self.edit_sprite_name = TextWidget((self.rect.left, height), + 'Sprite Class: %s' % self.sprite_cls.name) + self.add(self.edit_sprite_name) + height += self.edit_sprite_name.rect.height + 2 + self.edit_sprite_id = EntryTextWidget((self.rect.left + 20, height), + self.sprite_id, prompt='Sprite Id (required):') + self.add(self.edit_sprite_id) + height += self.edit_sprite_id.rect.height + 2 + poss_params = self.sprite_cls.get_sprite_args() + if not poss_params: + self.sprite_param = TextWidget((self.rect.left, height), + 'No Parameters') + self.add(self.sprite_param) + height += self.sprite_param.rect.height + 2 + else: + self.sprite_param = TextWidget((self.rect.left, height), + 'Parameters') + self.add(self.sprite_param) + height += self.sprite_param.rect.height + 2 + for i, param_tuple in enumerate(poss_params): + if len(self.sprite_parameters) > i: + value = self.sprite_parameters[i] + else: + value = None + if param_tuple[1] is None: + # Text Entry Parameter + if value is None: + value = '' + edit_widget = EntryTextWidget( + (self.rect.left + 20, height), + value, prompt=param_tuple[0]) + self.parameter_widgets.append(edit_widget) + self.add(edit_widget) + height += edit_widget.rect.height + elif isinstance(param_tuple[1], tuple): + # We have a list of possible values + if value is None: + value = param_tuple[1][0] # Take the first + mylist = [] + list_width = 0 + list_height = 0 + for choice in param_tuple[1]: + list_parameter = TextWidget( + (self.rect.left + 20, height), + '%s: %s' % (param_tuple[0], choice)) + # So we can pull it out of this later + list_parameter.choice = choice + list_width = max(list_width, list_parameter.rect.width) + change_list = TextButton( + (list_parameter.rect.right + 5, height), + 'Next Option') + change_list.add_callback('clicked', self.change_list, + choice, param_tuple[1], mylist) + mylist.append((list_parameter, change_list)) + list_height = max(list_height, change_list.rect.height, + list_parameter.rect.height) + if choice == value: + self.add(list_parameter) + self.add(change_list) + for x in mylist: + x[1].rect.left = self.rect.left + list_width + 25 + if x[0].rect.height < list_height: + x[0].rect.top += (list_height - + x[0].rect.height) / 2 + height += max(list_parameter.rect.height, + change_list.rect.height) + self.parameter_widgets.append(mylist) + # FIXME: Other cases + height += 20 + self.ok_button = TextButton((self.rect.left + 10, height), 'OK') + self.ok_button.add_callback('clicked', self.close, True) + self.add(self.ok_button) + cancel_button = TextButton((self.ok_button.rect.right + 10, height), + 'Cancel') + cancel_button.add_callback('clicked', self.close, False) + self.add(cancel_button) + self.rect.width = max(self.rect.width, 400) + self.rect.height += 5 + + def change_list(self, ev, widget, cur_choice, all_choices, widget_list): + pos = all_choices.index(cur_choice) + if pos == len(all_choices) - 1: + next_pos = 0 + else: + next_pos = pos + 1 + self.remove(widget_list[pos][0]) + self.remove(widget_list[pos][1]) + self.add(widget_list[next_pos][0]) + self.add(widget_list[next_pos][1]) + + def close(self, ev, widget, do_update): + if do_update: + self.new_sprite_parameters = [] + for param in self.parameter_widgets: + if hasattr(param, 'value'): + self.new_sprite_parameters.append(param.value) + elif isinstance(param, list): + # Find the selected one + for choice, _ in param: + if choice in self.children: + # Is selected, so we grab this choice + self.new_sprite_parameters.append(choice.choice) + break + self.sprite_id = self.edit_sprite_id.value + sprite = self.make_sprite() + if not self.post_callback(sprite): + return # Call-back failed, so don't remove + self.parent.paused = False + self.parent.remove(self) + return True + + def make_sprite(self): + """Convert values to a sprite line""" + pos = "%s, %s" % self.sprite_pos + sprite_string = "%s: %s %s %s" % (pos, self.sprite_cls_name, + self.sprite_id, " ".join(self.new_sprite_parameters)) + return sprite_string + + def grab_focus(self): + return self.ok_button.grab_focus()