Mercurial > fife-parpg
annotate engine/extensions/pychan/events.py @ 304:17edb4b98e3e
- fixed silly bug in object serializer; missing int cast broke setBlocking / setStatic functionality
NOTE:
- bool("1") and bool("0") are both resulting in True ....
author | chewie@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Mon, 20 Jul 2009 16:56:51 +0000 |
parents | 51cc05d862f2 |
children | 48c99636453e |
rev | line source |
---|---|
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
1 # -*- coding: utf-8 -*- |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
2 |
251
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
3 """\ |
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
4 PyChan event handling (internal). |
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
5 ================================= |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
6 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
7 Users shouldn't need to use this module directly. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
8 L{widgets.Widget.capture} and L{widgets.Widget.mapEvents} provide |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
9 a convenient API to capture events. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
10 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
11 Nevertheless to understand how its supposed to work |
251
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
12 take a look at L{EventMapper} and L{EventListenerBase} |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
13 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
14 Event callbacks |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
15 --------------- |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
16 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
17 You can either write callbacks yourself or |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
18 use L{tools.callBackWithArguments} or L{tools.attrSetCallback} |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
19 to generate suitable callbacks. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
20 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
21 Here's an example callback:: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
22 def dumpEventInfo(event=0,widget=0): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
23 print widget, " received the event ", event |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
24 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
25 Note the signature - C{event} and C{widget} are keyword |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
26 arguments passed to the callback. If doesn't accept either |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
27 C{event} or C{widget} as argument, these are not passed. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
28 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
29 This way a simple function which ignores C{event} or C{widget} |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
30 can be used, while they are available if needed. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
31 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
32 Currently only one callback can be set per event. In case |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
33 you don't want to write your own callback that dispatches |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
34 to different callbacks you can use L{tools.chainCallbacks}. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
35 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
36 Available Events |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
37 ---------------- |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
38 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
39 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
40 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
41 from compat import guichan |
251
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
42 import widgets |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
43 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
44 import exceptions |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
45 from internal import get_manager |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
46 import tools |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
47 import traceback |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
48 import weakref |
255
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
49 import fife_timer as timer |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
50 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
51 EVENTS = [ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
52 "mouseEntered", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
53 "mouseExited", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
54 "mousePressed", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
55 "mouseReleased", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
56 "mouseClicked", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
57 "mouseMoved", |
220
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
58 "mouseWheelMovedUp", |
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
59 "mouseWheelMovedDown", |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
60 "mouseDragged", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
61 "action", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
62 "keyPressed", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
63 "keyReleased", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
64 ] |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
65 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
66 # Add the EVENTS to the docs. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
67 __doc__ += "".join([" - %s\n" % event for event in EVENTS]) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
68 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
69 # The line before seems to leak the variable event into the global namespace ... remove that! |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
70 # This is a python problem, addressed in python3 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
71 try: del event |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
72 except:pass |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
73 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
74 MOUSE_EVENT, KEY_EVENT, ACTION_EVENT = range(3) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
75 def getEventType(name): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
76 if "mouse" in name: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
77 return MOUSE_EVENT |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
78 if "key" in name: |
164 | 79 return KEY_EVENT |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
80 return ACTION_EVENT |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
81 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
82 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
83 CALLBACK_NONE_MESSAGE = """\ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
84 You passed None as parameter to %s.capture, which would normally remove a mapped event. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
85 But there was no event mapped. Did you accidently call a function instead of passing it? |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
86 """ |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
87 class EventListenerBase(object): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
88 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
89 Redirector for event callbacks. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
90 Use *only* from L{EventMapper}. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
91 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
92 This class uses the SWIG director feature - overriden |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
93 virtual methods are called from C++ to - listen to |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
94 Guichan events. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
95 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
96 """ |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
97 def __init__(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
98 super(EventListenerBase,self).__init__() |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
99 self.events = {} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
100 self.indent = 0 |
208
e281223a03a6
Rejoice. PyChan debug messages removed.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
205
diff
changeset
|
101 self.debug = get_manager().debug |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
102 self.is_attached = False |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
103 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
104 def attach(self,widget): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
105 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
106 Start receiving events. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
107 No need to call this manually. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
108 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
109 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
110 if self.is_attached: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
111 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
112 if not self.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
113 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
114 if self.debug: print "Attach:",self |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
115 self.doAttach(widget.real_widget) |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
116 self.widget_ref = weakref.ref(widget) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
117 self.is_attached = True |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
118 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
119 def detach(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
120 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
121 Stop receiving events. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
122 No need to call this manually. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
123 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
124 if not self.is_attached: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
125 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
126 if self.debug: print "Detach:",self |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
127 self.is_attached = False |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
128 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
129 def _redirectEvent(self,name,event): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
130 self.indent += 4 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
131 try: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
132 event = self.translateEvent(getEventType(name), event) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
133 if name in self.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
134 if self.debug: print "-"*self.indent, name |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
135 for f in self.events[name].itervalues(): |
255
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
136 def delayed_f(): |
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
137 f( event ) |
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
138 timer.delayCall(0,delayed_f) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
139 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
140 except: |
234
e4dfdf4c11fd
Workaround for a crash on Win32 when trying to print an event.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
232
diff
changeset
|
141 print name, repr(event) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
142 traceback.print_exc() |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
143 raise |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
144 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
145 finally: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
146 self.indent -= 4 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
147 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
148 def translateEvent(self,event_type,event): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
149 if event_type == MOUSE_EVENT: |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
150 return get_manager().hook.translate_mouse_event(event) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
151 if event_type == KEY_EVENT: |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
152 return get_manager().hook.translate_key_event(event) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
153 return event |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
154 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
155 class _ActionEventListener(EventListenerBase,guichan.ActionListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
156 def __init__(self):super(_ActionEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
157 def doAttach(self,real_widget): real_widget.addActionListener(self) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
158 def doDetach(self,real_widget): real_widget.removeActionListener(self) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
159 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
160 def action(self,e): self._redirectEvent("action",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
161 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
162 class _MouseEventListener(EventListenerBase,guichan.MouseListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
163 def __init__(self):super(_MouseEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
164 def doAttach(self,real_widget): real_widget.addMouseListener(self) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
165 def doDetach(self,real_widget): real_widget.removeMouseListener(self) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
166 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
167 def mouseEntered(self,e): self._redirectEvent("mouseEntered",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
168 def mouseExited(self,e): self._redirectEvent("mouseExited",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
169 def mousePressed(self,e): self._redirectEvent("mousePressed",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
170 def mouseReleased(self,e): self._redirectEvent("mouseReleased",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
171 def mouseClicked(self,e): self._redirectEvent("mouseClicked",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
172 def mouseMoved(self,e): self._redirectEvent("mouseMoved",e) |
220
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
173 def mouseWheelMovedUp(self,e): self._redirectEvent("mouseWheelMovedUp",e) |
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
174 def mouseWheelMovedDown(self,e): self._redirectEvent("mouseWheelMovedDown",e) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
175 def mouseDragged(self,e): self._redirectEvent("mouseDragged",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
176 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
177 class _KeyEventListener(EventListenerBase,guichan.KeyListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
178 def __init__(self):super(_KeyEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
179 def doAttach(self,real_widget): real_widget.addKeyListener(self) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
180 def doDetach(self,real_widget): real_widget.removeKeyListener(self) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
181 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
182 def keyPressed(self,e): self._redirectEvent("keyPressed",e) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
183 def keyReleased(self,e): self._redirectEvent("keyReleased",e) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
184 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
185 class EventMapper(object): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
186 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
187 Handles events and callbacks for L{widgets.Widget} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
188 and derived classes. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
189 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
190 Every PyChan widget has an L{EventMapper} instance |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
191 as attribute B{event_mapper}. |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
192 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
193 This instance handles all necessary house-keeping. |
251
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
194 Such an event mapper can be either C{attached} or |
92c7ce181881
Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
234
diff
changeset
|
195 C{detached}. In its attached state an L{EventListenerBase} |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
196 is added to the Guichan widget and will redirect |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
197 the events to the callbacks. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
198 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
199 In its detached state no events are received from the |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
200 real Guichan widget. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
201 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
202 The event mapper starts in the detached state. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
203 When a new event is captured the mapper attaches itself |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
204 automatically. The widget doesn't need to handle that. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
205 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
206 def __init__(self,widget): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
207 super(EventMapper,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
208 self.widget_ref = weakref.ref(widget) |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
209 self.callbacks = {} |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
210 self.listener = { |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
211 KEY_EVENT : _KeyEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
212 ACTION_EVENT : _ActionEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
213 MOUSE_EVENT : _MouseEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
214 } |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
215 self.is_attached = False |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
216 self.debug = get_manager().debug |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
217 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
218 def __repr__(self): |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
219 return "EventMapper(%s)" % repr(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
220 |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
221 def attach(self): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
222 for listener in self.listener.values(): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
223 listener.attach() |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
224 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
225 def detach(self): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
226 for listener in self.listener.values(): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
227 listener.detach() |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
228 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
229 |
164 | 230 def capture(self,event_name,callback,group_name): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
231 if event_name not in EVENTS: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
232 raise exceptions.RuntimeError("Unknown eventname: " + event_name) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
233 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
234 if callback is None: |
166
81a222e7bd25
Fixes for event handling.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
164
diff
changeset
|
235 if self.isCaptured(event_name,group_name): |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
236 self.removeEvent(event_name,group_name) |
164 | 237 elif self.debug: |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
238 print CALLBACK_NONE_MESSAGE % str(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
239 return |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
240 self.addEvent(event_name,callback,group_name) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
241 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
242 def isCaptured(self,event_name,group_name="default"): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
243 return ("%s/%s" % (event_name,group_name)) in self.getCapturedEvents() |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
244 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
245 def getCapturedEvents(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
246 events = [] |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
247 for event_type, listener in self.listener.items(): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
248 for event_name, group in listener.events.items(): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
249 for group_name in group.keys(): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
250 events.append( "%s/%s" % (event_name, group_name) ) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
251 return events |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
252 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
253 def getListener(self,event_name): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
254 return self.listener[getEventType(event_name)] |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
255 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
256 def removeEvent(self,event_name,group_name): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
257 listener = self.getListener(event_name) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
258 del listener.events[event_name][group_name] |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
259 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
260 if not listener.events[event_name]: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
261 del listener.events[event_name] |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
262 if not listener.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
263 listener.detach() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
264 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
265 del self.callbacks[group_name][event_name] |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
266 if len(self.callbacks[group_name]) <= 0: |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
267 del self.callbacks[group_name] |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
268 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
269 def addEvent(self,event_name,callback,group_name): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
270 if not callable(callback): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
271 raise RuntimeError("An event callback must be either a callable or None - not %s" % repr(callback)) |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
272 # The closure self needs to keep a weak ref. |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
273 # Otherwise the GC has problems. |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
274 self_ref = weakref.ref(self) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
275 |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
276 # Set up callback dictionary. This should fix some GC issues |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
277 if not self.callbacks.has_key(group_name): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
278 self.callbacks[group_name] = {} |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
279 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
280 if not self.callbacks[group_name].has_key(event_name): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
281 self.callbacks[group_name][event_name] = {} |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
282 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
283 self.callbacks[group_name][event_name] = callback |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
284 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
285 def captured_f(event): |
255
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
286 if self_ref() is not None: |
51cc05d862f2
Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
251
diff
changeset
|
287 tools.applyOnlySuitable(self_ref().callbacks[group_name][event_name],event=event,widget=self_ref().widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
288 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
289 listener = self.getListener(event_name) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
290 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
291 if event_name not in listener.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
292 listener.events[event_name] = {group_name : captured_f} |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
293 else: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
294 listener.events[event_name][group_name] = captured_f |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
295 listener.attach(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
296 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
297 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
298 def splitEventDescriptor(name): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
299 """ Utility function to split "widgetName/eventName" descriptions into tuples. """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
300 L = name.split("/") |
164 | 301 if len(L) not in (1,2,3): |
302 raise exceptions.RuntimeError("Invalid widgetname / eventname combination: " + name) | |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
303 if len(L) == 1: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
304 L = L[0],"action" |
164 | 305 elif L[1] not in EVENTS: |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
306 raise exceptions.RuntimeError("Unknown event name: " + name) |
164 | 307 if len(L) == 2: |
308 L = L[0],L[1],"default" | |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
309 return L |