view mamba/widgets/editsprite.py @ 350:8dd5b475b452

Add sprite editing dialog
author Neil Muller <drnlmuller@gmail.com>
date Fri, 16 Sep 2011 23:27:31 +0200
parents
children 8b9cfc4f0f01
line wrap: on
line source

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