Mercurial > mamba
changeset 353:62a2a659c69b
Call sprite editor dialog
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Fri, 16 Sep 2011 23:28:49 +0200 |
parents | abd9a2ceadb7 |
children | 46565a047ac0 |
files | mamba/habitats/editor.py |
diffstat | 1 files changed, 33 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/mamba/habitats/editor.py Fri Sep 16 23:28:28 2011 +0200 +++ b/mamba/habitats/editor.py Fri Sep 16 23:28:49 2011 +0200 @@ -2,6 +2,8 @@ import pygame.display from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN +import sys +import traceback from mamba.engine import Habitat, NewHabitatEvent from mamba.widgets.level import EditLevelWidget @@ -11,6 +13,7 @@ from mamba.widgets.entrybox import EntryBox from mamba.widgets.listbox import ListBox from mamba.widgets.toollist import ToolListWidget +from mamba.widgets.editsprite import EditSpriteBox from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError from mamba.data import (check_level_exists, get_level_list, get_tileset_list, get_track_list) @@ -375,16 +378,39 @@ sprite = self.level.get_sprite_at(tile_pos) if self.sprite_mode == 'Delete' and sprite: self.level.remove_sprite(sprite) + self.level.restart() elif self.sprite_mode == 'Edit' and sprite: self.edit_sprite(tile_pos, sprite) elif self.sprite_mode == 'Add' and sprite is None: self.edit_sprite(tile_pos, sprite) - else: - return True # Don't refresh the level if we're doing nothing - self.level.restart() - # edit sprite can pause the container, so unpause here - self.container.paused = False return True - def edit_sprite(self, tile_pos, sprite_line): - pass + def edit_sprite(self, tile_pos, sprite): + self.container.paused = True + sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite, + post_callback=self.commit_line) + self.container.add(sprite_editor) + sprite_editor.grab_focus() + + def commit_line(self, sprite): + try: + self.level.validate_sprite(sprite) + except: + # We don't know what errors thwe constructor may show, so + # we catch everything + # We use sys.exc_info to get slight neater info + exc_type, info, _ = sys.exc_info() + info = traceback.format_exception_only(exc_type, info)[0] + message = MessageBox((300, 300), + 'Validation failed:\n%s' % info) + self.container.paused = True + self.container.add(message) + message.grab_focus() + return False + # Validation successful, so add to level + if self.sprite_mode == 'Add': + self.level.add_sprite(sprite) + elif self.sprite_mode == 'Edit': + self.level.replace_sprite(sprite) + self.level.restart() + return True