Mercurial > mamba
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()