changeset 337:170d4a43c00e

Don't edit the level when interacting with dialogs
author Neil Muller <drnlmuller@gmail.com>
date Fri, 16 Sep 2011 21:47:56 +0200
parents 3ec7acdf3065
children 2cadc8a427f0
files mamba/habitats/editor.py mamba/widgets/entrybox.py mamba/widgets/level.py mamba/widgets/listbox.py mamba/widgets/messagebox.py mamba/widgets/toollist.py
diffstat 6 files changed, 62 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/habitats/editor.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/habitats/editor.py	Fri Sep 16 21:47:56 2011 +0200
@@ -25,6 +25,7 @@
     def __init__(self, level):
         super(EditorHabitat, self).__init__(EDIT_SCREEN)
         self.level = level
+        self.container.paused = False
         self.edit_widget = EditLevelWidget(self.level)
         self.container.add(self.edit_widget)
         self.container.add_callback(KEYDOWN, self.keydown_event)
@@ -54,9 +55,11 @@
         if ev.key in ESCAPE_KEYS:
             from mamba.habitats.mainmenu import MainMenu
             NewHabitatEvent.post(MainMenu())
+            return True
         elif ev.key == K_1:
             # Activate floor button
             self.floor_button.forced_click()
+            return True
 
     def setup_toolbar(self):
         """Draw the editor toolbar"""
@@ -186,6 +189,7 @@
         self.edit_widget.set_tool(new_tool)
         self.current_tool.text = 'Tool: %s' % text
         self.current_tool.prepare()
+        return True
 
     def save(self, ev, widget):
         message = None
@@ -194,15 +198,19 @@
         elif self.level.level_name in RESERVED_NAMES:
             message = MessageBox((300, 300), 'Reserved level name')
         if message:
+            self.container.paused = True
             self.container.add(message)
             message.grab_focus()
             return
         self.level.save_level()
+        return True
 
     def new(self, ev, widget):
         self.load_level(ev, widget, 'blank')
+        return True
 
     def load(self, ev, widget):
+        self.container.paused = True
         levels = get_level_list()
         load_list = []
         for level_name in levels:
@@ -214,6 +222,7 @@
         load_dialog = ListBox((200, 200), 'Select Level', load_list)
         self.container.add(load_dialog)
         load_dialog.grab_focus()
+        return True
 
     def load_level(self, ev, widget, level_name):
         try:
@@ -221,6 +230,7 @@
         except (IOError, InvalidMapError, pygame.error), error:
             message = MessageBox((300, 300),
                     'Loading Level Failed: %s' % error, color='red')
+            self.container.paused = True
             self.container.add(message)
             message.grab_focus()
             return False
@@ -228,6 +238,7 @@
         self.level = new_level
         if level_name in RESERVED_NAMES:
             self.level.level_name = ''  # Special case for new level
+        self.container.paused = False
         self.edit_widget = EditLevelWidget(self.level)
         self.container.add(self.edit_widget)
         self.clear_toolbar()
@@ -235,8 +246,10 @@
 
     def change_toolbar(self, ev, widget, new_mode):
         self.mode = new_mode
+        self.edit_widget.tile_mode = (self.mode != 'Sprites')
         self.clear_toolbar()
         self.setup_toolbar()
+        return True
 
     def clear_toolbar(self):
         """Remove every non-edit widget from the container"""
@@ -245,17 +258,21 @@
                 self.container.remove(widget)
 
     def do_edit(self, ev, widget, message, init_value, callback):
+        self.container.paused = True
         editbox = EntryBox((200, 200), message, init_value, callback)
         self.container.add(editbox)
         editbox.grab_focus()
+        return True
 
     def update_name(self, new_name):
+        self.container.paused = False
         self.level.name = new_name
         self.clear_toolbar()
         self.setup_toolbar()
         return True
 
     def list_tilesets(self, ev, widget):
+        self.container.paused = True
         tilesets = get_tileset_list()
         load_list = []
         for name in tilesets:
@@ -267,8 +284,10 @@
         load_dialog = ListBox((200, 200), 'Select Level', load_list)
         self.container.add(load_dialog)
         load_dialog.grab_focus()
+        return True
 
     def list_tracks(self, ev, widget):
+        self.container.paused = True
         tracks = get_track_list()
         load_list = []
         for name in tracks:
@@ -291,14 +310,17 @@
             message = MessageBox((300, 300),
                     'Unable to change tileset:: %s' % error,
                     self.refresh_display, color='red')
+            self.container.paused = True
             self.container.add(message)
             message.grab_focus()
             return True
+        self.container.paused = False
         self.clear_toolbar()
         self.setup_toolbar()
         return True
 
     def change_track(self, ev, widget, new_name):
+        self.container.paused = False
         self.level.background_track = new_name
         self.clear_toolbar()
         self.setup_toolbar()
@@ -324,9 +346,11 @@
         elif check_level_exists(new_name):
             message = MessageBox((300, 300), 'Name already in use')
         if message:
+            self.container.paused = True
             self.container.add(message)
             message.grab_focus()
             return False
