annotate mamba/habitats/editor.py @ 555:c014f5023cd2

Test run replays
author Neil Muller <drnlmuller@gmail.com>
date Thu, 22 Sep 2011 17:32:38 +0200
parents a2648295b7cf
children fda360905a1e
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
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
4 from pygame.locals import (SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
5 K_LEFT, K_RIGHT, K_DOWN, K_UP, K_SPACE)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
6 import sys
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
7 import traceback
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
8 from StringIO import StringIO
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
9 import urllib
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
10 import urllib2
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
11
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
12 from mamba.engine import (Habitat, NewHabitatEvent, SnakeDiedEvent,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
13 LevelCompletedEvent)
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
14 from mamba.sprites import find_special_sprites
120
6b1cdbdd34ca Rename LevelWidget
Neil Muller <drnlmuller@gmail.com>
parents: 113
diff changeset
15 from mamba.widgets.level import EditLevelWidget
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
16 from mamba.widgets.text import TextWidget, TextButton
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
17 from mamba.widgets.imagebutton import ImageButtonWidget
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
18 from mamba.widgets.messagebox import MessageBox
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
19 from mamba.widgets.entrybox import EntryBox
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
20 from mamba.widgets.listbox import ListBox
265
74ae1645df6e Move hackery into list widget
Neil Muller <drnlmuller@gmail.com>
parents: 240
diff changeset
21 from mamba.widgets.toollist import ToolListWidget
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
22 from mamba.widgets.editsprite import EditSpriteBox
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
23 from mamba.widgets.editlevel import EditLevelBox
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
24 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
25 from mamba.data import (check_level_exists, get_level_list, load_file,
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
26 load_image, load_tile_image)
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
27 from mamba.constants import (SCREEN, EDIT_SCREEN, NAME, ESCAPE_KEYS,
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
28 RESERVED_NAMES, WINDOW_ICON, LEVEL_SERVER, UP, DOWN, LEFT, RIGHT)
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
29
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
30 MAX_TOOLS = 6
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
31 MODE_HEIGHT = 370
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
32 LOAD_SAVE_HEIGHT = 500
240
f0c14d9abd84 Hack in multi-page toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 237
diff changeset
33
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
34 # hghooks: no-pep8
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
35 HELP_MSG = (
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
36 """Levels are saved as user levels, and stored in $XDG_DATA_HOME/.mamba/user_levels (i.e.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
37 ~/.local/share/.mamba/user_levels) or $APPDATA/.mamba/user_levels on Windows.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
38
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
39 A new level can be created from one of the existing templates using "New". Level properties, such as the
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
40 name, filename and background music track can be changed using the "Edit Level Metadata" button.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
41
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
42 The level editor has 4 modes: placing tiles, placing things, editing sprites and testing the level.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
43
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
44 Tiles are level geography, such as floors, walls and so forth. Things are items that the snake can eat, such as rats.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
45 Sprites are special elements with more complex items which require extra configuration information, such as tunnels.
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
46
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
47 To place tiles and things, select the desired element and click on the map to place the tile or thing. Deleting anything
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
48 replaces the space with a floor tile (Right click also deletes). The selection of tiles can be scrolled using the arrow buttons.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
49
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
50 Sprites can be placed as well. Sprites require parameters. Each sprite needs a unique id tag, which can be any string
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
51 without spaces, and then additional parameters that depend on the type of sprite, usually the id of another sprite.
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
52 Sprites can be added, edited and deleted. Look at existing maps to see how the parameters can be used.
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
53
552
b2e0f1267282 Add test mode to README. Tweak help text
Neil Muller <drnlmuller@gmail.com>
parents: 551
diff changeset
54 Test mode allows you to test the level without any clock running. The snake is moved using the cursor keys, or by pressing
b2e0f1267282 Add test mode to README. Tweak help text
Neil Muller <drnlmuller@gmail.com>
parents: 551
diff changeset
55 space, but interacts with the level as in the actual game. Space will advance the snake one step, useful for testing arrows.
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
56
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
57 Levels can be saved, and uploaded to be shared with other people. Shared levels
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
58 only become available after the levels have been curated by the Mamba team.""")
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
59
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
60
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
61 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
62 def __init__(self, level):
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
63 super(EditorHabitat, self).__init__(EDIT_SCREEN)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
64 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
65 self.level = level
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
66 self.container.paused = False
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
67 self.edit_widget = EditLevelWidget(self.level)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
68 self.container.add(self.edit_widget)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
69 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
70 self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
71 self.edit_widget.add_callback(SnakeDiedEvent, self.halt_test)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
72 self.edit_widget.add_callback(LevelCompletedEvent, self.halt_test)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
73 self.mode = 'Tiles'
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
74 self.sprite_mode = 'Add'
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
75 self.sprite_cls = None
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
76 # Map for test mode lookups
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
77 self.replays = {}
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
78 self.action_map = {
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
79 K_UP: UP,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
80 K_DOWN: DOWN,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
81 K_LEFT: LEFT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
82 K_RIGHT: RIGHT,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
83 K_SPACE: None,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
84 }
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
85
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
86 def on_enter(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
87 # 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
88 # This is a horrible hack
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
89 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
90 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
91 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
92 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
93 pygame.display.set_caption('%s Level editor' % NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
94 super(EditorHabitat, self).on_enter()
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
95 self.setup_toolbar()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
96
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
97 def on_exit(self):
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
98 # 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
99 # This is a horrible hack
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
100 super(EditorHabitat, self).on_exit()
52
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
101 pygame.display.quit()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
102 pygame.display.init()
d09f63429b80 Add screen size fiddling to editor habitat
Neil Muller <drnlmuller@gmail.com>
parents: 42
diff changeset
103 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
104 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
105 pygame.display.set_caption(NAME)
64
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
106
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
107 def keydown_event(self, ev, widget):
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
108 if ev.key in ESCAPE_KEYS:
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
109 from mamba.habitats.mainmenu import MainMenu
fbb5cc655b47 More screen size fiddling hackery
Neil Muller <drnlmuller@gmail.com>
parents: 52
diff changeset
110 NewHabitatEvent.post(MainMenu())
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
111 return True
267
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
112 elif ev.key == K_1:
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
113 # Activate floor button
1e8dca95c48a Hook up hot-keys in editor for jerith
Neil Muller <drnlmuller@gmail.com>
parents: 265
diff changeset
114 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
115 return True
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
116 elif self.mode == 'Test' and ev.key in self.action_map:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
117 self.edit_widget.apply_action(self.action_map[ev.key])
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
118 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
119
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
120 def halt_test(self, ev, widget):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
121 if SnakeDiedEvent.matches(ev):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
122 text = 'Snake died: %s' % ev.reason
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
123 else:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
124 text = 'Level completed'
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
125 if self.edit_widget.snake_alive:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
126 self.edit_widget.kill_snake()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
127 message = MessageBox((300, 200), text,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
128 post_callback=self.test_restart)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
129 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
130 return True
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
131
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
132 def test_restart(self):
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
133 self.unpause()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
134 self.edit_widget.restart()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
135 return True
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
136
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
137 def setup_toolbar(self):
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
138 """Draw the editor toolbar"""
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
139 button_height = 5
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
140 button_left = 820
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
141 button_padding = 2
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
142
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
143 level_name = TextWidget((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
144 'Level: %s' % self.level.level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
145 self.container.add(level_name)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
146 button_height += level_name.rect.height + button_padding
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
147
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
148 edit_level = TextButton((button_left, button_height),
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
149 'Edit Level Metadata')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
150 edit_level.add_callback('clicked', self.edit_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
151 self.container.add(edit_level)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
152 button_height += edit_level.rect.height + button_padding
94
aba653f8383e Start adding editor toolbar
Neil Muller <drnlmuller@gmail.com>
parents: 64
diff changeset
153
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
154 # 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
155 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
156 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
157 'Tool: Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
158 else:
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
159 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
160 '%s Sprite' % self.sprite_mode, color='white')
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
161 self.container.add(self.current_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
162 button_height += self.current_tool.surface.get_height()
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
163 button_height += button_padding
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
164 if self.mode != 'Sprites':
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
165 self.floor_button = ImageButtonWidget(
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
166 (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
167 'Floor', color='white')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
168 self.container.add(self.floor_button)
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
169 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
170 '.', 'Floor')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
171 self.edit_widget.set_tool('.')
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
172 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
173 + button_padding)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
174 if self.mode in self.toolbar:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
175 # FIXME: This needs to be recreated on tileset changes
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
176 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
177 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
178 if self.mode == 'Tiles':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
179 tile_map = TILE_MAP
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
180 elif self.mode == 'Things':
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
181 tile_map = THING_MAP
170
77f1dae64019 Use name in editor
Neil Muller <drnlmuller@gmail.com>
parents: 120
diff changeset
182 else:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
183 tile_map = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
184 tool_list = []
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
185 for tile_char in sorted(tile_map):
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
186 try:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
187 tile = self.level.tileset[tile_char]
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
188 except pygame.error:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
189 # Ignore stuff we can't load for now
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
190 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
191 if tile is None:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
192 continue
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
193 if tile.name:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
194 text = tile.name
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
195 else:
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
196 text = 'Tile'
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
197 tile_button = ImageButtonWidget((0, 0), tile.image, text,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
198 color='white')
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
199 tile_button.add_callback('clicked', self.change_tool,
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
200 tile_char, text)
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
201 tool_list.append(tile_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
202 if self.mode == "Sprites":
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
203 for cls_name, sprite_cls in find_special_sprites():
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
204 image = load_tile_image(sprite_cls.image_name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
205 self.level.tileset.name)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
206 name = sprite_cls.name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
207 tile_button = ImageButtonWidget((0, 0), image, name,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
208 color='white')
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
209 tile_button.add_callback('clicked', self.sprite_tool,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
210 'Add', cls_name, sprite_cls)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
211 tool_list.append(tile_button)
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
212 for name in ['Edit', 'Delete']:
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
213 tile_button = TextButton((0, 0), '%s Sprite' % name)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
214 tile_button.add_callback('clicked', self.sprite_tool,
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
215 name, None, None)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
216 tool_list.append(tile_button)
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
217 elif self.mode == 'Test':
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
218 for replay in [1, 2]:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
219 store_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
220 'Store run as %s' % replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
221 store_button.add_callback('clicked', self.store_replay,
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
222 replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
223 tool_list.append(store_button)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
224 replay_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
225 'Replay run %s' % replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
226 replay_button.add_callback('clicked', self.do_replay,
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
227 replay)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
228 tool_list.append(replay_button)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
229 last_button = TextButton((0, 0),
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
230 'Replay last run')
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
231 last_button.add_callback('clicked', self.do_replay, None)
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
232 tool_list.append(last_button)
479
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
233 self.tool_widget = ToolListWidget((button_left, button_height),
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
234 tool_list, MAX_TOOLS, start_key=K_2)
3f37e011c3b6 Neater buttons
Neil Muller <drnlmuller@gmail.com>
parents: 475
diff changeset
235 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
236 self.container.add(self.tool_widget)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
237
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
238 button_height = self.container.rect.top + MODE_HEIGHT
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
239 tile_button = TextButton((button_left, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
240 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
241 tile_button.add_callback('clicked', self.change_toolbar, 'Tiles')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
242 thing_button = TextButton((button_left + tile_button.rect.width +
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
243 button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
244 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
245 thing_button.add_callback('clicked', self.change_toolbar, 'Things')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
246 sprite_button = TextButton((button_left,
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
247 thing_button.rect.bottom +
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
248 button_padding),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
249 'Sprites')
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
250 sprite_button.add_callback('clicked', self.change_toolbar,
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
251 'Sprites')
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
252 test_button = TextButton((sprite_button.rect.right + button_padding,
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
253 thing_button.rect.bottom + button_padding),
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
254 'Test')
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
255 test_button.add_callback('clicked', self.change_toolbar, 'Test')
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
256 help_button = TextButton((button_left,
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
257 test_button.rect.bottom + button_padding),
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
258 'Help')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
259 help_button.add_callback('clicked', self.show_help)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
260
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
261 if self.mode == "Tiles":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
262 tile_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
263 elif self.mode == "Things":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
264 thing_button.disable()
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
265 elif self.mode == "Sprites":
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
266 sprite_button.disable()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
267 elif self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
268 test_button.disable()
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
269 self.container.add(tile_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
270 self.container.add(thing_button)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
271 self.container.add(sprite_button)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
272 self.container.add(test_button)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
273 self.container.add(help_button)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
274
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
275 button_height = LOAD_SAVE_HEIGHT
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
276
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
277 upload = TextButton((button_left, button_height), "Upload Level")
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
278 upload.add_callback('clicked', self.upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
279 self.container.add(upload)
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
280
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
281 mainmenu = TextButton((upload.rect.right + button_padding,
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
282 button_height), 'Exit')
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
283 mainmenu.add_callback('clicked', self.go_mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
284 self.container.add(mainmenu)
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
285
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
286 button_height = upload.rect.bottom + button_padding
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
287
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
288 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
289 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
290 self.container.add(new)
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
291
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
292 load = TextButton((new.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
293 "Load")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
294 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
295 self.container.add(load)
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
296
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
297 save = TextButton((load.rect.right + button_padding, button_height),
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
298 "Save")
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
299 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
300 self.container.add(save)
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
301
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
302 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
303 save.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
304 load.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
305 new.disable()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
306
172
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
307 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
308 self.edit_widget.set_tool(new_tool)
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
309 self.current_tool.text = 'Tool: %s' % text
dabf13abb3fd Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents: 170
diff changeset
310 self.current_tool.prepare()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
311 return True
174
893fb9f8f468 Hook up basic saving
Neil Muller <drnlmuller@gmail.com>
parents: 172
diff changeset
312
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
313 def show_help(self, ev, widget):
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
314 message = MessageBox((20, 20), HELP_MSG, color="black",
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
315 fontsize=12)
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
316 self.display_dialog(message)
540
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
317 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
318
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
319 def go_mainmenu(self, ev, widget):
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
320 from mamba.habitats.mainmenu import MainMenu
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
321 NewHabitatEvent.post(MainMenu())
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
322 return True
efe1b61aad08 Start of help and an exit button.
Simon Cross <hodgestar@gmail.com>
parents: 533
diff changeset
323
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
324 def check_level(self):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
325 message = None
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
326 if not self.level.level_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
327 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
328 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
329 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
330 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
331 message = MessageBox((300, 300), 'Illegal level name')
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
332
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
333 if message is None:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
334 try:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
335 self.level.validate_level()
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
336 except InvalidMapError, error:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
337 message = MessageBox((300, 300), "Map isn't valid\n%s" % error)
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
338
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
339 return message
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
340
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
341 def save(self, ev, widget):
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
342 message = self.check_level()
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
343 if message:
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
344 self.display_dialog(message)
544
13d02d1f5ae0 Add help to editor.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
345 return True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
346 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
347 self.refresh_display()
521
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
348 message = MessageBox((300, 300),
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
349 'Success!\nYou have saved a user level')
8a3884201d00 Save success dialog
Neil Muller <drnlmuller@gmail.com>
parents: 512
diff changeset
350 self.display_dialog(message)
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
351 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
352
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
353 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
354 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
355
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
356 def upload(self, ev, widget):
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
357 message = self.check_level()
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
358 if message:
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
359 self.display_dialog(message)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
360 return True
489
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
361 save_file = StringIO()
e522db37e5c5 Refactor level saving to allow saving to a passed in file (e.g. StringIO object).
Simon Cross <hodgestar@gmail.com>
parents: 485
diff changeset
362 self.level.save_level(save_file=save_file)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
363
494
72976997bdd9 Use LEVEL_SERVER from constants.
Simon Cross <hodgestar@gmail.com>
parents: 490
diff changeset
364 url = "%s/save/%s" % (LEVEL_SERVER, self.level.level_name)
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
365 args = urllib.urlencode([('data', save_file.getvalue())])
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
366 try:
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
367 result = urllib2.urlopen(url, args)
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
368 mtxt = result.read()
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
369 except:
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
370 mtxt = "Failed to upload level. :("
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
371 else:
533
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
372 mtxt = "Success! %s\n%s" % (mtxt,
cb9ee0ba01ce Explain curation in upload dialog box.
Simon Cross <hodgestar@gmail.com>
parents: 521
diff changeset
373 "Your level is now awaiting curation.")
490
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
374
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
375 message = MessageBox((300, 300), mtxt)
be1e22e3f17c Finish hooking up level uploading.
Simon Cross <hodgestar@gmail.com>
parents: 489
diff changeset
376 self.display_dialog(message)
485
e4e9e607e6f9 Factor out level checking messages for re-use in upload.
Simon Cross <hodgestar@gmail.com>
parents: 481
diff changeset
377 return True
481
68898de788cc Add upload button to editor.
Simon Cross <hodgestar@gmail.com>
parents: 479
diff changeset
378
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
379 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
380 if level_dir is None:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
381 level_dir = 'user_levels'
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
382 is_user_dir = True
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
383 self.container.paused = True
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
384 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
385 load_list = []
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
386 for level_name in levels:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
387 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
388 continue
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
389 if subdir:
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
390 level_name = '/'.join([subdir, level_name])
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
391 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
392 load_button.add_callback(
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
393 '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
394 load_list.append(load_button)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
395 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
396 return True
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
397
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
398 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
399 try:
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 396
diff changeset
400 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
401 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
402 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
403 except (IOError, InvalidMapError, pygame.error), error:
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
404 message = MessageBox((300, 300),
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
405 'Loading Level Failed: %s' % error, color='red')
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
406 self.display_dialog(message)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
407 return False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
408 self.container.remove(self.edit_widget)
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
409 self.level = new_level
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
410 if level_name in RESERVED_NAMES:
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
411 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
412 self.container.paused = False
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
413 self.edit_widget = EditLevelWidget(self.level)
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
414 self.edit_widget.add_callback(SnakeDiedEvent, self.halt_test)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
415 self.edit_widget.add_callback(LevelCompletedEvent, self.halt_test)
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
416 self.replays = {}
272
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
417 self.container.add(self.edit_widget)
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
418 self.clear_toolbar()
a061dd62127c Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 270
diff changeset
419 self.setup_toolbar()
387
f86188a0f259 Tweak load list length
Neil Muller <drnlmuller@gmail.com>
parents: 363
diff changeset
420 return True
270
3c95ba7408f1 Add protected level name list. Add load & new buttons
Neil Muller <drnlmuller@gmail.com>
parents: 267
diff changeset
421
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
422 def change_toolbar(self, ev, widget, new_mode):
553
a2648295b7cf Only stop test if we were just testing (otherwise the level gets cleared).
Simon Cross <hodgestar@gmail.com>
parents: 552
diff changeset
423 old_mode = self.mode
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
424 if new_mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
425 try:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
426 self.level.validate_level()
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
427 except InvalidMapError, error:
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
428 # Fail to change mode on invalid maps
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
429 message = MessageBox((300, 300), "Map isn't valid\n%s" % error)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
430 self.display_dialog(message)
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
431 return True
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
432 self.mode = new_mode
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
433 self.edit_widget.tile_mode = (self.mode in ('Tiles', 'Sprites'))
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
434 self.clear_toolbar()
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
435 self.setup_toolbar()
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
436 if self.mode == 'Test':
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
437 self.edit_widget.start_test()
553
a2648295b7cf Only stop test if we were just testing (otherwise the level gets cleared).
Simon Cross <hodgestar@gmail.com>
parents: 552
diff changeset
438 elif old_mode == 'Test':
551
9d3ed4d05f55 Hack in test level mode to editor
Neil Muller <drnlmuller@gmail.com>
parents: 544
diff changeset
439 self.edit_widget.stop_test()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
440 return True
180
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
441
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
442 def clear_toolbar(self):
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
443 """Remove every non-edit widget from the container"""
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
444 for widget in self.container.children[:]:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
445 if widget is not self.edit_widget:
d9ee0e50a78f Teach editor about THING_MAP
Neil Muller <drnlmuller@gmail.com>
parents: 175
diff changeset
446 self.container.remove(widget)
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
447
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
448 def do_edit(self, ev, widget, message, init_value, callback):
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
449 self.display_dialog(
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
450 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
451 return True
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
452
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
453 def unpause(self):
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
454 self.container.paused = False
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
455
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
456 def update_level_data(self, filename, name, tileset, track):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
457
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
458 self.level.name = name
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
459 self.level.background_track = track
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
460 # err_ts = self.change_tileset(tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
461 err_fn = self.check_file(filename)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
462
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
463 self.clear_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
464 self.setup_toolbar()
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
465
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
466 if err_fn:
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
467 err_fn.post_callback = self.unpause
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
468 self.display_dialog(err_fn)
512
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
469 else:
0ccdcc970ae2 Improved unpausing in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents: 508
diff changeset
470 self.container.paused = False
325
00c36ff53de9 Teach editor about background tracks
Neil Muller <drnlmuller@gmail.com>
parents: 314
diff changeset
471
279
162bddbbc5d0 Protect against bad tilesets as well
Neil Muller <drnlmuller@gmail.com>
parents: 278
diff changeset
472 def refresh_display(self):
275
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
473 self.level.restart()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
474 self.clear_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
475 self.setup_toolbar()
51bec5e6191e Rework selecting tilesets
Neil Muller <drnlmuller@gmail.com>
parents: 272
diff changeset
476 return True
236
09247e08aeda Refactor edit calling code. Tweak toolbar layout
Neil Muller <drnlmuller@gmail.com>
parents: 229
diff changeset
477
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
478 def change_tileset(self, new_tileset):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
479 print "changing tileset"
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
480 self.level.update_tiles_ascii()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
481 old_tileset = self.level.tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
482 try:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
483 self.level.tileset = Tileset(new_tileset)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
484 self.level.restart()
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
485 return None
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
486 except pygame.error, error:
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
487 self.level.tileset = old_tileset
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
488 return MessageBox(
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
489 (300, 300), 'Unable to change tileset:: %s' % error,
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
490 color='red')
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
491
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
492 def check_file(self, new_name):
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
493 message = None
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
494 if new_name == self.level.level_name:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
495 return None # No-op change
276
9c57025781e7 Warn on enter filename results
Neil Muller <drnlmuller@gmail.com>
parents: 275
diff changeset
496 if not new_name:
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
497 message = MessageBox((300, 300), 'Please enter a name')
277
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
498 if new_name in RESERVED_NAMES:
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
499 # This case is caught by the existance check, but the
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
500 # importance of the reserved names means we use a different
82aa91664e27 Warn on save failures
Neil Muller <drnlmuller@gmail.com>
parents: 276
diff changeset
501 # message
278
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
502 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
503 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
504 message = MessageBox((300, 300), 'Name already in use')
f10d06fc64b2 Add some robustness against broken levels
Neil Muller <drnlmuller@gmail.com>
parents: 277
diff changeset
505 if message:
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
506 return message
229
b0ef7eecc67a Make filename editable
Neil Muller <drnlmuller@gmail.com>
parents: 180
diff changeset
507 self.level.level_name = new_name
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
508 return None
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
509
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
510 def sprite_tool(self, ev, widget, sprite_mode, cls_name, sprite_cls):
284
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
511 """Handle sprite stuff"""
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
512 self.sprite_mode = sprite_mode
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
513 self.sprite_cls_name = cls_name
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
514 self.sprite_cls = sprite_cls
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
515 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
516 self.clear_toolbar()
96b4ad9b4d30 Start work on sprite editor. Tweak layout issues
Neil Muller <drnlmuller@gmail.com>
parents: 279
diff changeset
517 self.setup_toolbar()
337
170d4a43c00e Don't edit the level when interacting with dialogs
Neil Muller <drnlmuller@gmail.com>
parents: 325
diff changeset
518 return True
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
519
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
520 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
521 """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
522 if self.mode != 'Sprites':
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
523 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
524 if self.container.paused:
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
525 return False
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
526 tile_pos = self.edit_widget.convert_pos(ev.pos)
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
527 sprite, sprite_ascii = self.level.get_sprite_at(tile_pos)
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
528 if self.sprite_mode == 'Delete' and sprite:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
529 self.level.remove_sprite(sprite_ascii)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
530 self.level.restart()
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
531 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
532 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
533 elif self.sprite_mode == 'Add' and sprite is None:
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
534 self.edit_sprite(tile_pos,
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
535 (self.sprite_cls_name, self.sprite_cls, None, []))
343
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
536 return True
5bf35267ddc0 Hook up sprite deletion. Framework work for sprite editing & adding
Neil Muller <drnlmuller@gmail.com>
parents: 337
diff changeset
537
508
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
538 def edit_sprite(self, tile_pos, sprite_info):
6c61d5862310 Massive speical sprite editor rewrite
Neil Muller <drnlmuller@gmail.com>
parents: 494
diff changeset
539 sprite_editor = EditSpriteBox((200, 100), tile_pos, sprite_info,
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
540 post_callback=self.commit_line)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
541 self.display_dialog(sprite_editor)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
542
454
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
543 def edit_level_data(self, ev, widget):
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
544 elb = EditLevelBox((200, 100), self.level, self.update_level_data)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
545 self.display_dialog(elb)
8cfa757dd7d3 Epic level editor reworking.
Jeremy Thurgood <firxen@gmail.com>
parents: 423
diff changeset
546
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
547 def commit_line(self, sprite):
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
548 try:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
549 self.level.validate_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
550 except:
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
551 # 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
552 # we catch everything
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
553 # We use sys.exc_info to get slight neater info
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
554 exc_type, info, _ = sys.exc_info()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
555 info = traceback.format_exception_only(exc_type, info)[0]
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
556 message = MessageBox((300, 300),
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
557 'Validation failed:\n%s' % info)
404
38f95fbc3710 Better dialog handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
558 self.display_dialog(message)
353
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
559 return False
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
560 # Validation successful, so add to level
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
561 if self.sprite_mode == 'Add':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
562 self.level.add_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
563 elif self.sprite_mode == 'Edit':
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
564 self.level.replace_sprite(sprite)
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
565 self.level.restart()
62a2a659c69b Call sprite editor dialog
Neil Muller <drnlmuller@gmail.com>
parents: 343
diff changeset
566 return True
555
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
567
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
568 def store_replay(self, ev, widget, number):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
569 self.replays[number] = self.edit_widget.get_replay()
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
570
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
571 def do_replay(self, ev, widget, number):
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
572 if number:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
573 # We do nothing if the user tries to replay something thay
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
574 # isn't there
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
575 if number in self.replays:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
576 # Replay stored replay
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
577 self.edit_widget.replay(self.replays[number])
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
578 else:
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
579 # Replaying last run
c014f5023cd2 Test run replays
Neil Muller <drnlmuller@gmail.com>
parents: 553
diff changeset
580 self.edit_widget.replay()