# HG changeset patch # User Neil Muller # Date 1316202476 -7200 # Node ID 170d4a43c00eadae89ac030e0fe9b33dcd40af77 # Parent 3ec7acdf30659ba807c4afdbf64656dca13fcd03 Don't edit the level when interacting with dialogs diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/habitats/editor.py --- 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 diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/widgets/entrybox.py --- 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): diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/widgets/level.py --- 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 diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/widgets/listbox.py --- 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 diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/widgets/messagebox.py --- 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() diff -r 3ec7acdf3065 -r 170d4a43c00e mamba/widgets/toollist.py --- 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