diff clients/editor/scripts/editor.py @ 255:51cc05d862f2

Merged editor_rewrite branch to trunk. This contains changes that may break compatibility against existing clients. For a list of changes that may affect your client, see: http://wiki.fifengine.de/Changes_to_pychan_and_FIFE_in_editor_rewrite_branch
author cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
date Mon, 08 Jun 2009 16:00:02 +0000
parents
children 043d71a192b5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clients/editor/scripts/editor.py	Mon Jun 08 16:00:02 2009 +0000
@@ -0,0 +1,399 @@
+from basicapplication import ApplicationBase
+import pychan
+import fife
+import loaders
+import events
+import plugin
+from mapview import MapView
+from events import EventListener
+from events import *
+from gui import ToolBar, action
+from gui.action import Action, ActionGroup
+from gui.filemanager import FileManager
+from gui.mainwindow import MainWindow
+from gui.mapeditor import MapEditor
+from gui.menubar import Menu, MenuBar
+from gui.error import ErrorDialog
+from settings import Settings
+from pychan.tools import callbackWithArguments as cbwa
+import sys
+
+def getEditor():
+	""" Returns the Global editor instance """
+	if Editor.editor is None:
+		Editor(None)
+	return Editor.editor
+
+class Editor(ApplicationBase, MainWindow):
+	""" Editor sets up all subsystems and provides access to them """
+	editor = None
+
+	def __init__(self, params, *args, **kwargs):
+		Editor.editor = self
+	
+		self._filemanager = None
+	
+		self.params = params
+		self._eventlistener = None
+		self._pluginmanager = None
+		
+		self._inited = False
+		
+		self._mapview = None
+		self._mapviewList = []
+		self._mapgroup = None
+		self._mapbar = None
+		self._maparea = None
+		self._mapeditor = None
+		
+		self._fileMenu = None
+		self._editMenu = None
+		self._viewMenu = None
+		self._toolsMenu = None
+		self._helpMenu = None
+		
+		self._settings = None
+		
+		self._helpDialog = None
+	
+		ApplicationBase.__init__(self, *args, **kwargs)
+		MainWindow.__init__(self, *args, **kwargs)
+		pychan.init(self.engine, debug=False)
+		
+
+	def loadSettings(self):
+		"""
+		Load the settings from a python file and load them into the engine.
+		Called in the ApplicationBase constructor.
+		"""
+		self._settings = Settings()
+		TDS = self._settings
+		
+		glyphDft = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?-+/():;%&`'*#=[]\\\""
+		engineSetting = self.engine.getSettings()
+		engineSetting.setDefaultFontGlyphs(TDS.get("FIFE", "FontGlyphs", glyphDft))
+		engineSetting.setDefaultFontPath(TDS.get("FIFE", "Font", "fonts/FreeSans.ttf"))
+		engineSetting.setDefaultFontSize(12)
+		engineSetting.setBitsPerPixel(TDS.get("FIFE", "BitsPerPixel", 0))
+		engineSetting.setInitialVolume(TDS.get("FIFE", "InitialVolume", 5.0))
+		engineSetting.setSDLRemoveFakeAlpha(TDS.get("FIFE", "SDLRemoveFakeAlpha", 1))
+		engineSetting.setScreenWidth(TDS.get("FIFE", "ScreenWidth", 1024))
+		engineSetting.setScreenHeight(TDS.get("FIFE", "ScreenHeight", 768))
+		engineSetting.setRenderBackend(TDS.get("FIFE", "RenderBackend", "OpenGL"))
+		engineSetting.setFullScreen(TDS.get("FIFE", "FullScreen", 0))
+
+		engineSetting.setWindowTitle(TDS.get("FIFE", "WindowTitle", "No window title set"))
+		engineSetting.setWindowIcon(TDS.get("FIFE", "WindowIcon", ""))
+		engineSetting.setImageChunkingSize(TDS.get("FIFE", "ImageChunkSize", 256))
+
+	def initLogging(self):
+		"""
+		Initialize the LogManager.
+		"""
+		import fifelog
+		
+		LogModules = self._settings.get("FIFE", "LogModules")
+		self.log = fifelog.LogManager(self.engine, self._settings.get("FIFE", "LogToPrompt"), self._settings.get("FIFE", "LogToFile"))
+		if LogModules:
+			self.log.setVisibleModules(*LogModules)
+		
+	def _initTools(self):
+		""" Initializes tools """
+		self._pluginmanager = plugin.PluginManager()
+		
+		self._filemanager = FileManager()
+		self._toolbar.adaptLayout()
+		self._mapeditor = MapEditor()
+		
+	def _initGui(self):
+		""" Sets up the GUI """
+		screen_width = self.engine.getSettings().getScreenWidth()
+		screen_height = self.engine.getSettings().getScreenHeight()
+		MainWindow.initGui(self, screen_width, screen_height)
+
+		self._toolbox = ToolBar(title=u"", orientation=1)
+		self._toolbox.position_technique = "explicit"
+		self._toolbox.position = (150, 150)
+		
+		self._mapbar = ToolBar(panel_size=20)
+		self._mapbar.setDocked(True)
+		
+		self._maparea = pychan.widgets.VBox()
+		self._maparea.opaque = False
+		self._maparea.is_focusable = True
+		
+		# Capture mouse and key events for EventListener
+		cw = self._maparea
+		cw.capture(self.__sendMouseEvent, "mouseEntered")
+		cw.capture(self.__sendMouseEvent, "mouseExited")
+		cw.capture(self.__sendMouseEvent, "mousePressed")
+		cw.capture(self.__sendMouseEvent, "mouseReleased")
+		cw.capture(self.__sendMouseEvent, "mouseClicked")
+		cw.capture(self.__sendMouseEvent, "mouseMoved")
+		cw.capture(self.__sendMouseEvent, "mouseWheelMovedUp")
+		cw.capture(self.__sendMouseEvent, "mouseWheelMovedDown")
+		cw.capture(self.__sendMouseEvent, "mouseDragged")
+		cw.capture(self.__sendKeyEvent, "keyPressed")
+		cw.capture(self.__sendKeyEvent, "keyReleased")
+		
+		self._centralwidget.addChild(self._mapbar)
+		self._centralwidget.addChild(self._maparea)
+		
+		self._initActions()
+		
+		self._toolbox.show()
+
+	def _initActions(self):
+		""" Initializes toolbar and menubar buttons """
+		exitAction = Action(u"Exit", "gui/icons/quit.png")
+		exitAction.helptext = u"Exit program"
+		action.activated.connect(self.quit, sender=exitAction)
+		
+		self._fileMenu = Menu(name=u"File")
+		self._fileMenu.addAction(exitAction)
+		
+		self._editMenu = Menu(name=u"Edit")
+		self._viewMenu = Menu(name=u"View")
+		self._toolsMenu = Menu(name=u"Tools")
+		self._windowMenu = Menu(name=u"Window")
+		self._helpMenu = Menu(name=u"Help")
+		
+		self._actionShowStatusbar = Action(u"Statusbar")
+		self._actionShowStatusbar.helptext = u"Toggle statusbar"
+		action.activated.connect(self.toggleStatusbar, sender=self._actionShowStatusbar)
+		
+		self._actionShowToolbar = Action(u"Toolbar")
+		self._actionShowToolbar.helptext = u"Toggle toolbar"
+		action.activated.connect(self.toggleToolbar, sender=self._actionShowToolbar)
+		
+		self._actionShowToolbox = Action(u"Tool box")
+		self._actionShowToolbox.helptext = u"Toggle tool box"
+		action.activated.connect(self.toggleToolbox, sender=self._actionShowToolbox)
+		
+		self._viewMenu.addAction(self._actionShowStatusbar)
+		self._viewMenu.addAction(self._actionShowToolbar)
+		self._viewMenu.addAction(self._actionShowToolbox)
+		self._viewMenu.addSeparator()
+	
+	
+		testAction1 = Action(u"Cycle buttonstyles", "gui/icons/cycle_styles.png")
+		testAction1.helptext = u"Cycles button styles. There are currently four button styles."
+		action.activated.connect(self._actionActivated, sender=testAction1)
+		self._viewMenu.addAction(testAction1)
+		
+		self._mapgroup = ActionGroup(exclusive=True, name="Mapgroup")
+		self._mapbar.addAction(self._mapgroup)
+		self._mapbar.addAction(ActionGroup(exclusive=True, name="Mapgroup2"))
+		self._windowMenu.addAction(self._mapgroup)
+		
+		helpAction = Action(u"Help", "gui/icons/help.png")
+		action.activated.connect(self._showHelpDialog, sender=helpAction)
+		self._helpMenu.addAction(helpAction)
+		
+		self._menubar.addMenu(self._fileMenu)
+		self._menubar.addMenu(self._editMenu)
+		self._menubar.addMenu(self._viewMenu)
+		self._menubar.addMenu(self._toolsMenu)
+		self._menubar.addMenu(self._windowMenu)
+		self._menubar.addMenu(self._helpMenu)
+	
+	def _actionActivated(self, sender):
+		self._toolbar.button_style += 1
+		
+	def _showHelpDialog(self, sender):
+		""" Shows the help dialog """
+		if self._helpDialog is not None:
+			self._helpDialog.show()
+			return
+		
+		self._helpDialog = pychan.loadXML("gui/help.xml")
+		self._helpDialog.findChild(name="closeButton").capture(self._helpDialog.hide)
+		
+		f = open('lang/infotext.txt', 'r')
+		self._helpDialog.findChild(name="helpText").text = unicode(f.read())
+		f.close()
+		
+		self._helpDialog.show()
+		
+	def toggleStatusbar(self):
+		""" Toggles status bar """
+		statusbar = self.getStatusBar()
+		if statusbar.max_size[1] > 0:
+			statusbar.min_size=(statusbar.min_size[0], 0)
+			statusbar.max_size=(statusbar.max_size[0], 0)
+			self._actionShowStatusbar.setChecked(False)
+		else:
+			statusbar.min_size=(statusbar.min_size[0], statusbar.min_size[0])
+			statusbar.max_size=(statusbar.max_size[0], statusbar.max_size[0])
+			self._actionShowStatusbar.setChecked(True)
+		statusbar.adaptLayout()
+			
+	def toggleToolbar(self):
+		""" Toggles toolbar """
+		toolbar = self.getToolBar()
+		if toolbar.isVisible():
+			toolbar.setDocked(False)
+			toolbar.hide()
+			self._actionShowToolbar.setChecked(False)
+		else: 
+			tx = toolbar.x
+			ty = toolbar.y
+			toolbar.show()
+			toolbar.x = tx
+			toolbar.y = ty
+			self._actionShowToolbar.setChecked(True)
+			
+	def toggleToolbox(self):
+		""" Toggles tool box """
+		toolbox = self.getToolbox()
+		if toolbox.isVisible():
+			toolbox.setDocked(False)
+			toolbox.hide()
+			self._actionShowToolbox.setChecked(False)
+		else:
+			tx = toolbox.x
+			ty = toolbox.y
+			toolbox.show()
+			toolbox.x = tx
+			toolbox.y = ty
+			self._actionShowToolbox.setChecked(True)
+		toolbox.adaptLayout()
+			
+	def getToolbox(self): 
+		return self._toolbox
+	
+	def getPluginManager(self): 
+		return self._pluginmanager
+		
+	def getEngine(self): 
+		return self.engine
+
+	def getMapViews(self):
+		return self._mapviewList
+		
+	def getActiveMapView(self):
+		return self._mapview
+		
+	def getSettings(self):
+		return self._settings;
+		
+	def showMapView(self, mapview):
+		""" Switches to mapview. """
+		if mapview is None or mapview == self._mapview:
+			return
+			
+		events.preMapShown.send(sender=self, mapview=mapview)
+		self._mapview = mapview
+		self._mapview.show()
+		events.postMapShown.send(sender=self, mapview=mapview)
+
+	def createListener(self):
+		""" Creates the event listener. This is called by ApplicationBase """
+		if self._eventlistener is None:
+			self._eventlistener = EventListener(self.engine)
+		
+		return self._eventlistener
+		
+	def getEventListener(self):
+		""" Returns the event listener """
+		return self._eventlistener
+	
+	def newMapView(self, map):
+		""" Creates a new map view """
+		mapview = MapView(map)
+		
+		self._mapviewList.append(mapview)
+		
+		mapAction = Action(unicode(map.getId()))
+		action.activated.connect(cbwa(self.showMapView, mapview), sender=mapAction, weak=False)
+		self._mapgroup.addAction(mapAction)
+		
+		self.showMapView(mapview)
+		
+		events.mapAdded.send(sender=self, map=map)
+		
+		return mapview
+	
+	def openFile(self, path):
+		""" Opens a file """
+		try:
+			map = loaders.loadMapFile(path, self.engine)
+			return self.newMapView(map)
+		except:
+			errormsg = u"Opening map failed:\n"
+			errormsg += u"File: "+unicode(path)+"\n"
+			errormsg += u"Error: "+unicode(sys.exc_info()[1])
+			ErrorDialog(errormsg)
+			return None
+			
+	
+	def saveAll(self):
+		""" Saves all open maps """
+		tmpView = self._mapview
+		for mapView in self._mapviewList:
+			self._mapview = mapView
+			self._filemanager.save()
+		self._mapview = tmpView
+		
+	def quit(self):
+		""" Quits the editor. An onQuit signal is sent before the application closes """
+		events.onQuit.send(sender=self)
+		
+		self._settings.saveSettings()
+		ApplicationBase.quit(self)
+
+	def _pump(self):
+		""" Called once per frame """
+		# ApplicationBase and Engine should be done initializing at this point
+		if self._inited == False:
+			self._initGui()
+			self._initTools()
+			self._inited = True
+		
+		events.onPump.send(sender=self)
+		
+	def __sendMouseEvent(self, event, **kwargs):
+		""" Function used to capture mouse events for EventListener """
+		msEvent = fife.MouseEvent
+		type = event.getType()
+		
+		if type == msEvent.MOVED:
+			mouseMoved.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.PRESSED:
+			mousePressed.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.RELEASED:
+			mouseReleased.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.WHEEL_MOVED_DOWN:
+			mouseWheelMovedDown.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.WHEEL_MOVED_UP:
+			mouseWheelMovedUp.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.CLICKED:
+			mouseClicked.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.ENTERED:
+			mouseEntered.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.EXITED:
+			mouseExited.send(sender=self._maparea, event=event)
+			
+		elif type == msEvent.DRAGGED:
+			mouseDragged.send(sender=self._maparea, event=event)
+		
+	def __sendKeyEvent(self, event, **kwargs):
+		""" Function used to capture key events for EventListener """
+		type = event.getType()
+		
+		if type == fife.KeyEvent.PRESSED:
+			self._eventlistener.keyPressed(event)
+		
+		elif type == fife.KeyEvent.RELEASED:
+			self._eventlistener.keyReleased(event)
+			
+		
+
+		
\ No newline at end of file