comparison clients/editor/plugins/LayerTool.py @ 343:8e71629c4c43

Several changes to layer, camera and map dialogs: * Renamed CameraEditor and LayerEditor to CameraDialog and LayerDialog * Moved CameraDialog and LayerDialog into their own modules in scripts.gui so other components can use them. * Prettier camera dialog * Added LayerDialog to map wizard
author cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
date Tue, 25 Aug 2009 01:21:00 +0000
parents 7e5717105212
children 8f64a9d1e7ab
comparison
equal deleted inserted replaced
342:7be6293f13d1 343:8e71629c4c43
29 from scripts.events import * 29 from scripts.events import *
30 from scripts.gui.action import Action 30 from scripts.gui.action import Action
31 import pychan 31 import pychan
32 import pychan.widgets as widgets 32 import pychan.widgets as widgets
33 from pychan.tools import callbackWithArguments as cbwa 33 from pychan.tools import callbackWithArguments as cbwa
34 from scripts.gui.layerdialog import LayerDialog
34 35
35 # default should be pychan default, highlight can be choosen (format: r,g,b) 36 # default should be pychan default, highlight can be choosen (format: r,g,b)
36 _DEFAULT_BACKGROUND_COLOR = pychan.internal.DEFAULT_STYLE['default']['base_color'] 37 _DEFAULT_BACKGROUND_COLOR = pychan.internal.DEFAULT_STYLE['default']['base_color']
37 _HIGHLIGHT_BACKGROUND_COLOR = pychan.internal.DEFAULT_STYLE['default']['selection_color'] 38 _HIGHLIGHT_BACKGROUND_COLOR = pychan.internal.DEFAULT_STYLE['default']['selection_color']
38 39
160 161
161 def showLayerWizard(self): 162 def showLayerWizard(self):
162 if not self._mapview: return 163 if not self._mapview: return
163 164
164 if self._layer_wizard: self._layer_wizard._widget.hide() 165 if self._layer_wizard: self._layer_wizard._widget.hide()
165 self._layer_wizard = LayerEditor(self._editor.getEngine(), self._mapview.getMap(), callback=self._layerCreated) 166 self._layer_wizard = LayerDialog(self._editor.getEngine(), self._mapview.getMap(), callback=self._layerCreated)
166 167
167 def _layerCreated(self, layer): 168 def _layerCreated(self, layer):
168 self.update(self._mapview) 169 self.update(self._mapview)
169 self.select_active_layer(None, self.wrapper.findChild(name=_LABEL_NAME_PREFIX + layer.getId())) 170 self.select_active_layer(None, self.wrapper.findChild(name=_LABEL_NAME_PREFIX + layer.getId()))
170 171
172 if not self._mapview: return 173 if not self._mapview: return
173 layer = self.getActiveLayer() 174 layer = self.getActiveLayer()
174 if not layer: return 175 if not layer: return
175 176
176 if self._layer_wizard: self._layer_wizard._widget.hide() 177 if self._layer_wizard: self._layer_wizard._widget.hide()
177 self._layer_wizard = LayerEditor(self._editor.getEngine(), self._mapview.getMap(), layer=layer, callback=cbwa(self.update, self._mapview)) 178 self._layer_wizard = LayerDialog(self._editor.getEngine(), self._mapview.getMap(), layer=layer, callback=cbwa(self.update, self._mapview))
178 179
179 def clear(self): 180 def clear(self):
180 """ remove all subwrappers """ 181 """ remove all subwrappers """
181 if self.subwrappers is []: return 182 if self.subwrappers is []: return
182 183
241 subwrapper.addChild(layerLabel) 242 subwrapper.addChild(layerLabel)
242 243
243 self.wrapper.addChild(subwrapper) 244 self.wrapper.addChild(subwrapper)
244 self.subwrappers.append(subwrapper) 245 self.subwrappers.append(subwrapper)
245 246
246 self.container.adaptLayout(False) 247 self.container.adaptLayout()
247 248
248 def toggle_layer_visibility(self, event, widget): 249 def toggle_layer_visibility(self, event, widget):
249 """ Callback for ToggleButtons 250 """ Callback for ToggleButtons
250 251
251 Toggle the chosen layer visible / invisible 252 Toggle the chosen layer visible / invisible
312 layerid = widget.name[len(_LABEL_NAME_PREFIX):] 313 layerid = widget.name[len(_LABEL_NAME_PREFIX):]
313 314
314 widget.background_color = _HIGHLIGHT_BACKGROUND_COLOR 315 widget.background_color = _HIGHLIGHT_BACKGROUND_COLOR
315 widget.foreground_color = _HIGHLIGHT_BACKGROUND_COLOR 316 widget.foreground_color = _HIGHLIGHT_BACKGROUND_COLOR
316 widget.base_color = _HIGHLIGHT_BACKGROUND_COLOR 317 widget.base_color = _HIGHLIGHT_BACKGROUND_COLOR
317 self.container.adaptLayout(False)
318 318
319 self._mapview.getController().selectLayer(layerid) 319 self._mapview.getController().selectLayer(layerid)
320 320
321 def toggle(self): 321 def toggle(self):
322 """ toggles the layertool visible / invisible and sets 322 """ toggles the layertool visible / invisible and sets
331 self.container.show() 331 self.container.show()
332 self._showAction.setChecked(True) 332 self._showAction.setChecked(True)
333 self._adjust_position() 333 self._adjust_position()
334 334
335 335
336 class LayerEditor(object): 336
337 """ The B{LayerEditor} provides a gui dialog for creating and editing layers.
338
339 FIXME:
340 - gridtypes can only be square for now
341 - pathing strategy
342 """
343 def __init__(self, engine, map, callback=None, onCancel=None, layer=None):
344 self.engine = engine
345 self.model = engine.getModel()
346 self.map = map
347 self.layer = layer
348 self.callback = callback
349 self.onCancel = onCancel
350 self._widget = pychan.loadXML('gui/layereditor.xml')
351
352 # TODO: Add access method for adopted grid types?
353 self._widget.findChild(name="gridBox").items = ['square', 'hexagonal']
354
355 # TODO: Ditto for pather?
356 self._widget.findChild(name="pathingBox").items = ['cell_edges_only', 'cell_edges_and_diagonals', 'freeform']
357
358 if layer:
359 cg = layer.getCellGrid()
360 cgtype = 0
361 if cg.getType() == 'hexagonal':
362 cgtype = 1
363
364 self._widget.distributeData({
365 "layerBox" : unicode(layer.getId()),
366 "xScaleBox" : unicode(cg.getXScale()),
367 "yScaleBox" : unicode(cg.getYScale()),
368 "rotBox" : unicode(cg.getRotation()),
369 "xOffsetBox" : unicode(cg.getXShift()),
370 "yOffsetBox" : unicode(cg.getYShift())
371 })
372
373 self._widget.findChild(name="pathingBox").selected = int(layer.getPathingStrategy())
374 self._widget.findChild(name="gridBox").selected = int(cgtype)
375 else:
376 self._widget.findChild(name="pathingBox").selected = 0
377 self._widget.findChild(name="gridBox").selected = 0
378
379 self._widget.mapEvents({
380 'okButton' : self._finished,
381 'cancelButton' : self._cancelled
382 })
383
384 self._widget.show()
385
386 def _cancelled(self):
387 """ """
388 if self.onCancel:
389 self.onCancel()
390 self._widget.hide()
391
392 def _finished(self):
393 """ """
394 # Collect and validate data
395 layerId = self._widget.collectData('layerBox')
396 if layerId == '':
397 print 'Please enter a layer id.'
398 return
399
400 try:
401 x_offset = float(self._widget.collectData('xOffsetBox'))
402 y_offset = float(self._widget.collectData('yOffsetBox'))
403 except ValueError:
404 print 'Please enter integer or decimal values for offset.'
405 return
406
407 try:
408 x_scale = float(self._widget.collectData('xScaleBox'))
409 y_scale = float(self._widget.collectData('yScaleBox'))
410 except ValueError:
411 print 'Please enter integer or decimal values for scale.'
412 return
413
414 try:
415 rotation = float(self._widget.collectData('rotBox'))
416 except ValueError:
417 print 'Please enter integer or decimal value for rotation.'
418 return
419
420 grid_type = int(self._widget.collectData('gridBox'))
421 pathing = int(self._widget.collectData('pathingBox'))
422
423 if grid_type == 0:
424 grid_type = "square"
425 else:
426 grid_type = "hexagonal"
427
428 # Set up layer
429 layer = self.layer
430 cellgrid = None
431
432 cellgrid = self.model.getCellGrid(grid_type)
433 if not cellgrid:
434 print "Invalid grid type"
435 return
436
437 cellgrid.setRotation(rotation)
438 cellgrid.setXScale(x_scale)
439 cellgrid.setYScale(y_scale)
440 cellgrid.setXShift(x_offset)
441 cellgrid.setYShift(y_offset)
442
443 if not self.layer:
444 try:
445 layer = self.map.createLayer(str(layerId), cellgrid)
446
447 except fife.NameClash:
448 print 'The layer ' + str(layerId) + ' already exists!'
449 return
450 else:
451 layer.setCellGrid(cellgrid)
452 try:
453 layer.setId(str(layerId))
454 except fife.NameClash:
455 print 'The layer ' + str(layerId) + ' already exists!'
456 return
457
458 layer.setPathingStrategy(pathing)
459
460 self.engine.getView().resetRenderers()
461
462 # Hide dialog and call back
463 self._widget.hide()
464
465 if self.callback:
466 pychan.tools.applyOnlySuitable(self.callback, layer=layer)
467