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