@@ -789,28 +789,12 @@ def draw_idle(self):
789
789
"""
790
790
DEBUG_MSG ("draw_idle()" , 1 , self )
791
791
self ._isDrawn = False # Force redraw
792
- # Create a timer for handling draw_idle requests
793
- # If there are events pending when the timer is
794
- # complete, reset the timer and continue. The
795
- # alternative approach, binding to wx.EVT_IDLE,
796
- # doesn't behave as nicely.
797
- if hasattr (self ,'_idletimer' ):
798
- self ._idletimer .Restart (IDLE_DELAY )
799
- else :
800
- self ._idletimer = wx .FutureCall (IDLE_DELAY ,self ._onDrawIdle )
801
- # FutureCall is a backwards-compatible alias;
802
- # CallLater became available in 2.7.1.1.
803
-
804
- def _onDrawIdle (self , * args , ** kwargs ):
805
- if wx .GetApp ().Pending ():
806
- self ._idletimer .Restart (IDLE_DELAY , * args , ** kwargs )
807
- else :
808
- del self ._idletimer
809
- # GUI event or explicit draw call may already
810
- # have caused the draw to take place
811
- if not self ._isDrawn :
812
- self .draw (* args , ** kwargs )
813
-
792
+
793
+ # Triggering a paint event is all that is needed to defer drawing
794
+ # until later. The platform will send the event when it thinks it is
795
+ # a good time (usually as soon as there are no other events pending).
796
+ self .Refresh (eraseBackground = False )
797
+
814
798
def draw (self , drawDC = None ):
815
799
"""
816
800
Render the figure using RendererWx instance renderer, or using a
@@ -1709,30 +1693,30 @@ def dynamic_update(self):
1709
1693
self .canvas .draw ()
1710
1694
self ._idle = True
1711
1695
1712
- def draw_rubberband (self , event , x0 , y0 , x1 , y1 ):
1713
- 'adapted from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/189744'
1714
- canvas = self .canvas
1715
- dc = wx .ClientDC (canvas )
1716
-
1717
- # Set logical function to XOR for rubberbanding
1718
- dc .SetLogicalFunction (wx .XOR )
1696
+ def press (self , event ):
1697
+ if self ._active == 'ZOOM' :
1698
+ self .wxoverlay = wx .Overlay ()
1719
1699
1720
- # Set dc brush and pen
1721
- # Here I set brush and pen to white and grey respectively
1722
- # You can set it to your own choices
1700
+ def release (self , event ):
1701
+ if self ._active == 'ZOOM' :
1702
+ # When the mouse is released we reset the overlay and it
1703
+ # restores the former content to the window.
1704
+ self .wxoverlay .Reset ()
1705
+ del self .wxoverlay
1723
1706
1724
- # The brush setting is not really needed since we
1725
- # dont do any filling of the dc. It is set just for
1726
- # the sake of completion.
1707
+ def draw_rubberband (self , event , x0 , y0 , x1 , y1 ):
1708
+ # Use an Overlay to draw a rubberband-like bounding box.
1727
1709
1728
- wbrush = wx .Brush (wx .Colour (255 ,255 ,255 ), wx .TRANSPARENT )
1729
- wpen = wx .Pen (wx .Colour (200 , 200 , 200 ), 1 , wx .SOLID )
1730
- dc .SetBrush (wbrush )
1731
- dc .SetPen (wpen )
1710
+ dc = wx .ClientDC (self .canvas )
1711
+ odc = wx .DCOverlay (self .wxoverlay , dc )
1712
+ odc .Clear ()
1732
1713
1714
+ # Mac's DC is already the same as a GCDC, and it causes
1715
+ # problems with the overlay if we try to use an actual
1716
+ # wx.GCDC so don't try it.
1717
+ if 'wxMac' not in wx .PlatformInfo :
1718
+ dc = wx .GCDC (dc )
1733
1719
1734
- dc .ResetBoundingBox ()
1735
- dc .BeginDrawing ()
1736
1720
height = self .canvas .figure .bbox .height
1737
1721
y1 = height - y1
1738
1722
y0 = height - y0
@@ -1742,14 +1726,20 @@ def draw_rubberband(self, event, x0, y0, x1, y1):
1742
1726
1743
1727
w = x1 - x0
1744
1728
h = y1 - y0
1729
+ rect = wx .Rect (x0 , y0 , w , h )
1745
1730
1746
- rect = int (x0 ), int (y0 ), int (w ), int (h )
1747
- try : lastrect = self .lastrect
1748
- except AttributeError : pass
1749
- else : dc .DrawRectangle (* lastrect ) #erase last
1750
- self .lastrect = rect
1751
- dc .DrawRectangle (* rect )
1752
- dc .EndDrawing ()
1731
+ rubberBandColor = '#C0C0FF' # or load from config?
1732
+
1733
+ # Set a pen for the border
1734
+ color = wx .NamedColour (rubberBandColor )
1735
+ dc .SetPen (wx .Pen (color , 1 ))
1736
+
1737
+ # use the same color, plus alpha for the brush
1738
+ r , g , b = color .Get ()
1739
+ color .Set (r ,g ,b , 0x60 )
1740
+ dc .SetBrush (wx .Brush (color ))
1741
+ dc .DrawRectangleRect (rect )
1742
+
1753
1743
1754
1744
def set_status_bar (self , statbar ):
1755
1745
self .statbar = statbar
0 commit comments