Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 911f349

Browse files
committed
Merge pull request #5631 from briantoby/mac-wx-retina_fix
WX/WXagg backend add code that zooms properly on a Mac with a Retina display
1 parent cca1a60 commit 911f349

File tree

1 file changed

+38
-3
lines changed

1 file changed

+38
-3
lines changed

lib/matplotlib/backends/backend_wx.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,7 @@ def notify_axes_change(fig):
13691369

13701370
def show(self):
13711371
self.frame.Show()
1372+
self.canvas.draw()
13721373

13731374
def destroy(self, *args):
13741375
DEBUG_MSG("destroy()", 1, self)
@@ -1573,6 +1574,12 @@ def __init__(self, canvas):
15731574
self.canvas = canvas
15741575
self._idle = True
15751576
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
15761583

15771584
def get_canvas(self, frame, fig):
15781585
return FigureCanvasWx(frame, -1, fig)
@@ -1674,16 +1681,44 @@ def dynamic_update(self):
16741681

16751682
def press(self, event):
16761683
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
16781691

16791692
def release(self, event):
16801693
if self._active == 'ZOOM':
16811694
# When the mouse is released we reset the overlay and it
16821695
# 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
16851704

16861705
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+
16871722
# Use an Overlay to draw a rubberband-like bounding box.
16881723

16891724
dc = wx.ClientDC(self.canvas)

0 commit comments

Comments
 (0)