Mercurial > fife-parpg
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 |