+        self.container.paused = False
         self.level.level_name = new_name
         self.clear_toolbar()
         self.setup_toolbar()
@@ -337,3 +361,4 @@
         self.sprite_mode = sprite_mode
         self.clear_toolbar()
         self.setup_toolbar()
+        return True
--- a/mamba/widgets/entrybox.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/widgets/entrybox.py	Fri Sep 16 21:47:56 2011 +0200
@@ -49,9 +49,13 @@
             self.value = self.entry_text.value
             if self.accept_callback(self.value):
                 if self.parent:
+                    if hasattr(self.parent, 'paused'):
+                        self.parent.paused = False
                     self.parent.remove(self)
             # Don't remove if the accept callback failed
             return
+        if hasattr(self.parent, 'paused'):
+            self.parent.paused = False
         self.parent.remove(self)
 
     def edit(self, ev, widget):
--- a/mamba/widgets/level.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/widgets/level.py	Fri Sep 16 21:47:56 2011 +0200
@@ -12,7 +12,12 @@
         self.main_tool = None
         self.tool = None
         self.drawing = False
+        self.last_click_pos = None
+        self.tile_mode = True  # Flag for sprite interactions
         super(EditLevelWidget, self).__init__(level_rect)
+        self.add_callback(MOUSEBUTTONDOWN, self.place_tile)
+        self.add_callback(MOUSEBUTTONUP, self.end_draw)
+        self.add_callback(MOUSEMOTION, self.draw_tiles)
 
     def draw(self, surface):
         self.level.draw(surface)
@@ -21,30 +26,42 @@
         self.main_tool = new_tool
         self.tool = new_tool
 
-    def event(self, event):
-        if event.type == MOUSEBUTTONDOWN:
+    def end_draw(self, event, widget):
+        self.drawing = False
+
+    def draw_tiles(self, event, widget):
+        if self.drawing and self.tool:
+            # FIXME: Need to consider leaving and re-entering the widget
+            self.update_tile(self.convert_pos(event.pos))
+
+    def place_tile(self, event, widget):
+        if self.tile_mode:
             if event.button == 1:  # Left button
                 self.tool = self.main_tool
             else:
                 self.tool = '.'
             self.drawing = True
             if self.tool:
-                self.update_tile(event.pos)
-        elif event.type == MOUSEBUTTONUP:
+                self.update_tile(self.convert_pos(event.pos))
+        else:
+            self.last_click_pos = self.convert_pos(event.pos)
             self.drawing = False
-        elif event.type == MOUSEMOTION and self.drawing and self.tool:
-            # FIXME: Need to consider leaving and re-entering the widget
-            self.update_tile(event.pos)
+
+    def convert_pos(self, pos):
+        return (pos[0] / TILE_SIZE[0], pos[1] / TILE_SIZE[1])
 
-    def update_tile(self, pixel_pos):
+    def update_tile(self, tile_pos):
         """Update the tile at the current mouse position"""
+        if self.check_paused():
+            return  # Do nothing if dialogs showing
         # We convert our current position into a tile position
         # and replace the tile with the current tool
-        tile_pos = (pixel_pos[0] / TILE_SIZE[0],
-                pixel_pos[1] / TILE_SIZE[1])
         old_tile = self.level.get_tile(tile_pos)
         if self.tool == '.' and old_tile is None:
             return
         elif old_tile is not None and old_tile.tile_char == self.tool:
             return
         self.level.replace_tile(tile_pos, self.tool)
+
+    def check_paused(self):
+        return hasattr(self.parent, 'paused') and self.parent.paused
--- a/mamba/widgets/listbox.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/widgets/listbox.py	Fri Sep 16 21:47:56 2011 +0200
@@ -44,6 +44,8 @@
         super(ListBox, self).draw(surface)
 
     def close(self, ev, widget):
+        if hasattr(self.parent, 'paused'):
+            self.parent.paused = False
         self.parent.remove(self)
         return True
 
--- a/mamba/widgets/messagebox.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/widgets/messagebox.py	Fri Sep 16 21:47:56 2011 +0200
@@ -45,6 +45,8 @@
         super(MessageBox, self).draw(surface)
 
     def close(self, ev, widget):
+        if hasattr(self.parent, 'paused'):
+            self.parent.paused = False
         self.parent.remove(self)
         if self.post_callback:
             self.post_callback()
--- a/mamba/widgets/toollist.py	Fri Sep 16 21:35:10 2011 +0200
+++ b/mamba/widgets/toollist.py	Fri Sep 16 21:47:56 2011 +0200
@@ -52,9 +52,9 @@
             widget = self.hot_keys[ev.key]
             return widget.forced_click()
         elif ev.key == K_PAGEDOWN and self.prev_but:
-            self.prev_but.forced_click()
+            return self.prev_but.forced_click()
         elif ev.key == K_PAGEUP and self.next_but:
-            self.next_but.forced_click()
+            return self.next_but.forced_click()
 
     def change_page(self, ev, widget, change):
         self.page += change