Mercurial > fife-parpg
diff clients/editor/scripts/events/events.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 | e249fa887259 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clients/editor/scripts/events/events.py Mon Jun 08 16:00:02 2009 +0000 @@ -0,0 +1,224 @@ +#from editor import getEditor # Needed to quit application + +import fife, scripts +from fife import IKeyListener, ICommandListener, IMouseListener, LayerChangeListener, MapChangeListener, ConsoleExecuter +from signal import Signal +import pdb + +#--- Signals ---# +onPump = Signal() +preSave = Signal(providing_args=["mapview"]) +postSave = Signal(providing_args=["mapview"]) +mapAdded = Signal(providing_args=["mapview"]) +preMapRemove = Signal(providing_args=["mapview"]) +postMapRemove = Signal(providing_args=["mapview"]) +preMapShown = Signal(providing_args=["mapview"]) +postMapShown = Signal(providing_args=["mapview"]) +onInstancesSelected = Signal(providing_args=["instances"]) +onObjectSelected = Signal(providing_args=["object"]) + +# Signals emitted by EventListener +onQuit = Signal(providing_args=[]) +keyPressed = Signal(providing_args=["event"]) +keyReleased = Signal(providing_args=["event"]) +mouseEntered = Signal(providing_args=["event"]) +mouseExited = Signal(providing_args=["event"]) +mousePressed = Signal(providing_args=["event"]) +mouseReleased = Signal(providing_args=["event"]) +mouseClicked = Signal(providing_args=["event"]) +mouseWheelMovedUp = Signal(providing_args=["event"]) +mouseWheelMovedDown = Signal(providing_args=["event"]) +mouseMoved = Signal(providing_args=["event"]) +mouseDragged = Signal(providing_args=["event"]) +onLayerChanged = Signal(providing_args=["layer", "changedInstances"]) +onInstanceCreate = Signal(providing_args=["layer", "instance"]) +onInstanceDelete = Signal(providing_args=["layer", "instance"]) +onMapChanged = Signal(providing_args=["map", "changedLayers"]) +onLayerCreate = Signal(providing_args=["map", "layer"]) +onLayerDelete = Signal(providing_args=["map", "layer"]) +onToolsClick = Signal(providing_args=[]) +onCommand = Signal(providing_args=["command"]) +onConsoleCommand= Signal(providing_args=["command"]) + +class KeySequence(object): + def __init__(self): + self.key = None + self.modifiers = {"alt":False,"ctrl":False,"shift":False,"meta":False} + self.signal = None + +class EventListener(IKeyListener, ICommandListener, IMouseListener, LayerChangeListener, MapChangeListener, ConsoleExecuter): + # NOTE: As FIFEdit currently covers the entire screen with widgets, + # FIFE doesn't receive any mouse or key events. Therefore we have to add + # mouse and key event tracking for the central widget + + def __init__(self, engine): + self.engine = engine + + eventmanager = self.engine.getEventManager() + self.keysequences = [] + + IKeyListener.__init__(self) + eventmanager.addKeyListener(self) + + ICommandListener.__init__(self) + eventmanager.addCommandListener(self) + + IMouseListener.__init__(self) + eventmanager.addMouseListener(self) + + ConsoleExecuter.__init__(self) + self.engine.getGuiManager().getConsole().setConsoleExecuter(self) + + MapChangeListener.__init__(self) + LayerChangeListener.__init__(self) + + self.controlPressed = False + self.altPressed = False + self.shiftPressed = False + self.metaPressed = False + + def getKeySequenceSignal(self, key, modifiers=[]): + # Parse modifiers + mods = {"alt":False,"ctrl":False,"shift":False,"meta":False} + for m in modifiers: + m = m.lower() + if m in mods: + mods[m] = True + else: + print "Unknown modifier:",m + + # Check if signal for keysequence has been created + for k in self.keysequences: + if k.key == key and k.modifiers == mods: + return k.signal + + # Create keysequence and signal + keysequence = KeySequence() + keysequence.key = key + keysequence.modifiers = mods + keysequence.signal = Signal(providing_args=["event"]) + self.keysequences.append(keysequence) + + return keysequence.signal + + #--- Listener methods ---# + # IKeyListener + def keyPressed(self, evt): + keyval = evt.getKey().getValue() + keystr = evt.getKey().getAsString().lower() + + self.controlPressed = evt.isControlPressed() + self.altPressed = evt.isAltPressed() + self.shiftPressed = evt.isShiftPressed() + self.metaPressed = evt.isMetaPressed() + + if keyval in (fife.Key.LEFT_CONTROL, fife.Key.RIGHT_CONTROL): + self.controlPressed = True + elif keyval in (fife.Key.LEFT_SHIFT, fife.Key.RIGHT_SHIFT): + self.shiftPressed = True + elif keyval in (fife.Key.LEFT_ALT, fife.Key.RIGHT_ALT): + self.altPressed = True + elif keyval in (fife.Key.RIGHT_META, fife.Key.LEFT_META): + self.metaPressed = True + + elif keyval == fife.Key.ESCAPE: + scripts.editor.getEditor().quit() + elif keyval == fife.Key.F10: + self.engine.getGuiManager().getConsole().toggleShowHide() + elif keystr == "d": + pdb.set_trace() + + # Check keysequences + for k in self.keysequences: + if k.modifiers["alt"] != self.altPressed: continue + if k.modifiers["ctrl"] != self.controlPressed: continue + if k.modifiers["shift"] != self.shiftPressed: continue + if k.modifiers["meta"] != self.metaPressed: continue + if keyval != k.key: continue + k.signal.send(sender=self, event=evt) + + keyPressed.send(sender=self.engine, event=evt) + + evt.consume() + + def keyReleased(self, evt): + keyval = evt.getKey().getValue() + + self.controlPressed = evt.isControlPressed() + self.altPressed = evt.isAltPressed() + self.shiftPressed = evt.isShiftPressed() + self.metaPressed = evt.isMetaPressed() + + if keyval in (fife.Key.LEFT_CONTROL, fife.Key.RIGHT_CONTROL): + self.controlPressed = False + elif keyval in (fife.Key.LEFT_SHIFT, fife.Key.RIGHT_SHIFT): + self.shiftPressed = False + elif keyval in (fife.Key.LEFT_ALT, fife.Key.RIGHT_ALT): + self.altPressed = False + elif keyval in (fife.Key.RIGHT_META, fife.Key.LEFT_META): + self.metaPressed = False + + keyReleased.send(sender=self.engine, event=evt) + + # ICommandListener + def onCommand(self, command): + if command.getCommandType() == fife.CMD_QUIT_GAME: + scripts.editor.getEditor().quit() + else: + onCommand.send(sender=self.engine, command=command) + + + # IMouseListener + def mouseEntered(self, evt): + mouseEntered.send(sender=self.engine, event=evt) + + def mouseExited(self, evt): + mouseExited.send(sender=self.engine, event=evt) + + def mousePressed(self, evt): + mousePressed.send(sender=self.engine, event=evt) + + def mouseReleased(self, evt): + mouseReleased.send(sender=self.engine, event=evt) + + def mouseClicked(self, evt): + mouseClicked.send(sender=self.engine, event=evt) + + def mouseWheelMovedUp(self, evt): + mouseWheelMovedUp.send(sender=self.engine, event=evt) + + def mouseWheelMovedDown(self, evt): + mouseWheelMovedDown.send(sender=self.engine, event=evt) + + def mouseMoved(self, evt): + mouseMoved.send(sender=self.engine, event=evt) + + def mouseDragged(self, evt): + mouseDragged.send(sender=self.engine, event=evt) + + # LayerChangeListener + def onLayerChanged(self, layer, changedInstances): + onLayerChanged.send(sender=self.engine, layer=layer, changedInstances=changedInstances) + + def onInstanceCreate(self, layer, instance): + onInstanceCreate.send(sender=self.engine, layer=layer, instance=instance) + + def onInstanceDelete(self, layer, instance): + onInstanceDelete.send(sender=self.engine, layer=layer, instance=instance) + + # MapChangeListener + def onMapChanged(self, map, changedLayers): + onMapChanged.send(sender=self.engine, map=map, changedLayers=changedLayers) + + def onLayerCreate(self, map, layer): + onLayerCreate.send(sender=self.engine, map=map, layer=layer) + + def onLayerDelete(self, map, layer): + onLayerDelete.send(sender=self.engine, map=map, layer=layer) + + # ConsoleExecuter + def onToolsClick(self): + onToolsClick.send(sender=self.engine) + + def onConsoleCommand(self, command): + onConsoleCommand.send(sender=self.engine, command=command)