EventManager and Throbber updates
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@18377 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Name: EventManager.py
|
# Name: EventManager.py
|
||||||
# Purpose: A module to demonstrate the wxPython.lib.EventManager.
|
# Purpose: A module to demonstrate wxPython.lib.evtmgr.EventManager.
|
||||||
#
|
#
|
||||||
# Author: Robb Shecter <robb@acm.org>
|
# Author: Robb Shecter (robb@acm.org)
|
||||||
#
|
#
|
||||||
# Created: 16-December-2002
|
# Created: 16-December-2002
|
||||||
# Copyright: (c) 2002 by Robb Shecter <robb@acm.org>
|
# Copyright: (c) 2002 by Robb Shecter (robb@acm.org)
|
||||||
# Licence: wxWindows license
|
# Licence: wxWindows license
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -58,8 +58,10 @@ class TestPanel(wxPanel):
|
|||||||
target = targetPanel.tile
|
target = targetPanel.tile
|
||||||
|
|
||||||
sizer.Add(0,0,1)
|
sizer.Add(0,0,1)
|
||||||
for factor in [0.2, 0.3, 0.35, 0.4, 0.5, 0.6, 0.7]:
|
for factor in [0.2, 0.3, 0.4, 0.5, 0.6, 0.7]:
|
||||||
sizer.Add(Tile(buttonPanel, log, factor, target), 0, 0)
|
sizer.Add(Tile(buttonPanel, log, factor-0.05, target), 0, wxALIGN_CENTER)
|
||||||
|
sizer.Add(0,0,1)
|
||||||
|
sizer.Add(Tile(buttonPanel, log, factor, target), 0, wxALIGN_CENTER)
|
||||||
sizer.Add(0,0,1)
|
sizer.Add(0,0,1)
|
||||||
|
|
||||||
buttonPanel.SetAutoLayout(1)
|
buttonPanel.SetAutoLayout(1)
|
||||||
@@ -87,15 +89,15 @@ class Tile(wxPanel):
|
|||||||
events over its contained 'InnerTile'.
|
events over its contained 'InnerTile'.
|
||||||
"""
|
"""
|
||||||
normal = wxColor(150,150,150)
|
normal = wxColor(150,150,150)
|
||||||
bright = wxColor(230,115,115)
|
active = wxColor(250,245,245)
|
||||||
active = wxColor(255,240,240)
|
hover = wxColor(210,220,210)
|
||||||
|
|
||||||
def __init__(self, parent, log, factor=1, thingToWatch=None, bgColor=None, active=1):
|
def __init__(self, parent, log, factor=1, thingToWatch=None, bgColor=None, active=1, size=(38,38), borderWidth=3):
|
||||||
wxPanel.__init__(self, parent, -1, size=(45,45))
|
wxPanel.__init__(self, parent, -1, size=size, style=wxCLIP_CHILDREN)
|
||||||
self.tile = InnerTile(self, log, factor, thingToWatch, bgColor)
|
self.tile = InnerTile(self, log, factor, thingToWatch, bgColor)
|
||||||
self.log = log
|
self.log = log
|
||||||
sizer = wxBoxSizer(wxHORIZONTAL)
|
sizer = wxBoxSizer(wxHORIZONTAL)
|
||||||
sizer.Add(self.tile, 1, wxEXPAND | wxALL, 4)
|
sizer.Add(self.tile, 1, wxEXPAND | wxALL, borderWidth)
|
||||||
self.SetAutoLayout(1)
|
self.SetAutoLayout(1)
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
self.Layout()
|
self.Layout()
|
||||||
@@ -103,14 +105,14 @@ class Tile(wxPanel):
|
|||||||
if active:
|
if active:
|
||||||
# Register myself for mouse events over self.tile in order to
|
# Register myself for mouse events over self.tile in order to
|
||||||
# create typical button/hyperlink visual effects.
|
# create typical button/hyperlink visual effects.
|
||||||
eventManager.Register(self.setBright, EVT_ENTER_WINDOW, self.tile)
|
eventManager.Register(self.setHover, EVT_ENTER_WINDOW, self.tile)
|
||||||
eventManager.Register(self.setNormal, EVT_LEAVE_WINDOW, self.tile)
|
eventManager.Register(self.setNormal, EVT_LEAVE_WINDOW, self.tile)
|
||||||
eventManager.Register(self.setActive, EVT_LEFT_DOWN, self.tile)
|
eventManager.Register(self.setActive, EVT_LEFT_DOWN, self.tile)
|
||||||
eventManager.Register(self.setBright, EVT_LEFT_UP, self.tile)
|
eventManager.Register(self.setHover, EVT_LEFT_UP, self.tile)
|
||||||
|
|
||||||
|
|
||||||
def setBright(self, event):
|
def setHover(self, event):
|
||||||
self.SetBackgroundColour(Tile.bright)
|
self.SetBackgroundColour(Tile.hover)
|
||||||
self.Refresh()
|
self.Refresh()
|
||||||
|
|
||||||
|
|
||||||
@@ -126,10 +128,13 @@ class Tile(wxPanel):
|
|||||||
|
|
||||||
|
|
||||||
class InnerTile(wxPanel):
|
class InnerTile(wxPanel):
|
||||||
START_COLOR = wxColor(200, 70, 70)
|
IDLE_COLOR = wxColor( 80, 10, 10)
|
||||||
FINAL_COLOR = wxColor(50, 80, 220)
|
START_COLOR = wxColor(200, 70, 50)
|
||||||
OFF_COLOR = wxColor(180, 185, 180)
|
FINAL_COLOR = wxColor( 20, 80,240)
|
||||||
DELTAS = map(lambda a,b: b-a, START_COLOR.Get(), FINAL_COLOR.Get())
|
OFF_COLOR = wxColor(185,190,185)
|
||||||
|
# Some pre-computation.
|
||||||
|
DELTAS = map(lambda a,b: b-a, START_COLOR.Get(), FINAL_COLOR.Get())
|
||||||
|
START_COLOR_TUPLE = START_COLOR.Get()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
This inner panel changes its color in reaction to mouse
|
This inner panel changes its color in reaction to mouse
|
||||||
@@ -145,10 +150,8 @@ class InnerTile(wxPanel):
|
|||||||
self.thingToWatch = thingToWatch
|
self.thingToWatch = thingToWatch
|
||||||
self.state = 0
|
self.state = 0
|
||||||
self.toggleOnOff()
|
self.toggleOnOff()
|
||||||
# Watch for the mouse click to enable/disable myself, and
|
# Watch for the mouse click to enable/disable myself.
|
||||||
# reset my color when the mouse leaves the watched window.
|
eventManager.Register(self.toggleOnOff, EVT_LEFT_UP, self)
|
||||||
eventManager.Register(self.toggleOnOff, EVT_LEFT_UP, self)
|
|
||||||
eventManager.Register(self.resetColor, EVT_LEAVE_WINDOW, thingToWatch)
|
|
||||||
|
|
||||||
|
|
||||||
def toggleOnOff(self, event=None):
|
def toggleOnOff(self, event=None):
|
||||||
@@ -164,7 +167,7 @@ class InnerTile(wxPanel):
|
|||||||
|
|
||||||
def resetColor(self, event=None):
|
def resetColor(self, event=None):
|
||||||
if self.state:
|
if self.state:
|
||||||
self.setColor(InnerTile.START_COLOR)
|
self.setColor(InnerTile.IDLE_COLOR)
|
||||||
else:
|
else:
|
||||||
self.setColor(InnerTile.OFF_COLOR)
|
self.setColor(InnerTile.OFF_COLOR)
|
||||||
|
|
||||||
@@ -175,13 +178,16 @@ class InnerTile(wxPanel):
|
|||||||
|
|
||||||
|
|
||||||
def makeColor(self, mouseEvent):
|
def makeColor(self, mouseEvent):
|
||||||
z = 250.0
|
self.makeColorFromTuple(mouseEvent.GetPositionTuple())
|
||||||
(x, y) = mouseEvent.GetPositionTuple()
|
|
||||||
a = (x + y) * self.factor
|
|
||||||
percent = min(a, z) / z
|
def makeColorFromTuple(self, (x, y)):
|
||||||
r, g, b = map(lambda start, delta, pct=percent: start+(delta*pct),
|
MAX = 180.0
|
||||||
InnerTile.START_COLOR.Get(),
|
scaled = min((x + y) * self.factor, MAX) # In range [0..MAX]
|
||||||
InnerTile.DELTAS)
|
percent = scaled / MAX
|
||||||
|
r = InnerTile.START_COLOR_TUPLE[0] + (InnerTile.DELTAS[0] * percent)
|
||||||
|
g = InnerTile.START_COLOR_TUPLE[1] + (InnerTile.DELTAS[1] * percent)
|
||||||
|
b = InnerTile.START_COLOR_TUPLE[2] + (InnerTile.DELTAS[2] * percent)
|
||||||
self.setColor(wxColor(r,g,b))
|
self.setColor(wxColor(r,g,b))
|
||||||
|
|
||||||
|
|
||||||
|
@@ -28,7 +28,7 @@ There's also a new object-oriented way to register for events. This
|
|||||||
invocation is equivalent to the one above, but does not require the
|
invocation is equivalent to the one above, but does not require the
|
||||||
programmer to declare or track control ids or parent containers:
|
programmer to declare or track control ids or parent containers:
|
||||||
|
|
||||||
eventManager.register(handleEvents, EVT_BUTTON, myButton)
|
eventManager.Register(handleEvents, EVT_BUTTON, myButton)
|
||||||
|
|
||||||
This module is Python 2.1+ compatible.
|
This module is Python 2.1+ compatible.
|
||||||
|
|
||||||
|
@@ -124,6 +124,12 @@ class Throbber(wxPanel):
|
|||||||
self.event.set() # we start out in the "resting" state
|
self.event.set() # we start out in the "resting" state
|
||||||
|
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
# make sure it's stopped, since EVT_WINDOW_DESTROY may not be sent
|
||||||
|
# on all platforms
|
||||||
|
self.Stop()
|
||||||
|
|
||||||
|
|
||||||
def OnDestroyWindow(self, event):
|
def OnDestroyWindow(self, event):
|
||||||
# this is currently broken due to a bug in wxWindows... hopefully
|
# this is currently broken due to a bug in wxWindows... hopefully
|
||||||
# it'll be fixed soon. Meanwhile be sure to explicitly call Stop()
|
# it'll be fixed soon. Meanwhile be sure to explicitly call Stop()
|
||||||
|
Reference in New Issue
Block a user