comparison 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
comparison
equal deleted inserted replaced
254:10b5f7f36dd4 255:51cc05d862f2
1 #from editor import getEditor # Needed to quit application
2
3 import fife, scripts
4 from fife import IKeyListener, ICommandListener, IMouseListener, LayerChangeListener, MapChangeListener, ConsoleExecuter
5 from signal import Signal
6 import pdb
7
8 #--- Signals ---#
9 onPump = Signal()
10 preSave = Signal(providing_args=["mapview"])
11 postSave = Signal(providing_args=["mapview"])
12 mapAdded = Signal(providing_args=["mapview"])
13 preMapRemove = Signal(providing_args=["mapview"])
14 postMapRemove = Signal(providing_args=["mapview"])
15 preMapShown = Signal(providing_args=["mapview"])
16 postMapShown = Signal(providing_args=["mapview"])
17 onInstancesSelected = Signal(providing_args=["instances"])
18 onObjectSelected = Signal(providing_args=["object"])
19
20 # Signals emitted by EventListener
21 onQuit = Signal(providing_args=[])
22 keyPressed = Signal(providing_args=["event"])
23 keyReleased = Signal(providing_args=["event"])
24 mouseEntered = Signal(providing_args=["event"])
25 mouseExited = Signal(providing_args=["event"])
26 mousePressed = Signal(providing_args=["event"])
27 mouseReleased = Signal(providing_args=["event"])
28 mouseClicked = Signal(providing_args=["event"])
29 mouseWheelMovedUp = Signal(providing_args=["event"])
30 mouseWheelMovedDown = Signal(providing_args=["event"])
31 mouseMoved = Signal(providing_args=["event"])
32 mouseDragged = Signal(providing_args=["event"])
33 onLayerChanged = Signal(providing_args=["layer", "changedInstances"])
34 onInstanceCreate = Signal(providing_args=["layer", "instance"])
35 onInstanceDelete = Signal(providing_args=["layer", "instance"])
36 onMapChanged = Signal(providing_args=["map", "changedLayers"])
37 onLayerCreate = Signal(providing_args=["map", "layer"])
38 onLayerDelete = Signal(providing_args=["map", "layer"])
39 onToolsClick = Signal(providing_args=[])
40 onCommand = Signal(providing_args=["command"])
41 onConsoleCommand= Signal(providing_args=["command"])
42
43 class KeySequence(object):
44 def __init__(self):
45 self.key = None
46 self.modifiers = {"alt":False,"ctrl":False,"shift":False,"meta":False}
47 self.signal = None
48
49 class EventListener(IKeyListener, ICommandListener, IMouseListener, LayerChangeListener, MapChangeListener, ConsoleExecuter):
50 # NOTE: As FIFEdit currently covers the entire screen with widgets,
51 # FIFE doesn't receive any mouse or key events. Therefore we have to add
52 # mouse and key event tracking for the central widget
53
54 def __init__(self, engine):
55 self.engine = engine
56
57 eventmanager = self.engine.getEventManager()
58 self.keysequences = []
59
60 IKeyListener.__init__(self)
61 eventmanager.addKeyListener(self)
62
63 ICommandListener.__init__(self)
64 eventmanager.addCommandListener(self)
65
66 IMouseListener.__init__(self)
67 eventmanager.addMouseListener(self)
68
69 ConsoleExecuter.__init__(self)
70 self.engine.getGuiManager().getConsole().setConsoleExecuter(self)
71
72 MapChangeListener.__init__(self)
73 LayerChangeListener.__init__(self)
74
75 self.controlPressed = False
76 self.altPressed = False
77 self.shiftPressed = False
78 self.metaPressed = False
79
80 def getKeySequenceSignal(self, key, modifiers=[]):
81 # Parse modifiers
82 mods = {"alt":False,"ctrl":False,"shift":False,"meta":False}
83 for m in modifiers:
84 m = m.lower()
85 if m in mods:
86 mods[m] = True
87 else:
88 print "Unknown modifier:",m
89
90 # Check if signal for keysequence has been created
91 for k in self.keysequences:
92 if k.key == key and k.modifiers == mods:
93 return k.signal
94
95 # Create keysequence and signal
96 keysequence = KeySequence()
97 keysequence.key = key
98 keysequence.modifiers = mods
99 keysequence.signal = Signal(providing_args=["event"])
100 self.keysequences.append(keysequence)
101
102 return keysequence.signal
103
104 #--- Listener methods ---#
105 # IKeyListener
106 def keyPressed(self, evt):
107 keyval = evt.getKey().getValue()
108 keystr = evt.getKey().getAsString().lower()
109
110 self.controlPressed = evt.isControlPressed()
111 self.altPressed = evt.isAltPressed()
112 self.shiftPressed = evt.isShiftPressed()
113 self.metaPressed = evt.isMetaPressed()
114
115 if keyval in (fife.Key.LEFT_CONTROL, fife.Key.RIGHT_CONTROL):
116 self.controlPressed = True
117 elif keyval in (fife.Key.LEFT_SHIFT, fife.Key.RIGHT_SHIFT):
118 self.shiftPressed = True
119 elif keyval in (fife.Key.LEFT_ALT, fife.Key.RIGHT_ALT):
120 self.altPressed = True
121 elif keyval in (fife.Key.RIGHT_META, fife.Key.LEFT_META):
122 self.metaPressed = True
123
124 elif keyval == fife.Key.ESCAPE:
125 scripts.editor.getEditor().quit()
126 elif keyval == fife.Key.F10:
127 self.engine.getGuiManager().getConsole().toggleShowHide()
128 elif keystr == "d":
129 pdb.set_trace()
130
131 # Check keysequences
132 for k in self.keysequences:
133 if k.modifiers["alt"] != self.altPressed: continue
134 if k.modifiers["ctrl"] != self.controlPressed: continue
135 if k.modifiers["shift"] != self.shiftPressed: continue
136 if k.modifiers["meta"] != self.metaPressed: continue
137 if keyval != k.key: continue
138 k.signal.send(sender=self, event=evt)
139
140 keyPressed.send(sender=self.engine, event=evt)
141
142 evt.consume()
143
144 def keyReleased(self, evt):
145 keyval = evt.getKey().getValue()
146
147 self.controlPressed = evt.isControlPressed()
148 self.altPressed = evt.isAltPressed()
149 self.shiftPressed = evt.isShiftPressed()
150 self.metaPressed = evt.isMetaPressed()
151
152 if keyval in (fife.Key.LEFT_CONTROL, fife.Key.RIGHT_CONTROL):
153 self.controlPressed = False
154 elif keyval in (fife.Key.LEFT_SHIFT, fife.Key.RIGHT_SHIFT):
155 self.shiftPressed = False
156 elif keyval in (fife.Key.LEFT_ALT, fife.Key.RIGHT_ALT):
157 self.altPressed = False
158 elif keyval in (fife.Key.RIGHT_META, fife.Key.LEFT_META):
159 self.metaPressed = False
160
161 keyReleased.send(sender=self.engine, event=evt)
162
163 # ICommandListener
164 def onCommand(self, command):
165 if command.getCommandType() == fife.CMD_QUIT_GAME:
166 scripts.editor.getEditor().quit()
167 else:
168 onCommand.send(sender=self.engine, command=command)
169
170
171 # IMouseListener
172 def mouseEntered(self, evt):
173 mouseEntered.send(sender=self.engine, event=evt)
174
175 def mouseExited(self, evt):
176 mouseExited.send(sender=self.engine, event=evt)
177
178 def mousePressed(self, evt):
179 mousePressed.send(sender=self.engine, event=evt)
180
181 def mouseReleased(self, evt):
182 mouseReleased.send(sender=self.engine, event=evt)
183
184 def mouseClicked(self, evt):
185 mouseClicked.send(sender=self.engine, event=evt)
186
187 def mouseWheelMovedUp(self, evt):
188 mouseWheelMovedUp.send(sender=self.engine, event=evt)
189
190 def mouseWheelMovedDown(self, evt):
191 mouseWheelMovedDown.send(sender=self.engine, event=evt)
192
193 def mouseMoved(self, evt):
194 mouseMoved.send(sender=self.engine, event=evt)
195
196 def mouseDragged(self, evt):
197 mouseDragged.send(sender=self.engine, event=evt)
198
199 # LayerChangeListener
200 def onLayerChanged(self, layer, changedInstances):
201 onLayerChanged.send(sender=self.engine, layer=layer, changedInstances=changedInstances)
202
203 def onInstanceCreate(self, layer, instance):
204 onInstanceCreate.send(sender=self.engine, layer=layer, instance=instance)
205
206 def onInstanceDelete(self, layer, instance):
207 onInstanceDelete.send(sender=self.engine, layer=layer, instance=instance)
208
209 # MapChangeListener
210 def onMapChanged(self, map, changedLayers):
211 onMapChanged.send(sender=self.engine, map=map, changedLayers=changedLayers)
212
213 def onLayerCreate(self, map, layer):
214 onLayerCreate.send(sender=self.engine, map=map, layer=layer)
215
216 def onLayerDelete(self, map, layer):
217 onLayerDelete.send(sender=self.engine, map=map, layer=layer)
218
219 # ConsoleExecuter
220 def onToolsClick(self):
221 onToolsClick.send(sender=self.engine)
222
223 def onConsoleCommand(self, command):
224 onConsoleCommand.send(sender=self.engine, command=command)