annotate engine/extensions/pychan/events.py @ 374:1115f7cae9a3

Editor: * The editor will now force filenames to be lowercase, as VFS does not like uppercase path names. * If a map filename does not have a .xml extension on save, it will be automatically added. * Log modules set to "all" by default. Only new users will be affected by this without having to modify or remove their configuration file. * Log level set to LOGLEVEL_WARN
author cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
date Sat, 21 Nov 2009 13:11:56 +0000
parents dfd48d49c044
children
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
331
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
3 # ####################################################################
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
4 # Copyright (C) 2005-2009 by the FIFE team
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
5 # http://www.fifengine.de
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
6 # This file is part of FIFE.
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
7 #
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
8 # FIFE is free software; you can redistribute it and/or
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
9 # modify it under the terms of the GNU Lesser General Public
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
10 # License as published by the Free Software Foundation; either
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
11 # version 2.1 of the License, or (at your option) any later version.
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
12 #
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
13 # This library is distributed in the hope that it will be useful,
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
16 # Lesser General Public License for more details.
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
17 #
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
18 # You should have received a copy of the GNU Lesser General Public
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
19 # License along with this library; if not, write to the
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
20 # Free Software Foundation, Inc.,
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
21 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
22 # ####################################################################
48c99636453e Added Licence header to all pypthon modules in extension/
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 255
diff changeset
23
251
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
24 """\
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
25 PyChan event handling (internal).
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
26 =================================
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
27
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
28 Users shouldn't need to use this module directly.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
29 L{widgets.Widget.capture} and L{widgets.Widget.mapEvents} provide
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
30 a convenient API to capture events.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
31
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
32 Nevertheless to understand how its supposed to work
251
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
33 take a look at L{EventMapper} and L{EventListenerBase}
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
34
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
35 Event callbacks
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
36 ---------------
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
37
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
38 You can either write callbacks yourself or
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
39 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
40 to generate suitable callbacks.
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
41
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
42 Here's an example callback::
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
43 def dumpEventInfo(event=0,widget=0):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
44 print widget, " received the event ", event
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
45
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
46 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
47 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
48 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
49
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
50 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
51 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
52
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
53 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
54 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
55 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
56
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
57 Available Events
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
58 ----------------
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
59
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
60 """
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
61
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
62 from compat import guichan
251
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
63 import widgets
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
64
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
65 import exceptions
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
66 from internal import get_manager
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
67 import tools
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
68 import traceback
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
69 import weakref
255
51cc05d862f2 Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 251
diff changeset
70 import fife_timer as timer
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
71
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
72 EVENTS = [
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
73 "mouseEntered",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
74 "mouseExited",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
75 "mousePressed",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
76 "mouseReleased",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
77 "mouseClicked",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
78 "mouseMoved",
220
6d09d310943b Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 208
diff changeset
79 "mouseWheelMovedUp",
6d09d310943b Pass mouseWheelMovedUp and mouseWheelMovedDown events to pychan.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 208
diff changeset
80 "mouseWheelMovedDown",
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
81 "mouseDragged",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
82 "action",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
83 "keyPressed",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
84 "keyReleased",
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
85 ]
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
86
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
87 # Add the EVENTS to the docs.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
88 __doc__ += "".join([" - %s\n" % event for event in EVENTS])
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
89
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
90 # 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
91 # 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
92 try: del event
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
93 except:pass
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
94
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
95 MOUSE_EVENT, KEY_EVENT, ACTION_EVENT = range(3)
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
96 def getEventType(name):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
97 if "mouse" in name:
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
98 return MOUSE_EVENT
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
99 if "key" in name:
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
100 return KEY_EVENT
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
101 return ACTION_EVENT
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
102
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
103
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
104 CALLBACK_NONE_MESSAGE = """\
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
105 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
106 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
107 """
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
108 class EventListenerBase(object):
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
109 """
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
110 Redirector for event callbacks.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
111 Use *only* from L{EventMapper}.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
112
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
113 This class uses the SWIG director feature - overriden
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
114 virtual methods are called from C++ to - listen to
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
115 Guichan events.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
116
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
117 """
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
118 def __init__(self):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
119 super(EventListenerBase,self).__init__()
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
120 self.events = {}
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
121 self.indent = 0
208
e281223a03a6 Rejoice. PyChan debug messages removed.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 205
diff changeset
122 self.debug = get_manager().debug
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
123 self.is_attached = False
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
124
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
125 def attach(self,widget):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
126 """
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
127 Start receiving events.
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
128 No need to call this manually.
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
129 """
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
130
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
131 if self.is_attached:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
132 return
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
133 if not self.events:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
134 return
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
135 if self.debug: print "Attach:",self
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
136 self.doAttach(widget.real_widget)
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
137 self.widget_ref = weakref.ref(widget)
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
138 self.is_attached = True
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 def detach(self):
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 Stop receiving events.
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
143 No need to call this manually.
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 if not self.is_attached:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
146 return
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
147 if self.debug: print "Detach:",self
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
148 self.is_attached = False
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
149
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
150 def _redirectEvent(self,name,event):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
151 self.indent += 4
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
152 try:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
153 event = self.translateEvent(getEventType(name), event)
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
154 if name in self.events:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
155 if self.debug: print "-"*self.indent, name
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
156 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
157 def delayed_f():
51cc05d862f2 Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 251
diff changeset
158 f( event )
51cc05d862f2 Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 251
diff changeset
159 timer.delayCall(0,delayed_f)
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
160
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
161 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
162 print name, repr(event)
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
163 traceback.print_exc()
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
164 raise
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
165
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
166 finally:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
167 self.indent -= 4
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
168
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
169 def translateEvent(self,event_type,event):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
170 if event_type == MOUSE_EVENT:
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
171 return get_manager().hook.translate_mouse_event(event)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
172 if event_type == KEY_EVENT:
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
173 return get_manager().hook.translate_key_event(event)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
174 return event
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
175
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
176 class _ActionEventListener(EventListenerBase,guichan.ActionListener):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
177 def __init__(self):super(_ActionEventListener,self).__init__()
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
178 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
179 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
180
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
181 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
182
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
183 class _MouseEventListener(EventListenerBase,guichan.MouseListener):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
184 def __init__(self):super(_MouseEventListener,self).__init__()
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
185 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
186 def doDetach(self,real_widget): real_widget.removeMouseListener(self)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
187
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
188 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
189 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
190 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
191 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
192 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
193 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
194 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
195 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
196 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
197
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
198 class _KeyEventListener(EventListenerBase,guichan.KeyListener):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
199 def __init__(self):super(_KeyEventListener,self).__init__()
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
200 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
201 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
202
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
203 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
204 def keyReleased(self,e): self._redirectEvent("keyReleased",e)
157
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 class EventMapper(object):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
207 """
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
208 Handles events and callbacks for L{widgets.Widget}
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
209 and derived classes.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
210
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
211 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
212 as attribute B{event_mapper}.
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
213
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
214 This instance handles all necessary house-keeping.
251
92c7ce181881 Documentation cross reference fixes.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 234
diff changeset
215 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
216 C{detached}. In its attached state an L{EventListenerBase}
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
217 is added to the Guichan widget and will redirect
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
218 the events to the callbacks.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
219
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
220 In its detached state no events are received from the
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
221 real Guichan widget.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
222
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
223 The event mapper starts in the detached state.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
224 When a new event is captured the mapper attaches itself
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
225 automatically. The widget doesn't need to handle that.
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
226 """
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
227 def __init__(self,widget):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
228 super(EventMapper,self).__init__()
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
229 self.widget_ref = weakref.ref(widget)
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
230 self.callbacks = {}
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
231 self.listener = {
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
232 KEY_EVENT : _KeyEventListener(),
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
233 ACTION_EVENT : _ActionEventListener(),
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
234 MOUSE_EVENT : _MouseEventListener(),
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
235 }
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
236 self.is_attached = False
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
237 self.debug = get_manager().debug
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
238
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
239 def __repr__(self):
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
240 return "EventMapper(%s)" % repr(self.widget_ref())
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
241
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
242 def attach(self):
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
243 for listener in self.listener.values():
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
244 listener.attach()
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
245
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
246 def detach(self):
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
247 for listener in self.listener.values():
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
248 listener.detach()
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
249
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
250
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
251 def capture(self,event_name,callback,group_name):
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
252 if event_name not in EVENTS:
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
253 raise exceptions.RuntimeError("Unknown eventname: " + event_name)
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
254
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
255 if callback is None:
166
81a222e7bd25 Fixes for event handling.
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 164
diff changeset
256 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
257 self.removeEvent(event_name,group_name)
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
258 elif self.debug:
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
259 print CALLBACK_NONE_MESSAGE % str(self.widget_ref())
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
260 return
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
261 self.addEvent(event_name,callback,group_name)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
262
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
263 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
264 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
265
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
266 def getCapturedEvents(self):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
267 events = []
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
268 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
269 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
270 for group_name in group.keys():
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
271 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
272 return events
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
273
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
274 def getListener(self,event_name):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
275 return self.listener[getEventType(event_name)]
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
276
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
277 def removeEvent(self,event_name,group_name):
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
278 listener = self.getListener(event_name)
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
279 del listener.events[event_name][group_name]
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
280
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
281 if not listener.events[event_name]:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
282 del listener.events[event_name]
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
283 if not listener.events:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
284 listener.detach()
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
285
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
286 del self.callbacks[group_name][event_name]
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
287 if len(self.callbacks[group_name]) <= 0:
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
288 del self.callbacks[group_name]
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
289
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
290 def addEvent(self,event_name,callback,group_name):
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
291 if not callable(callback):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
292 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
293 # 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
294 # Otherwise the GC has problems.
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
295 self_ref = weakref.ref(self)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
296
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
297 # 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
298 if not self.callbacks.has_key(group_name):
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
299 self.callbacks[group_name] = {}
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
300
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
301 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
302 self.callbacks[group_name][event_name] = {}
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
303
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
304 self.callbacks[group_name][event_name] = callback
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
305
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
306 def captured_f(event):
255
51cc05d862f2 Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 251
diff changeset
307 if self_ref() is not None:
51cc05d862f2 Merged editor_rewrite branch to trunk.
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 251
diff changeset
308 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
309
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
310 listener = self.getListener(event_name)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
311
205
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
312 if event_name not in listener.events:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
313 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
314 else:
54bfd1015b35 * PyChan event handling rework (part I)
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 188
diff changeset
315 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
316 listener.attach(self.widget_ref())
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
317
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
318
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
319 def splitEventDescriptor(name):
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
320 """ Utility function to split "widgetName/eventName" descriptions into tuples. """
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
321 L = name.split("/")
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
322 if len(L) not in (1,2,3):
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
323 raise exceptions.RuntimeError("Invalid widgetname / eventname combination: " + name)
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
324 if len(L) == 1:
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
325 L = L[0],"action"
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
326 elif L[1] not in EVENTS:
157
bb9902910067 input_rework merged!
phoku@33b003aa-7bff-0310-803a-e67f0ece8222
parents:
diff changeset
327 raise exceptions.RuntimeError("Unknown event name: " + name)
164
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
328 if len(L) == 2:
5b04a7d3ded6 typo fix
spq@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 157
diff changeset
329 L = L[0],L[1],"default"
232
f10a35efebc0 Memory leak fix for pychan
cheesesucker@33b003aa-7bff-0310-803a-e67f0ece8222
parents: 220
diff changeset
330 return L