diff mamba/habitats/editor.py @ 508:6c61d5862310

Massive speical sprite editor rewrite
author Neil Muller <drnlmuller@gmail.com>
date Sun, 18 Sep 2011 00:11:30 +0200
parents 72976997bdd9
children 0ccdcc970ae2
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Sun Sep 18 00:04:42 2011 +0200
+++ b/mamba/habitats/editor.py	Sun Sep 18 00:11:30 2011 +0200
@@ -9,6 +9,7 @@
 import urllib2
 
 from mamba.engine import Habitat, NewHabitatEvent
+from mamba.sprites import find_special_sprites
 from mamba.widgets.level import EditLevelWidget
 from mamba.widgets.text import TextWidget, TextButton
 from mamba.widgets.imagebutton import ImageButtonWidget
@@ -20,7 +21,7 @@
 from mamba.widgets.editlevel import EditLevelBox
 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
 from mamba.data import (check_level_exists, get_level_list, load_file,
-                        load_image)
+                        load_image, load_tile_image)
 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
         RESERVED_NAMES, WINDOW_ICON, LEVEL_SERVER)
 
@@ -41,6 +42,7 @@
         self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event)
         self.mode = 'Tiles'
         self.sprite_mode = 'Add'
+        self.sprite_cls = None
 
     def on_enter(self):
         # We need to juggle the display to the correct size
@@ -139,10 +141,19 @@
                         tile_char, text)
                 tool_list.append(tile_button)
             if self.mode == "Sprites":
-                for name in ['Add', 'Edit', 'Delete']:
+                for cls_name, sprite_cls in find_special_sprites():
+                    image = load_tile_image(sprite_cls.image_name,
+                            self.level.tileset.name)
+                    name = sprite_cls.name
+                    tile_button = ImageButtonWidget((0, 0), image, name,
+                            color='white')
+                    tile_button.add_callback('clicked', self.sprite_tool,
+                            'Add', cls_name, sprite_cls)
+                    tool_list.append(tile_button)
+                for name in ['Edit', 'Delete']:
                     tile_button = TextButton((0, 0), '%s Sprite' % name)
                     tile_button.add_callback('clicked', self.sprite_tool,
-                            name)
+                            name, None, None)
                     tool_list.append(tile_button)
             self.tool_widget = ToolListWidget((button_left, button_height),
                     tool_list, MAX_TOOLS, start_key=K_2)
@@ -362,9 +373,11 @@
         self.level.level_name = new_name
         return None
 
-    def sprite_tool(self, ev, widget, sprite_mode):
+    def sprite_tool(self, ev, widget, sprite_mode, cls_name, sprite_cls):
         """Handle sprite stuff"""
         self.sprite_mode = sprite_mode
+        self.sprite_cls_name = cls_name
+        self.sprite_cls = sprite_cls
         self.level.update_tiles_ascii()  # commit any changes
         self.clear_toolbar()
         self.setup_toolbar()
@@ -377,18 +390,19 @@
         if self.container.paused:
             return False
         tile_pos = self.edit_widget.convert_pos(ev.pos)
-        sprite = self.level.get_sprite_at(tile_pos)
+        sprite, sprite_ascii = self.level.get_sprite_at(tile_pos)
         if self.sprite_mode == 'Delete' and sprite:
-            self.level.remove_sprite(sprite)
+            self.level.remove_sprite(sprite_ascii)
             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)
+            self.edit_sprite(tile_pos,
+                    (self.sprite_cls_name, self.sprite_cls, None, []))
         return True
 
-    def edit_sprite(self, tile_pos, sprite):
-        sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite,
+    def edit_sprite(self, tile_pos, sprite_info):
+        sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite_info,
                 post_callback=self.commit_line)
         self.display_dialog(sprite_editor)