changeset 363:714673208050

Adding the CameraEdit plugin to the editor. You must enable it in your settings.xml file. Still not fully tested.
author prock@33b003aa-7bff-0310-803a-e67f0ece8222
date Wed, 21 Oct 2009 15:19:59 +0000
parents 6da97ffede18
children c3443aa7be10
files clients/editor/plugins/CameraEdit.py
diffstat 1 files changed, 222 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clients/editor/plugins/CameraEdit.py	Wed Oct 21 15:19:59 2009 +0000
@@ -0,0 +1,222 @@
+# coding: utf-8
+# ###################################################
+# Copyright (C) 2008 The Zero-Projekt team
+# http://zero-projekt.net
+# info@zero-projekt.net
+# This file is part of Zero "Was vom Morgen blieb"
+#
+# The Zero-Projekt codebase is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+# ###################################################
+
+""" a tool for FIFEdit to edit object and instance attributes """
+
+import fife
+import pychan
+import pychan.widgets as widgets
+from pychan.tools import callbackWithArguments as cbwa
+
+from fife_timer import Timer
+
+import scripts
+import scripts.plugin as plugin
+from scripts.events import *
+from scripts.gui.action import Action
+
+
+import os
+try:
+	import xml.etree.cElementTree as ET
+except:
+	import xml.etree.ElementTree as ET
+
+import math
+
+
+class CameraEdit(plugin.Plugin):
+
+	def __init__(self):
+		self._enabled = False
+		
+		# Camera instance
+		self._camera = None
+		
+		# Editor instance
+		self._editor = None
+		
+		# Toolbar button to display Camera Editor
+		self._action_show = None
+		
+		# GUI
+		self._container = None
+		self._ok_button = None
+		self._cancel_button = None
+
+	def enable(self):
+		""" plugin method """
+		if self._enabled is True:
+			return
+		
+		self._editor = scripts.editor.getEditor()
+		#self._camera = self._editor.getActiveMapView().getCamera()
+		self._action_show = Action(u"Camera Editor", checkable=True)
+		scripts.gui.action.activated.connect(self.toggle, sender=self._action_show)
+		self._editor._tools_menu.addAction(self._action_show)
+		
+		self._createGui()
+		
+		self._enabled = True
+
+	def disable(self):
+		""" plugin method """
+		if self._enabled is False:
+			return
+			
+		self._container.setDocked(False)
+		self._container.hide()
+		
+		self._editor._tools_menu.removeAction(self._action_show)
+		
+		self._enabled = False
+			
+
+	def isEnabled(self):
+		""" plugin method """
+		return self._enabled;
+
+	def getName(self):
+		""" plugin method """
+		return "Camera Editor"
+		
+	def toggle(self):
+		"""	Toggles the cameratool visible / invisible and sets
+			dock status 
+		"""
+		if self._container.isVisible() or self._container.isDocked():
+			self._container.setDocked(False)
+			self._container.hide()
+
+			self._action_show.setChecked(False)
+		else:
+			self._container.show()
+			self.loadSettings()
+			self._action_show.setChecked(True)
+			self._adjustPosition()
+	
+	def saveSettings(self):
+		engine = self._editor.getEngine()
+	
+		id = self._container.collectData('idBox')
+		if id == '':
+			print 'Please enter a camera id.'
+			return
+	
+		try:
+			map = engine.getModel().getMap(str(self._container.collectData('mapBox')))
+		except fife.Exception:
+			print 'Cannot find the specified map id.'
+			return
+	
+		try:
+			layer = map.getLayer(str(self._container.collectData('layerBox')))
+		except fife.Exception:
+			print 'Cannot find the specified layer id.'	
+			return
+	
+		try:
+			vals = self._container.collectData('viewBox').split(',')
+			if len(vals) != 4:
+				raise ValueError	
+	
+			viewport = fife.Rect(*[int(c) for c in vals])
+		except ValueError:
+			print 'Please enter 4 comma (,) delimited values for viewport x,y,width,height.'
+			return
+	
+		try:
+			refh = int(self._container.collectData('refhBox'))
+			refw = int(self._container.collectData('refwBox'))
+		except ValueError:
+			print 'Please enter positive integer values for reference width and height.'
+			return
+	
+		try:
+			rot = int(self._container.collectData('rotBox'))
+			tilt = int(self._container.collectData('tiltBox'))
+		except ValueError:
+			print 'Please enter positive integer values for rotation and tilt.'
+			return
+	
+		self._camera = self._editor.getActiveMapView().getCamera()
+		self._camera.setId(str(id))
+		self._camera.getLocation().setLayer(layer)
+		self._camera.setViewPort(viewport)
+		self._camera.setCellImageDimensions(refw, refh)
+		self._camera.setRotation(rot)
+		self._camera.setTilt(tilt)
+		
+		self.toggle()
+
+	def loadSettings(self):
+		if self._editor.getActiveMapView() is None:
+			return
+		else:
+			self._camera = self._editor.getActiveMapView().getCamera()
+			
+			map = self._editor.getActiveMapView().getMap().getId()
+			self._container.findChild(name="mapBox").text = unicode(str(map))
+			
+			layer = self._camera.getLocation().getLayer().getId()
+			self._container.findChild(name="layerBox").text = unicode(layer)
+			
+			vp = self._camera.getViewPort()
+			viewport_str = unicode(str(vp.x) + "," + str(vp.y) + "," + str(vp.w) + "," + str(vp.h))
+			self._container.findChild(name="viewBox").text = viewport_str
+			
+			ref = self._camera.getCellImageDimensions()
+			refw_str = unicode(str(ref.x))
+			refh_str = unicode(str(ref.y))
+			self._container.findChild(name="refhBox").text = refh_str
+			self._container.findChild(name="refwBox").text = refw_str
+			
+			self._container.findChild(name="idBox").text = unicode(str(self._camera.getId()))
+			self._container.findChild(name="rotBox").text = unicode(str(int(self._camera.getRotation())))
+			self._container.findChild(name="tiltBox").text = unicode(str(int(self._camera.getTilt())))
+
+	def _createGui(self):
+		""" Create the basic gui container """
+		self._container =  pychan.loadXML('gui/cameradialog.xml')
+		
+		self._container.findChild(name="mapLabel").hide()
+		self._container.findChild(name="mapBox").hide()
+		
+		self._ok_button = self._container.findChild(name="okButton")
+		self._cancel_button = self._container.findChild(name="cancelButton")
+		
+		self._ok_button.capture(self.saveSettings)
+		self._ok_button.capture(cbwa(self._editor.getStatusBar().showTooltip, unicode("Save changes to the camera")), 'mouseEntered')
+		self._ok_button.capture(self._editor.getStatusBar().hideTooltip, 'mouseExited')
+
+		self._cancel_button.capture(self.toggle)
+		self._cancel_button.capture(cbwa(self._editor.getStatusBar().showTooltip, unicode("Discard any changes to the camera")), 'mouseEntered')
+		self._cancel_button.capture(self._editor.getStatusBar().hideTooltip, 'mouseExited')
+
+		
+	def _adjustPosition(self):
+		"""	Adjusts the position of the container - we don't want to
+		let the window appear at the center of the screen.
+		(new default position: left, beneath the tools window)
+		"""
+		self._container.position = (50, 200)
\ No newline at end of file