changeset 350:8dd5b475b452

Add sprite editing dialog
author Neil Muller <drnlmuller@gmail.com>
date Fri, 16 Sep 2011 23:27:31 +0200
parents 2c4521f93788
children 03d0a7dbb724
files mamba/widgets/editsprite.py
diffstat 1 files changed, 78 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mamba/widgets/editsprite.py	Fri Sep 16 23:27:31 2011 +0200
@@ -0,0 +1,78 @@
+import pygame
+from pygame.constants import SRCALPHA
+
+from mamba.widgets.base import Container
+from mamba.widgets.text import TextWidget, TextButton, EntryTextWidget
+
+
+class EditSpriteBox(Container):
+    """Edit details for a special sprite on the level map"""
+
+    def __init__(self, rect, sprite_pos, sprite, 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:])
+        else:
+            self.sprite_name = ''
+            self.sprite_id = ''
+            self.sprite_parameters = ""
+        self.post_callback = post_callback
+        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 = EntryTextWidget((self.rect.left, height),
+                self.sprite_name, prompt='Sprite Class:')
+        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.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
+
+        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.rect.left + 100, height), 'Cancel')
+        cancel_button.add_callback('clicked', self.close, False)
+        self.add(cancel_button)
+        self.rect.width = max(self.rect.width, 400)
+
+    def draw(self, surface):
+        background = pygame.Surface(self.rect.size, SRCALPHA)
+        background.fill(pygame.Color('gray'))
+        surface.blit(background, self.rect)
+        super(EditSpriteBox, self).draw(surface)
+
+    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.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
+        return "%s: %s %s %s" % (pos, self.sprite_name, self.sprite_id,
+                self.sprite_parameters)
+
+    def grab_focus(self):
+        return self.ok_button.grab_focus()