Mercurial > fife-parpg
annotate engine/extensions/pychan/events.py @ 232:f10a35efebc0
Memory leak fix for pychan
Thanks to phoku for doing much of this patch
author | cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Mon, 23 Mar 2009 02:06:14 +0000 |
parents | 6d09d310943b |
children | e4dfdf4c11fd |
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 #coding: utf-8 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
3 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
4 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
5 PyChan event handling |
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 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
8 Users shouldn't need to use this module directly. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
9 L{widgets.Widget.capture} and L{widgets.Widget.mapEvents} provide |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
10 a convenient API to capture events. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
11 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
12 Nevertheless to understand how its supposed to work |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
13 take a look at L{EventMapper} and L{EventListener} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
14 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
15 Event callbacks |
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 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
18 You can either write callbacks yourself or |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
19 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
|
20 to generate suitable callbacks. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
21 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
22 Here's an example callback:: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
23 def dumpEventInfo(event=0,widget=0): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
24 print widget, " received the event ", event |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
25 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
26 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
|
27 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
|
28 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
|
29 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
30 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
|
31 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
|
32 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
33 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
|
34 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
|
35 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
|
36 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
37 Available Events |
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 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
41 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
42 from compat import guichan |
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 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
49 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
50 EVENTS = [ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
51 "mouseEntered", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
52 "mouseExited", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
53 "mousePressed", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
54 "mouseReleased", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
55 "mouseClicked", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
56 "mouseMoved", |
220
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
57 "mouseWheelMovedUp", |
6d09d310943b
Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
208
diff
changeset
|
58 "mouseWheelMovedDown", |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
59 "mouseDragged", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
60 "action", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
61 "keyPressed", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
62 "keyReleased", |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
63 ] |
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 # Add the EVENTS to the docs. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
66 __doc__ += "".join([" - %s\n" % event for event in EVENTS]) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
67 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
68 # 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
|
69 # 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
|
70 try: del event |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
71 except:pass |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
72 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
73 MOUSE_EVENT, KEY_EVENT, ACTION_EVENT = range(3) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
74 def getEventType(name): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
75 if "mouse" in name: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
76 return MOUSE_EVENT |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
77 if "key" in name: |
164 | 78 return KEY_EVENT |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
79 return ACTION_EVENT |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
80 |
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 CALLBACK_NONE_MESSAGE = """\ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
83 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
|
84 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
|
85 """ |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
86 class EventListenerBase(object): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
87 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
88 Redirector for event callbacks. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
89 Use *only* from L{EventMapper}. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
90 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
91 This class uses the SWIG director feature - overriden |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
92 virtual methods are called from C++ to - listen to |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
93 Guichan events. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
94 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
95 """ |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
96 def __init__(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
97 super(EventListenerBase,self).__init__() |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
98 self.events = {} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
99 self.indent = 0 |
208
e281223a03a6
Rejoice. PyChan debug messages removed.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
205
diff
changeset
|
100 self.debug = get_manager().debug |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
101 self.is_attached = False |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
102 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
103 def attach(self,widget): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
104 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
105 Start receiving events. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
106 No need to call this manually. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
107 """ |
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 if self.is_attached: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
110 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
111 if not self.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
112 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
113 if self.debug: print "Attach:",self |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
114 self.doAttach(widget.real_widget) |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
115 self.widget_ref = weakref.ref(widget) |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
116 self.is_attached = True |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
117 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
118 def detach(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
119 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
120 Stop receiving events. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
121 No need to call this manually. |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
122 """ |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
123 if not self.is_attached: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
124 return |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
125 if self.debug: print "Detach:",self |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
126 self.is_attached = False |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
127 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
128 def _redirectEvent(self,name,event): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
129 self.indent += 4 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
130 try: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
131 event = self.translateEvent(getEventType(name), event) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
132 if name in self.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
133 if self.debug: print "-"*self.indent, name |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
134 for f in self.events[name].itervalues(): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
135 f( event ) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
136 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
137 except: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
138 print name, event |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
139 traceback.print_exc() |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
140 raise |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
141 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
142 finally: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
143 self.indent -= 4 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
144 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
145 def translateEvent(self,event_type,event): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
146 if event_type == MOUSE_EVENT: |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
147 return get_manager().hook.translate_mouse_event(event) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
148 if event_type == KEY_EVENT: |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
149 return get_manager().hook.translate_key_event(event) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
150 return event |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
151 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
152 class _ActionEventListener(EventListenerBase,guichan.ActionListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
153 def __init__(self):super(_ActionEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
154 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
|
155 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
|
156 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
157 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
|
158 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
159 class _MouseEventListener(EventListenerBase,guichan.MouseListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
160 def __init__(self):super(_MouseEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
161 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
|
162 def doDetach(self,real_widget): real_widget.removeMouseListener(self) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
163 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 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
|
173 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
174 class _KeyEventListener(EventListenerBase,guichan.KeyListener): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
175 def __init__(self):super(_KeyEventListener,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
176 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
|
177 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
|
178 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
179 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
|
180 def keyReleased(self,e): self._redirectEvent("keyReleased",e) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
181 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
182 class EventMapper(object): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
183 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
184 Handles events and callbacks for L{widgets.Widget} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
185 and derived classes. |
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 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
|
188 as attribute B{event_mapper}. |
157
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 This instance handles all necessary house-keeping. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
191 Such an event mapper can be either *attached* or |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
192 *detached*. In its attached state an L{EventListener} |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
193 is added to the Guichan widget and will redirect |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
194 the events to the callbacks. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
195 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
196 In its detached state no events are received from the |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
197 real Guichan widget. |
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 The event mapper starts in the detached state. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
200 When a new event is captured the mapper attaches itself |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
201 automatically. The widget doesn't need to handle that. |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
202 """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
203 def __init__(self,widget): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
204 super(EventMapper,self).__init__() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
205 self.widget_ref = weakref.ref(widget) |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
206 self.callbacks = {} |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
207 self.listener = { |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
208 KEY_EVENT : _KeyEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
209 ACTION_EVENT : _ActionEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
210 MOUSE_EVENT : _MouseEventListener(), |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
211 } |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
212 self.is_attached = False |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
213 self.debug = get_manager().debug |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
214 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
215 def __repr__(self): |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
216 return "EventMapper(%s)" % repr(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
217 |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
218 def attach(self): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
219 for listener in self.listener.values(): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
220 listener.attach() |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
221 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
222 def detach(self): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
223 for listener in self.listener.values(): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
224 listener.detach() |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
225 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
226 |
164 | 227 def capture(self,event_name,callback,group_name): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
228 if event_name not in EVENTS: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
229 raise exceptions.RuntimeError("Unknown eventname: " + event_name) |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
230 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
231 if callback is None: |
166
81a222e7bd25
Fixes for event handling.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
164
diff
changeset
|
232 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
|
233 self.removeEvent(event_name,group_name) |
164 | 234 elif self.debug: |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
235 print CALLBACK_NONE_MESSAGE % str(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
236 return |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
237 self.addEvent(event_name,callback,group_name) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
238 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
239 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
|
240 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
|
241 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
242 def getCapturedEvents(self): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
243 events = [] |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
244 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
|
245 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
|
246 for group_name in group.keys(): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
247 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
|
248 return events |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
249 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
250 def getListener(self,event_name): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
251 return self.listener[getEventType(event_name)] |
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 removeEvent(self,event_name,group_name): |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
254 listener = self.getListener(event_name) |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
255 del listener.events[event_name][group_name] |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
256 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
257 if not listener.events[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] |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
259 if not listener.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
260 listener.detach() |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
261 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
262 del self.callbacks[group_name][event_name] |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
263 if len(self.callbacks[group_name]) <= 0: |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
264 del self.callbacks[group_name] |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
265 |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
266 def addEvent(self,event_name,callback,group_name): |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
267 if not callable(callback): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
268 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
|
269 # 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
|
270 # Otherwise the GC has problems. |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
271 self_ref = weakref.ref(self) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
272 |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
273 # 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
|
274 if not self.callbacks.has_key(group_name): |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
275 self.callbacks[group_name] = {} |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
276 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
277 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
|
278 self.callbacks[group_name][event_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 self.callbacks[group_name][event_name] = callback |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
281 |
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
282 |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
283 def captured_f(event): |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
284 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
|
285 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
286 listener = self.getListener(event_name) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
287 |
205
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
288 if event_name not in listener.events: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
289 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
|
290 else: |
54bfd1015b35
* PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
188
diff
changeset
|
291 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
|
292 listener.attach(self.widget_ref()) |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
293 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
294 |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
295 def splitEventDescriptor(name): |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
296 """ Utility function to split "widgetName/eventName" descriptions into tuples. """ |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
297 L = name.split("/") |
164 | 298 if len(L) not in (1,2,3): |
299 raise exceptions.RuntimeError("Invalid widgetname / eventname combination: " + name) | |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
300 if len(L) == 1: |
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
301 L = L[0],"action" |
164 | 302 elif L[1] not in EVENTS: |
157
bb9902910067
input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff
changeset
|
303 raise exceptions.RuntimeError("Unknown event name: " + name) |
164 | 304 if len(L) == 2: |
305 L = L[0],L[1],"default" | |
232
f10a35efebc0
Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
220
diff
changeset
|
306 return L |