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