]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/EventManager.py
a846958e4bb2bd69842c90fe2f2a42794bedb20d
1 #---------------------------------------------------------------------------
2 # Name: EventManager.py
3 # Purpose: A module to demonstrate wxPython.lib.evtmgr.EventManager.
5 # Author: Robb Shecter (robb@acm.org)
7 # Created: 16-December-2002
8 # Copyright: (c) 2002 by Robb Shecter (robb@acm.org)
9 # Licence: wxWindows license
10 #---------------------------------------------------------------------------
12 # 11/22/2003 - Jeff Grimmett (grimmtooth@softhome.net)
14 # o Updated for wx namespace
16 # 11/25/2003 - Jeff Grimmett (grimmtooth@softhome.net)
18 # o What happened to wx.Color()?
23 import wx
.lib
.evtmgr
as em
25 #----------------------------------------------------------------------
27 class TestPanel(wx
.Panel
):
28 def __init__(self
, parent
, log
):
29 wx
.Panel
.__init
__(self
, parent
, -1)
32 fsize
= self
.GetFont().GetPointSize()
33 f1
= wx
.Font(fsize
+0, wx
.SWISS
, wx
.NORMAL
, wx
.NORMAL
)
34 f2
= wx
.Font(fsize
+2, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)
35 f3
= wx
.Font(fsize
+6, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
)
37 title1
= wx
.StaticText(self
, -1, 'EventManager')
40 This demo shows (1) basic uses and features of the EventManager, as well
41 as (2) how it helps with a real-world task: creating independent, object-
42 oriented components."""
43 message0
= wx
.StaticText(self
, -1, txt
)
46 title2
= wx
.StaticText(self
, -1, 'Event Listeners')
50 These objects listen to motion events from the target window, using the ability
51 to register one event with multiple listeners. They also register for mouse events
52 on themselves to implement toggle-button functionality."""
53 message1
= wx
.StaticText(self
, -1, txt
)
56 title3
= wx
.StaticText(self
, -1, 'Target Window')
60 A passive window that's used as an event generator. Move the mouse over it to
61 send events to the listeners above."""
62 message2
= wx
.StaticText(self
, -1, txt
)
65 targetPanel
= Tile(self
, log
, bgColor
=wx
.Colour(80,10,10), active
=0)
66 buttonPanel
= wx
.Panel(self
,-1)
67 sizer
= wx
.BoxSizer(wx
.HORIZONTAL
)
68 target
= targetPanel
.tile
71 for factor
in [0.2, 0.3, 0.4, 0.5, 0.6, 0.7]:
72 sizer
.Add(Tile(buttonPanel
, log
, factor
-0.05, target
), 0, wx
.ALIGN_CENTER
)
74 sizer
.Add(Tile(buttonPanel
, log
, factor
, target
), 0, wx
.ALIGN_CENTER
)
77 buttonPanel
.SetAutoLayout(1)
78 buttonPanel
.SetSizer(sizer
)
79 sizer
.Fit(buttonPanel
)
81 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
82 sizer
.Add(title1
, 0, wx
.ALIGN_CENTER | wx
.TOP | wx
.BOTTOM
, 6)
83 sizer
.Add(message0
, 0, wx
.ALIGN_CENTER | wx
.ALL
, 6)
84 sizer
.Add(title2
, 0, wx
.ALIGN_CENTER | wx
.LEFT | wx
.TOP | wx
.RIGHT
, 16)
85 sizer
.Add(message1
, 0, wx
.ALIGN_CENTER | wx
.ALL
, 6)
86 sizer
.Add(buttonPanel
, 0, wx
.EXPAND | wx
.LEFT | wx
.BOTTOM | wx
.RIGHT
, 16)
87 sizer
.Add(title3
, 0, wx
.ALIGN_CENTER | wx
.LEFT | wx
.RIGHT
, 16)
88 sizer
.Add(message2
, 0, wx
.ALIGN_CENTER | wx
.ALL
, 6)
89 sizer
.Add(targetPanel
, 2, wx
.EXPAND | wx
.LEFT | wx
.BOTTOM | wx
.RIGHT
, 16)
97 This outer class is responsible for changing
98 its border color in response to certain mouse
99 events over its contained 'InnerTile'.
101 normal
= wx
.Colour(150,150,150)
102 active
= wx
.Colour(250,245,245)
103 hover
= wx
.Colour(210,220,210)
105 def __init__(self
, parent
, log
, factor
=1, thingToWatch
=None, bgColor
=None, active
=1, size
=(38,38), borderWidth
=3):
106 wx
.Panel
.__init
__(self
, parent
, -1, size
=size
, style
=wx
.CLIP_CHILDREN
)
107 self
.tile
= InnerTile(self
, log
, factor
, thingToWatch
, bgColor
)
109 sizer
= wx
.BoxSizer(wx
.HORIZONTAL
)
110 sizer
.Add(self
.tile
, 1, wx
.EXPAND | wx
.ALL
, borderWidth
)
111 self
.SetAutoLayout(1)
114 self
.SetBackgroundColour(Tile
.normal
)
116 # Register myself for mouse events over self.tile in order to
117 # create typical button/hyperlink visual effects.
118 em
.eventManager
.Register(self
.setHover
, wx
.EVT_ENTER_WINDOW
, self
.tile
)
119 em
.eventManager
.Register(self
.setNormal
, wx
.EVT_LEAVE_WINDOW
, self
.tile
)
120 em
.eventManager
.Register(self
.setActive
, wx
.EVT_LEFT_DOWN
, self
.tile
)
121 em
.eventManager
.Register(self
.setHover
, wx
.EVT_LEFT_UP
, self
.tile
)
124 def setHover(self
, event
):
125 self
.SetBackgroundColour(Tile
.hover
)
129 def setActive(self
, event
):
130 self
.SetBackgroundColour(Tile
.active
)
134 def setNormal(self
, event
):
135 self
.SetBackgroundColour(Tile
.normal
)
140 class InnerTile(wx
.Panel
):
141 IDLE_COLOR
= wx
.Colour( 80, 10, 10)
142 START_COLOR
= wx
.Colour(200, 70, 50)
143 FINAL_COLOR
= wx
.Colour( 20, 80,240)
144 OFF_COLOR
= wx
.Colour(185,190,185)
145 # Some pre-computation.
146 DELTAS
= map(lambda a
,b
: b
-a
, START_COLOR
.Get(), FINAL_COLOR
.Get())
147 START_COLOR_TUPLE
= START_COLOR
.Get()
150 This inner panel changes its color in reaction to mouse
151 events over the 'thingToWatch'.
153 def __init__(self
, parent
, log
, factor
, thingToWatch
=None, bgColor
=None):
154 wx
.Panel
.__init
__(self
, parent
, -1)
157 self
.SetBackgroundColour(bgColor
)
160 self
.thingToWatch
= thingToWatch
163 # Watch for the mouse click to enable/disable myself.
164 em
.eventManager
.Register(self
.toggleOnOff
, wx
.EVT_LEFT_UP
, self
)
167 def toggleOnOff(self
, event
=None):
168 # Implement being on or off by registering and
169 # de-registering self.makeColor() from the event manager.
171 em
.eventManager
.DeregisterListener(self
.makeColor
)
173 em
.eventManager
.Register(self
.makeColor
, wx
.EVT_MOTION
, self
.thingToWatch
)
174 self
.state
= 1 - self
.state
178 def resetColor(self
, event
=None):
180 self
.setColor(InnerTile
.IDLE_COLOR
)
182 self
.setColor(InnerTile
.OFF_COLOR
)
185 def setColor(self
, color
):
186 self
.SetBackgroundColour(color
)
190 def makeColor(self
, mouseEvent
):
191 self
.makeColorFromTuple(mouseEvent
.GetPositionTuple())
194 def makeColorFromTuple(self
, (x
, y
)):
196 scaled
= min((x
+ y
) * self
.factor
, MAX
) # In range [0..MAX]
197 percent
= scaled
/ MAX
198 r
= InnerTile
.START_COLOR_TUPLE
[0] + (InnerTile
.DELTAS
[0] * percent
)
199 g
= InnerTile
.START_COLOR_TUPLE
[1] + (InnerTile
.DELTAS
[1] * percent
)
200 b
= InnerTile
.START_COLOR_TUPLE
[2] + (InnerTile
.DELTAS
[2] * percent
)
201 self
.setColor(wx
.Colour(int(r
), int(g
), int(b
)))
206 #----------------------------------------------------------------------
208 def runTest(frame
, nb
, log
):
209 win
= TestPanel(nb
, log
)
212 #----------------------------------------------------------------------
216 overview
= """<html><body>
217 <h2>EventManager</h2>
219 <p> The goal of the EventManager is to make wxWindows events more
220 'Pythonic' (ie. object-oriented) and easier to work with, without
221 impacting performance. It offers these features:
226 <li> Allows any number of listeners to register for a single
227 event. (In addition to the standard wxPython feature of a single
228 listener being able to respond to many events.)
230 <li> Makes it easy to disconnect and reconnect listeners. This
231 has the effect of reducing the need for case-based branching in
234 <li> Has an object-oriented API. Programmers register to get
235 events directly from the objects that generate them, instead of
242 <p>The EventManager class has three public methods. First get a
246 from wxPython.lib.evtmgr import eventManager
249 <p>...and then invoke any of the following methods. These methods are
250 'safe'; duplicate registrations or de-registrations will have no
253 <p><b>Registering a listener:</b>
256 eventManager.Register(listener, event, event-source)
260 <p><b>De-registering by window:</b>
263 eventManager.DeregisterWindow(event-source)
267 <p><b>De-registering by listener:</b>
270 eventManager.DeregisterListener(listener)
273 <p><b>Simple Example:</b>
276 from wxPython.lib.evtmgr import eventManager
278 aButton = wxButton(somePanel, -1, 'Click me')
279 eventManager.Register(self.someMethod, EVT_BUTTON, aButton)
282 <p> See the demo code as well as the documentation in the source of
283 <tt>wxPython.lib.evtmgr</tt> for more details.
287 by Robb Shecter (robb@acm.org)
293 if __name__
== '__main__':
296 run
.main(['', os
.path
.basename(sys
.argv
[0])])