annotate mamba/habitats/editor.py @ 479:3f37e011c3b6

Neater buttons
author Neil Muller <drnlmuller@gmail.com>
date Sat, 17 Sep 2011 22:12:16 +0200
parents 4986c22fe5fd
children 68898de788cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
8521c142cd43 Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Habitat for editing levels."""
8521c142cd43 Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
3 import pygame.display
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
4 from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
5 import sys
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
6 import traceback
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
7
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
8 from mamba.engine import Habitat, NewHabitatEvent
120
6b1cdbdd34ca Rename LevelWidget
Neil Muller <drnlmuller@gmail.com>
parents: 113
diff changeset
9 from mamba.widgets.level import EditLevelWidget
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
10 from mamba.widgets.text import TextWidget, TextButton
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
11 from mamba.widgets.imagebutton import ImageButtonWidget
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
12 from mamba.widgets.messagebox import MessageBox
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
13 from mamba.widgets.entrybox import EntryBox
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
14 from mamba.widgets.listbox import ListBox
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents: 240
diff changeset
15 from mamba.widgets.toollist import ToolListWidget
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
16 from mamba.widgets.editsprite import EditSpriteBox
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
17 from mamba.widgets.editlevel import EditLevelBox
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
18 from mamba.level import Level, Tileset, TILE_MAP, THING_MAP, InvalidMapError
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
19 from mamba.data import (check_level_exists, get_level_list, load_file,
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
20 load_image)
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
21 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
22 RESERVED_NAMES, WINDOW_ICON)
42
8521c142cd43 Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
24 MAX_TOOLS = 6
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
25 MODE_HEIGHT = 500
240
f0c14d9abd84 Hack in multi-page toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 237
diff changeset
26
42
8521c142cd43 Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27
8521c142cd43 Add habitat for editor and reshuffle when options are checked to before initializing the display window.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28 class EditorHabitat(Habitat):
314
fba74abad7b7 Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 284
diff changeset
29 def __init__(self, level):
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
30 super(EditorHabitat, self).__init__(EDIT_SCREEN)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
31 self.toolbar = {}
314
fba74abad7b7 Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 284
diff changeset
32 self.level = level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
33 self.container.paused = False
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
34 self.edit_widget = EditLevelWidget(self.level)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
35 self.container.add(self.edit_widget)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
36 self.container.add_callback(KEYDOWN, self.keydown_event)
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
37 self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
38 self.mode = 'Tiles'
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
39 self.sprite_mode = 'Add'
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
40
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
41 def on_enter(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
42 # We need to juggle the display to the correct size
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
43 # This is a horrible hack
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
44 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
45 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
46 pygame.display.set_mode(EDIT_SCREEN, SWSURFACE)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
47 pygame.display.set_icon(load_image(WINDOW_ICON))
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
48 pygame.display.set_caption('%s Level editor' % NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
49 super(EditorHabitat, self).on_enter()
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
50 self.setup_toolbar()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
51
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
52 def on_exit(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
53 # We need to juggle the display to the correct size
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
54 # This is a horrible hack
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
55 super(EditorHabitat, self).on_exit()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
56 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
57 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
58 pygame.display.set_mode(SCREEN, SWSURFACE)
475
4986c22fe5fd Re-set window icon when the editor re-creates windows.
Simon Cross <hodgestar@gmail.com>
parents: 454
diff changeset
59 pygame.display.set_icon(load_image(WINDOW_ICON))
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
60 pygame.display.set_caption(NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
61
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
62 def keydown_event(self, ev, widget):
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
63 if ev.key in ESCAPE_KEYS:
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
64 from mamba.habitats.mainmenu import MainMenu
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
65 NewHabitatEvent.post(MainMenu())
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
66 return True
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
67 elif ev.key == K_1:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
68 # Activate floor button
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
69 self.floor_button.forced_click()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
70 return True
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
71
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
72 def setup_toolbar(self):
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
73 """Draw the editor toolbar"""
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
74 button_height = 5
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
75 button_left = 820
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
76 button_padding = 2
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
77
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
78 level_name = TextWidget((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
79 'Level: %s' % self.level.level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
80 self.container.add(level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
81 button_height += level_name.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
82
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
83 edit_level = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
84 'Edit Level Metadata')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
85 edit_level.add_callback('clicked', self.edit_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
86 self.container.add(edit_level)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
87 button_height += edit_level.rect.height + button_padding
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
88
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
89 # filename = TextButton(
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
90 # (button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
91 # 'File: %s' % self.level.level_name, color='white')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
92 # filename.add_callback('clicked', self.do_edit,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
93 # 'Specify filename', self.level.level_name, self.check_file)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
94 # self.container.add(filename)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
95 # button_height += filename.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
96 # levelname = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
97 # 'Level: %s' % self.level.name, color='white')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
98 # levelname.add_callback('clicked', self.do_edit,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
99 # 'Edit Level Title', self.level.name, self.update_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
100 # self.container.add(levelname)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
101 # button_height += levelname.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
102
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
103 # tilesetname = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
104 # 'Tileset: %s' % self.level.tileset.name, color='white')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
105 # tilesetname.add_callback('clicked', self.list_tilesets)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
106 # self.container.add(tilesetname)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
107 # button_height += tilesetname.surface.get_height() + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
108 # trackname = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
109 # 'Music: %s' % self.level.background_track, color='white')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
110 # trackname.add_callback('clicked', self.list_tracks)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
111 # self.container.add(trackname)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
112 # button_height += trackname.surface.get_height() + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
113
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
114 # TODO: Add Image widget for the current tool
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
115 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
116 self.current_tool = TextWidget((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
117 'Tool: Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
118 else:
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
119 self.current_tool = TextWidget((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
120 '%s Sprite' % self.sprite_mode, color='white')
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
121 self.container.add(self.current_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
122 button_height += self.current_tool.surface.get_height()
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
123 button_height += button_padding
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
124 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
125 self.floor_button = ImageButtonWidget(
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
126 (button_left, button_height), self.level.tileset.floor,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
127 'Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
128 self.container.add(self.floor_button)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
129 self.floor_button.add_callback('clicked', self.change_tool,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
130 '.', 'Floor')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
131 self.edit_widget.set_tool('.')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
132 button_height += (self.floor_button.surface.get_height()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
133 + button_padding)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
134 if self.mode in self.toolbar:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
135 # FIXME: This needs to be recreated on tileset changes
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
136 self.tool_widget = self.toolbar[self.mode]
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
137 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
138 if self.mode == 'Tiles':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
139 tile_map = TILE_MAP
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
140 elif self.mode == 'Things':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
141 tile_map = THING_MAP
170
77f1dae64019 Use name in editor
Neil Muller <drnlmuller@gmail.com>
parents: 120
diff changeset
142 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
143 tile_map = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
144 tool_list = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
145 for tile_char in sorted(tile_map):
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
146 try:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
147 tile = self.level.tileset[tile_char]
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
148 except pygame.error:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
149 # Ignore stuff we can't load for now
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
150 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
151 if tile is None:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
152 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
153 if tile.name:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
154 text = tile.name
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
155 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
156 text = 'Tile'
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
157 tile_button = ImageButtonWidget((0, 0), tile.image, text,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
158 color='white')
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
159 tile_button.add_callback('clicked', self.change_tool,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
160 tile_char, text)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
161 tool_list.append(tile_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
162 if self.mode == "Sprites":
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
163 for name in ['Add', 'Edit', 'Delete']:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
164 tile_button = TextButton((0, 0), '%s Sprite' % name)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
165 tile_button.add_callback('clicked', self.sprite_tool,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
166 name)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
167 tool_list.append(tile_button)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
168 self.tool_widget = ToolListWidget((button_left, button_height),
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
169 tool_list, MAX_TOOLS, start_key=K_2)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
170 self.toolbar[self.mode] = self.tool_widget
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
171 self.container.add(self.tool_widget)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
172 button_height = self.container.rect.top + MODE_HEIGHT
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
173 if self.mode == 'Tiles':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
174 mode_button1 = TextButton((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
175 'Things')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
176 mode_button1.add_callback('clicked', self.change_toolbar, 'Things')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
177 mode_button2 = TextButton((button_left + 100, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
178 'Sprites')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
179 mode_button2.add_callback('clicked', self.change_toolbar,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
180 'Sprites')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
181 elif self.mode == 'Things':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
182 mode_button1 = TextButton((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
183 'Tiles')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
184 mode_button1.add_callback('clicked', self.change_toolbar, 'Tiles')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
185 mode_button2 = TextButton((button_left + 100, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
186 'Sprites')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
187 mode_button2.add_callback('clicked', self.change_toolbar,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
188 'Sprites')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
189 elif self.mode == 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
190 mode_button1 = TextButton((button_left, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
191 'Tiles')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
192 mode_button1.add_callback('clicked', self.change_toolbar, 'Tiles')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
193 mode_button2 = TextButton((button_left + 100, button_height),
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
194 'Things')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
195 mode_button2.add_callback('clicked', self.change_toolbar,
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
196 'Things')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
197 self.container.add(mode_button1)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
198 self.container.add(mode_button2)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
199 button_height += mode_button1.rect.height + button_padding
237
9498b259c248 compress layout a tad more
Neil Muller <drnlmuller@gmail.com>
parents: 236
diff changeset
200 button_height += 2
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
201
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
202 new = TextButton((button_left, button_height), "New")
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
203 new.add_callback('clicked', self.new)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
204 self.container.add(new)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
205 load = TextButton((button_left + 60, button_height), "Load")
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
206 load.add_callback('clicked', self.load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
207 self.container.add(load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
208
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
209 save = TextButton((button_left + 120, button_height), "Save")
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
210 save.add_callback('clicked', self.save)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
211 self.container.add(save)
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
212
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
213 def change_tool(self, ev, widget, new_tool, text):
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
214 self.edit_widget.set_tool(new_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
215 self.current_tool.text = 'Tool: %s' % text
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
216 self.current_tool.prepare()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
217 return True
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
218
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
219 def save(self, ev, widget):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
220 message = None
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
221 if not self.level.level_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
222 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
223 elif self.level.level_name in RESERVED_NAMES:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
224 message = MessageBox((300, 300), 'Reserved level name')
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
225 elif '/' in self.level.level_name:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
226 message = MessageBox((300, 300), 'Illegal level name')
363
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
227 try:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
228 self.level.validate_level()
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
229 except InvalidMapError, error:
21caf90f604e Validate levels before saving them
Neil Muller <drnlmuller@gmail.com>
parents: 361
diff changeset
230 message = MessageBox((300, 300), "Map isn't valid\n%s" % error)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
231 if message:
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
232 self.display_dialog(message)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
233 return
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
234 self.level.save_level('user_levels', is_user_dir=True)
396
171c3d817c48 Refresh display after saving level. (A hack, but it does the job.)
Jeremy Thurgood <firxen@gmail.com>
parents: 387
diff changeset
235 self.refresh_display()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
236 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
237
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
238 def new(self, ev, widget):
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
239 return self.load(ev, widget, 'levels', subdir='templates')
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
240
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
241 def load(self, ev, widget, level_dir=None, is_user_dir=False, subdir=''):
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
242 if level_dir is None:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
243 level_dir = 'user_levels'
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
244 is_user_dir = True
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
245 self.container.paused = True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
246 levels = get_level_list('/'.join([level_dir, subdir]), is_user_dir)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
247 load_list = []
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
248 for level_name in levels:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
249 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
250 continue
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
251 if subdir:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
252 level_name = '/'.join([subdir, level_name])
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
253 load_button = TextButton((0, 0), level_name)
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
254 load_button.add_callback(
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
255 'clicked', self.load_level, level_name, level_dir, is_user_dir)
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
256 load_list.append(load_button)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
257 self.display_dialog(ListBox((200, 200), 'Select Level', load_list, 6))
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
258 return True
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
259
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
260 def load_level(self, ev, widget, level_name, level_dir, is_user_dir):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
261 try:
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
262 source = load_file("%s/%s.txt" % (level_dir, level_name),
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
263 is_user_dir=is_user_dir)
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
264 new_level = Level(level_name, 'user', source.read())
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
265 except (IOError, InvalidMapError, pygame.error), error:
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
266 message = MessageBox((300, 300),
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
267 'Loading Level Failed: %s' % error, color='red')
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
268 self.display_dialog(message)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
269 return False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
270 self.container.remove(self.edit_widget)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
271 self.level = new_level
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
272 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
273 self.level.level_name = '' # Special case for new level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
274 self.container.paused = False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
275 self.edit_widget = EditLevelWidget(self.level)
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
276 self.container.add(self.edit_widget)
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
277 self.clear_toolbar()
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
278 self.setup_toolbar()
387
f86188a0f259 Tweak load list length
Neil Muller <drnlmuller@gmail.com>
parents: 363
diff changeset
279 return True
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
280
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
281 def change_toolbar(self, ev, widget, new_mode):
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
282 self.mode = new_mode
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
283 self.edit_widget.tile_mode = (self.mode != 'Sprites')
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
284 self.clear_toolbar()
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
285 self.setup_toolbar()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
286 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
287
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
288 def clear_toolbar(self):
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
289 """Remove every non-edit widget from the container"""
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
290 for widget in self.container.children[:]:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
291 if widget is not self.edit_widget:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
292 self.container.remove(widget)
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
293
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
294 def do_edit(self, ev, widget, message, init_value, callback):
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
295 self.display_dialog(
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
296 EntryBox((200, 200), message, init_value, callback))
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
297 return True
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
298
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
299 def update_level_data(self, filename, name, tileset, track):
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
300 self.container.paused = False
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
301
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
302 self.level.name = name
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
303 self.level.background_track = track
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
304 # err_ts = self.change_tileset(tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
305 err_fn = self.check_file(filename)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
306
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
307 self.clear_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
308 self.setup_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
309
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
310 if err_fn:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
311 self.display_dialog(err_fn)
325
00c36ff53de9 Teach editor about background tracks
Neil Muller <drnlmuller@gmail.com>
parents: 314
diff changeset
312
279
162bddbbc5d0 Protect against bad tilesets as well
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
313 def refresh_display(self):
275
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
314 self.level.restart()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
315 self.clear_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
316 self.setup_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
317 return True
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
318
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
319 def change_tileset(self, new_tileset):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
320 print "changing tileset"
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
321 self.level.update_tiles_ascii()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
322 old_tileset = self.level.tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
323 try:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
324 self.level.tileset = Tileset(new_tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
325 self.level.restart()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
326 return None
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
327 except pygame.error, error:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
328 self.level.tileset = old_tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
329 return MessageBox(
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
330 (300, 300), 'Unable to change tileset:: %s' % error,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
331 color='red')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
332
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
333 def check_file(self, new_name):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
334 message = None
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
335 if new_name == self.level.level_name:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
336 return None # No-op change
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
337 if not new_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
338 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
339 if new_name in RESERVED_NAMES:
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
340 # This case is caught by the existance check, but the
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
341 # importance of the reserved names means we use a different
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
342 # message
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
343 message = MessageBox((300, 300), 'Reserved level name')
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
344 elif check_level_exists(new_name, 'user_levels', is_user_dir=True):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
345 message = MessageBox((300, 300), 'Name already in use')
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
346 if message:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
347 return message
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
348 self.level.level_name = new_name
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
349 return None
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
350
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
351 def sprite_tool(self, ev, widget, sprite_mode):
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
352 """Handle sprite stuff"""
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
353 self.sprite_mode = sprite_mode
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
354 self.level.update_tiles_ascii() # commit any changes
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
355 self.clear_toolbar()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
356 self.setup_toolbar()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
357 return True
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
358
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
359 def mouse_event(self, ev, widget):
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
360 """Handle mouse clicks when we are in sprite mode"""
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
361 if self.mode != 'Sprites':
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
362 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
363 if self.container.paused:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
364 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
365 tile_pos = self.edit_widget.convert_pos(ev.pos)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
366 sprite = self.level.get_sprite_at(tile_pos)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
367 if self.sprite_mode == 'Delete' and sprite:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
368 self.level.remove_sprite(sprite)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
369 self.level.restart()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
370 elif self.sprite_mode == 'Edit' and sprite:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
371 self.edit_sprite(tile_pos, sprite)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
372 elif self.sprite_mode == 'Add' and sprite is None:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
373 self.edit_sprite(tile_pos, sprite)
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
374 return True
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
375
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
376 def edit_sprite(self, tile_pos, sprite):
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
377 sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite,
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
378 post_callback=self.commit_line)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
379 self.display_dialog(sprite_editor)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
380
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
381 def edit_level_data(self, ev, widget):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
382 elb = EditLevelBox((200, 100), self.level, self.update_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
383 self.display_dialog(elb)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
384
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
385 def commit_line(self, sprite):
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
386 try:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
387 self.level.validate_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
388 except:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
389 # We don't know what errors thwe constructor may show, so
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
390 # we catch everything
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
391 # We use sys.exc_info to get slight neater info
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
392 exc_type, info, _ = sys.exc_info()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
393 info = traceback.format_exception_only(exc_type, info)[0]
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
394 message = MessageBox((300, 300),
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
395 'Validation failed:\n%s' % info)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
396 self.display_dialog(message)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
397 return False
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
398 # Validation successful, so add to level
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
399 if self.sprite_mode == 'Add':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
400 self.level.add_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
401 elif self.sprite_mode == 'Edit':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
402 self.level.replace_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
403 self.level.restart()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
404 return True