diff mamba/widgets/editsprite.py @ 508:6c61d5862310

Massive speical sprite editor rewrite
author Neil Muller <drnlmuller@gmail.com>
date Sun, 18 Sep 2011 00:11:30 +0200
parents 08a84134ccbf
children
line wrap: on
line diff
--- a/mamba/widgets/editsprite.py	Sun Sep 18 00:04:42 2011 +0200
+++ b/mamba/widgets/editsprite.py	Sun Sep 18 00:11:30 2011 +0200
@@ -5,20 +5,20 @@
 class EditSpriteBox(Box):
     """Edit details for a special sprite on the level map"""
 
-    def __init__(self, rect, sprite_pos, sprite, post_callback=None):
+    def __init__(self, rect, sprite_pos, sprite_info, post_callback=None):
         super(EditSpriteBox, self).__init__(rect)
         self.sprite_pos = sprite_pos
-        if sprite:
-            _, _, rest = sprite.partition(':')
-            self.sprite_name, rest = rest.split(None, 1)
-            args = rest.split()
-            self.sprite_id = args[0]
-            self.sprite_parameters = " ".join(args[1:])
+        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_name = ''
             self.sprite_id = ''
-            self.sprite_parameters = ""
+        self.sprite_parameters = args
+        self.new_sprite_parameters = []
         self.post_callback = post_callback
+        self.parameter_widgets = []
         self.prepare()
         self.modal = True
 
@@ -26,19 +26,75 @@
         title = TextWidget(self.rect, "Specify Sprite Details")
         self.add(title)
         height = self.rect.top + title.rect.height + 2
-        self.edit_sprite_name = EntryTextWidget((self.rect.left, height),
-                self.sprite_name, prompt='Sprite Class:')
+        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, height),
-                self.sprite_id, prompt='Sprite Id:')
+        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
-        self.edit_sprite_param = EntryTextWidget((self.rect.left, height),
-                self.sprite_parameters, prompt='Sprite Parameters:')
-        self.add(self.edit_sprite_param)
-        height += self.edit_sprite_param.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)
@@ -49,10 +105,30 @@
         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.sprite_parameters = self.edit_sprite_param.value
-            self.sprite_name = self.edit_sprite_name.value
+            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):
@@ -64,8 +140,9 @@
     def make_sprite(self):
         """Convert values to a sprite line"""
         pos = "%s, %s" % self.sprite_pos
-        return "%s: %s %s %s" % (pos, self.sprite_name, self.sprite_id,
-                self.sprite_parameters)
+        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()