Mercurial > fife-parpg
comparison clients/editor/plugins/LayerTool.py @ 319:62ec3b530cc6
* Improved layertool: Ability to add, remove and edit layers
* Removed an unused variable from XMLMapLoader
* Happy birthday Barra! =D
author | cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 16 Aug 2009 20:29:12 +0000 |
parents | 6add14ebe9f5 |
children | 7ddec4ce99b3 |
comparison
equal
deleted
inserted
replaced
318:e2ac8bb1a22c | 319:62ec3b530cc6 |
---|---|
57 self._mapview = None | 57 self._mapview = None |
58 | 58 |
59 self._showAction = None | 59 self._showAction = None |
60 | 60 |
61 self.subwrappers = [] | 61 self.subwrappers = [] |
62 | |
63 self._layer_wizard = None | |
62 | 64 |
63 #--- Plugin function ---# | 65 #--- Plugin function ---# |
64 def enable(self): | 66 def enable(self): |
65 """ """ | 67 """ """ |
66 if self._enabled is True: | 68 if self._enabled is True: |
101 | 103 |
102 def __create_gui(self): | 104 def __create_gui(self): |
103 """ create the basic gui container """ | 105 """ create the basic gui container """ |
104 self.container = pychan.loadXML('gui/layertool.xml') | 106 self.container = pychan.loadXML('gui/layertool.xml') |
105 self.wrapper = self.container.findChild(name="layers_wrapper") | 107 self.wrapper = self.container.findChild(name="layers_wrapper") |
108 self.removeLayerButton = self.container.findChild(name="remove_layer_button") | |
109 self.createLayerButton = self.container.findChild(name="add_layer_button") | |
110 self.editLayerButton = self.container.findChild(name="edit_layer_button") | |
111 self.removeLayerButton.capture(self.removeSelectedLayer) | |
112 self.createLayerButton.capture(self.showLayerWizard) | |
113 self.editLayerButton.capture(self.showEditDialog) | |
106 self.update(None) | 114 self.update(None) |
107 | 115 |
108 def _adjust_position(self): | 116 def _adjust_position(self): |
109 """ adjusts the position of the container - we don't want to | 117 """ adjusts the position of the container - we don't want to |
110 let the window appear at the center of the screen. | 118 let the window appear at the center of the screen. |
111 (new default position: left, beneath the tools window) | 119 (new default position: left, beneath the tools window) |
112 """ | 120 """ |
113 self.container.position = (50, 200) | 121 self.container.position = (50, 200) |
122 | |
123 def removeSelectedLayer(self): | |
124 if not self._mapview: return | |
125 | |
126 layer = self.getActiveLayer() | |
127 if not layer: return | |
128 | |
129 self.select_no_layer() | |
130 | |
131 map = self._mapview.getMap() | |
132 map.deleteLayer(layer) | |
133 self.update(self._mapview) | |
134 | |
135 def showLayerWizard(self): | |
136 if not self._mapview: return | |
137 | |
138 if self._layer_wizard: self._layer_wizard._widget.hide() | |
139 self._layer_wizard = LayerEditor(self._editor.getEngine(), self._mapview.getMap(), callback=cbwa(self.update, self._mapview)) | |
140 | |
141 def showEditDialog(self): | |
142 if not self._mapview: return | |
143 layer = self.getActiveLayer() | |
144 if not layer: return | |
145 | |
146 if self._layer_wizard: self._layer_wizard._widget.hide() | |
147 self._layer_wizard = LayerEditor(self._editor.getEngine(), self._mapview.getMap(), layer=layer, callback=cbwa(self.update, self._mapview)) | |
114 | 148 |
115 def clear(self): | 149 def clear(self): |
116 """ remove all subwrappers """ | 150 """ remove all subwrappers """ |
117 if self.subwrappers is []: return | 151 if self.subwrappers is []: return |
118 | 152 |
134 layers = self._mapview.getMap().getLayers() | 168 layers = self._mapview.getMap().getLayers() |
135 | 169 |
136 self.clear() | 170 self.clear() |
137 | 171 |
138 if len(layers) <= 0: | 172 if len(layers) <= 0: |
139 layerid = "No layers" | 173 if not self._mapview: |
174 layerid = "No map is open" | |
175 else: | |
176 layerid = "No layers" | |
140 subwrapper = pychan.widgets.HBox() | 177 subwrapper = pychan.widgets.HBox() |
141 | 178 |
142 layer_name_widget = pychan.widgets.Label() | 179 layerLabel = pychan.widgets.Label() |
143 layer_name_widget.text = unicode(layerid) | 180 layerLabel.text = unicode(layerid) |
144 layer_name_widget.name = _LABEL_NAME_PREFIX + layerid | 181 layerLabel.name = _LABEL_NAME_PREFIX + layerid |
145 subwrapper.addChild(layer_name_widget) | 182 subwrapper.addChild(layerLabel) |
146 | 183 |
147 self.wrapper.addChild(subwrapper) | 184 self.wrapper.addChild(subwrapper) |
148 self.subwrappers.append(subwrapper) | 185 self.subwrappers.append(subwrapper) |
149 | 186 |
150 active_layer = self.getActiveLayer() | 187 active_layer = self.getActiveLayer() |
152 active_layer = active_layer.getId() | 189 active_layer = active_layer.getId() |
153 for layer in reversed(layers): | 190 for layer in reversed(layers): |
154 layerid = layer.getId() | 191 layerid = layer.getId() |
155 subwrapper = pychan.widgets.HBox() | 192 subwrapper = pychan.widgets.HBox() |
156 | 193 |
157 visibility_widget = pychan.widgets.ToggleButton(hexpand=0, up_image="gui/icons/is_visible.png", down_image="gui/icons/is_visible.png", hover_image="gui/icons/is_visible.png") | 194 toggleVisibleButton = pychan.widgets.ToggleButton(hexpand=0, up_image="gui/icons/is_visible.png", down_image="gui/icons/is_visible.png", hover_image="gui/icons/is_visible.png") |
158 visibility_widget.name = "toggle_" + layerid | 195 toggleVisibleButton.name = "toggle_" + layerid |
159 if layer.areInstancesVisible(): | 196 if layer.areInstancesVisible(): |
160 visibility_widget.toggled = True | 197 toggleVisibleButton.toggled = True |
161 visibility_widget.capture(self.toggle_layer_visibility,"mousePressed") | 198 toggleVisibleButton.capture(self.toggle_layer_visibility) |
162 | 199 |
163 layer_name_widget = pychan.widgets.Label() | 200 layerLabel = pychan.widgets.Label() |
164 layer_name_widget.text = unicode(layerid) | 201 layerLabel.text = unicode(layerid) |
165 layer_name_widget.name = _LABEL_NAME_PREFIX + layerid | 202 layerLabel.name = _LABEL_NAME_PREFIX + layerid |
166 layer_name_widget.capture(self.select_active_layer,"mousePressed") | 203 layerLabel.capture(self.select_active_layer,"mousePressed") |
167 | 204 |
168 if active_layer == layerid: | 205 if active_layer == layerid: |
169 layer_name_widget.background_color = _HIGHLIGHT_BACKGROUND_COLOR | 206 layerLabel.background_color = _HIGHLIGHT_BACKGROUND_COLOR |
170 layer_name_widget.foreground_color = _HIGHLIGHT_BACKGROUND_COLOR | 207 layerLabel.foreground_color = _HIGHLIGHT_BACKGROUND_COLOR |
171 layer_name_widget.base_color = _HIGHLIGHT_BACKGROUND_COLOR | 208 layerLabel.base_color = _HIGHLIGHT_BACKGROUND_COLOR |
172 | 209 |
173 subwrapper.addChild(visibility_widget) | 210 subwrapper.addChild(toggleVisibleButton) |
174 subwrapper.addChild(layer_name_widget) | 211 subwrapper.addChild(layerLabel) |
175 | 212 |
176 self.wrapper.addChild(subwrapper) | 213 self.wrapper.addChild(subwrapper) |
177 self.subwrappers.append(subwrapper) | 214 self.subwrappers.append(subwrapper) |
178 | 215 |
179 self.container.adaptLayout(False) | 216 self.container.adaptLayout(False) |
262 self._showAction.setChecked(False) | 299 self._showAction.setChecked(False) |
263 else: | 300 else: |
264 self.container.show() | 301 self.container.show() |
265 self._showAction.setChecked(True) | 302 self._showAction.setChecked(True) |
266 self._adjust_position() | 303 self._adjust_position() |
304 | |
305 | |
306 class LayerEditor(object): | |
307 """ | |
308 LayerEditor provides a gui dialog for creating and editing layers. | |
309 """ | |
310 def __init__(self, engine, map, callback=None, onCancel=None, layer=None): | |
311 self.engine = engine | |
312 self.model = engine.getModel() | |
313 self.map = map | |
314 self.layer = layer | |
315 self.callback = callback | |
316 self.onCancel = onCancel | |
317 self._widget = pychan.loadXML('gui/layereditor.xml') | |
318 | |
319 # TODO: Add access method for adopted grid types? | |
320 self._widget.findChild(name="gridBox").items = ['square']#, 'hex'] # Hex does not work? | |
321 | |
322 # TODO: Ditto for pather? | |
323 self._widget.findChild(name="pathingBox").items = ['cell_edges_only', 'cell_edges_and_diagonals', 'freeform'] | |
324 | |
325 if layer: | |
326 cg = layer.getCellGrid() | |
327 cgtype = 0 | |
328 if cg.getType() == 'hex': | |
329 cgtype = 1 | |
330 | |
331 self._widget.distributeData({ | |
332 "layerBox" : unicode(layer.getId()), | |
333 "xScaleBox" : unicode(cg.getXScale()), | |
334 "yScaleBox" : unicode(cg.getYScale()), | |
335 "rotBox" : unicode(cg.getRotation()), | |
336 "xOffsetBox" : unicode(cg.getXShift()), | |
337 "yOffsetBox" : unicode(cg.getYShift()) | |
338 }) | |
339 | |
340 self._widget.findChild(name="pathingBox").selected = int(layer.getPathingStrategy()) | |
341 self._widget.findChild(name="gridBox").selected = int(cgtype) | |
342 else: | |
343 self._widget.findChild(name="pathingBox").selected = 0 | |
344 self._widget.findChild(name="gridBox").selected = 0 | |
345 | |
346 self._widget.mapEvents({ | |
347 'okButton' : self._finished, | |
348 'cancelButton' : self._cancelled | |
349 }) | |
350 | |
351 self._widget.show() | |
352 | |
353 def _cancelled(self): | |
354 if self.onCancel: | |
355 self.onCancel() | |
356 self._widget.hide() | |
357 | |
358 | |
359 def _finished(self): | |
360 # Collect and validate data | |
361 layerId = self._widget.collectData('layerBox') | |
362 if layerId == '': | |
363 print 'Please enter a layer id.' | |
364 return | |
365 | |
366 try: | |
367 x_offset = float(self._widget.collectData('xOffsetBox')) | |
368 y_offset = float(self._widget.collectData('yOffsetBox')) | |
369 except ValueError: | |
370 print 'Please enter integer or decimal values for offset.' | |
371 return | |
372 | |
373 try: | |
374 x_scale = float(self._widget.collectData('xScaleBox')) | |
375 y_scale = float(self._widget.collectData('yScaleBox')) | |
376 except ValueError: | |
377 print 'Please enter integer or decimal values for scale.' | |
378 return | |
379 | |
380 try: | |
381 rotation = float(self._widget.collectData('rotBox')) | |
382 except ValueError: | |
383 print 'Please enter integer or decimal value for rotation.' | |
384 return | |
385 | |
386 grid_type = int(self._widget.collectData('gridBox')) | |
387 pathing = int(self._widget.collectData('pathingBox')) | |
388 | |
389 if grid_type == 0: | |
390 grid_type = "square" | |
391 else: | |
392 grid_type = "hex" | |
393 | |
394 # Set up layer | |
395 layer = self.layer | |
396 cellgrid = None | |
397 if not self.layer: | |
398 # TODO: FIFE currently does not support setting layer ID and cellgrid after the layer has been created | |
399 cellgrid = self.model.getCellGrid(grid_type) | |
400 if not cellgrid: | |
401 print "Invalid grid type" | |
402 return | |
403 | |
404 cellgrid.setRotation(rotation) | |
405 cellgrid.setXScale(x_scale) | |
406 cellgrid.setYScale(y_scale) | |
407 cellgrid.setXShift(x_offset) | |
408 cellgrid.setYShift(y_offset) | |
409 | |
410 try: | |
411 layer = self.map.createLayer(str(layerId), cellgrid) | |
412 except: | |
413 print 'The layer ' + str(layerId) + ' already exists!' | |
414 return | |
415 else: | |
416 cellgrid = layer.getCellGrid() | |
417 cellgrid.setRotation(rotation) | |
418 cellgrid.setXScale(x_scale) | |
419 cellgrid.setYScale(y_scale) | |
420 cellgrid.setXShift(x_offset) | |
421 cellgrid.setYShift(y_offset) | |
422 | |
423 layer.setPathingStrategy(pathing) | |
424 | |
425 # Hide dialog and call back | |
426 self._widget.hide() | |
427 | |
428 if self.callback: | |
429 self.callback() | |
430 |