@@ -1369,6 +1369,7 @@ def notify_axes_change(fig):
1369
1369
1370
1370
def show (self ):
1371
1371
self .frame .Show ()
1372
+ self .canvas .draw ()
1372
1373
1373
1374
def destroy (self , * args ):
1374
1375
DEBUG_MSG ("destroy()" , 1 , self )
@@ -1573,6 +1574,12 @@ def __init__(self, canvas):
1573
1574
self .canvas = canvas
1574
1575
self ._idle = True
1575
1576
self .statbar = None
1577
+ self .prevZoomRect = None
1578
+ # for now, use alternate zoom-rectangle drawing on all
1579
+ # Macs. N.B. In future versions of wx it may be possible to
1580
+ # detect Retina displays with window.GetContentScaleFactor()
1581
+ # and/or dc.GetContentScaleFactor()
1582
+ self .retinaFix = 'wxMac' in wx .PlatformInfo
1576
1583
1577
1584
def get_canvas (self , frame , fig ):
1578
1585
return FigureCanvasWx (frame , - 1 , fig )
@@ -1674,16 +1681,44 @@ def dynamic_update(self):
1674
1681
1675
1682
def press (self , event ):
1676
1683
if self ._active == 'ZOOM' :
1677
- self .wxoverlay = wx .Overlay ()
1684
+ if not self .retinaFix :
1685
+ self .wxoverlay = wx .Overlay ()
1686
+ else :
1687
+ self .savedRetinaImage = self .canvas .copy_from_bbox (
1688
+ self .canvas .figure .gca ().bbox )
1689
+ self .zoomStartX = event .xdata
1690
+ self .zoomStartY = event .ydata
1678
1691
1679
1692
def release (self , event ):
1680
1693
if self ._active == 'ZOOM' :
1681
1694
# When the mouse is released we reset the overlay and it
1682
1695
# restores the former content to the window.
1683
- self .wxoverlay .Reset ()
1684
- del self .wxoverlay
1696
+ if not self .retinaFix :
1697
+ self .wxoverlay .Reset ()
1698
+ del self .wxoverlay
1699
+ else :
1700
+ del self .savedRetinaImage
1701
+ if self .prevZoomRect :
1702
+ self .prevZoomRect .pop (0 ).remove ()
1703
+ self .prevZoomRect = None
1685
1704
1686
1705
def draw_rubberband (self , event , x0 , y0 , x1 , y1 ):
1706
+ if self .retinaFix : # On Macs, use the following code
1707
+ # wx.DCOverlay does not work properly on Retina displays.
1708
+ rubberBandColor = '#C0C0FF'
1709
+ if self .prevZoomRect :
1710
+ self .prevZoomRect .pop (0 ).remove ()
1711
+ self .canvas .restore_region (self .savedRetinaImage )
1712
+ X0 , X1 = self .zoomStartX , event .xdata
1713
+ Y0 , Y1 = self .zoomStartY , event .ydata
1714
+ lineX = (X0 , X0 , X1 , X1 , X0 )
1715
+ lineY = (Y0 , Y1 , Y1 , Y0 , Y0 )
1716
+ self .prevZoomRect = self .canvas .figure .gca ().plot (
1717
+ lineX , lineY , '-' , color = rubberBandColor )
1718
+ self .canvas .figure .gca ().draw_artist (self .prevZoomRect [0 ])
1719
+ self .canvas .blit (self .canvas .figure .gca ().bbox )
1720
+ return
1721
+
1687
1722
# Use an Overlay to draw a rubberband-like bounding box.
1688
1723
1689
1724
dc = wx .ClientDC (self .canvas )
0 commit comments