Skip to content

Commit abe4054

Browse files
tacaswellmeeseeksmachine
authored andcommitted
Backport PR #23985: Improve rubberband rendering in wx and tk
1 parent 0671809 commit abe4054

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

lib/matplotlib/backends/_backend_tk.py

+20-10
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ def filter_destroy(event):
212212

213213
self._tkcanvas.focus_set()
214214

215-
self._rubberband_rect = None
215+
self._rubberband_rect_black = None
216+
self._rubberband_rect_white = None
216217

217218
def _update_device_pixel_ratio(self, event=None):
218219
# Tk gives scaling with respect to 72 DPI, but Windows screens are
@@ -667,21 +668,30 @@ def set_message(self, s):
667668

668669
def draw_rubberband(self, event, x0, y0, x1, y1):
669670
# Block copied from remove_rubberband for backend_tools convenience.
670-
if self.canvas._rubberband_rect:
671-
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect)
671+
if self.canvas._rubberband_rect_white:
672+
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_white)
673+
if self.canvas._rubberband_rect_black:
674+
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_black)
672675
height = self.canvas.figure.bbox.height
673676
y0 = height - y0
674677
y1 = height - y1
675-
self.canvas._rubberband_rect = self.canvas._tkcanvas.create_rectangle(
676-
x0, y0, x1, y1)
678+
self.canvas._rubberband_rect_black = (
679+
self.canvas._tkcanvas.create_rectangle(
680+
x0, y0, x1, y1))
681+
self.canvas._rubberband_rect_white = (
682+
self.canvas._tkcanvas.create_rectangle(
683+
x0, y0, x1, y1, outline='white', dash=(3, 3)))
677684

678685
def remove_rubberband(self):
679-
if self.canvas._rubberband_rect:
680-
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect)
681-
self.canvas._rubberband_rect = None
686+
if self.canvas._rubberband_rect_white:
687+
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_white)
688+
self.canvas._rubberband_rect_white = None
689+
if self.canvas._rubberband_rect_black:
690+
self.canvas._tkcanvas.delete(self.canvas._rubberband_rect_black)
691+
self.canvas._rubberband_rect_black = None
682692

683693
lastrect = _api.deprecated("3.6")(
684-
property(lambda self: self.canvas._rubberband_rect))
694+
property(lambda self: self.canvas._rubberband_rect_black))
685695

686696
def _set_image_for_button(self, button):
687697
"""
@@ -907,7 +917,7 @@ def remove_rubberband(self):
907917
self._make_classic_style_pseudo_toolbar())
908918

909919
lastrect = _api.deprecated("3.6")(
910-
property(lambda self: self.figure.canvas._rubberband_rect))
920+
property(lambda self: self.figure.canvas._rubberband_rect_black))
911921

912922

913923
@_api.deprecated("3.5", alternative="ToolSetCursor")

lib/matplotlib/backends/backend_wx.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,8 @@ def __init__(self, parent, id, figure=None):
508508
_log.debug("%s - __init__() - bitmap w:%d h:%d", type(self), w, h)
509509
self._isDrawn = False
510510
self._rubberband_rect = None
511+
self._rubberband_pen_black = wx.Pen('BLACK', 1, wx.PENSTYLE_SHORT_DASH)
512+
self._rubberband_pen_white = wx.Pen('WHITE', 1, wx.PENSTYLE_SOLID)
511513

512514
self.Bind(wx.EVT_SIZE, self._on_size)
513515
self.Bind(wx.EVT_PAINT, self._on_paint)
@@ -625,11 +627,11 @@ def gui_repaint(self, drawDC=None):
625627
drawDC.DrawBitmap(bmp, 0, 0)
626628
if self._rubberband_rect is not None:
627629
# Some versions of wx+python don't support numpy.float64 here.
628-
x0, y0, x1, y1 = map(int, self._rubberband_rect)
629-
drawDC.DrawLineList(
630-
[(x0, y0, x1, y0), (x1, y0, x1, y1),
631-
(x0, y0, x0, y1), (x0, y1, x1, y1)],
632-
wx.Pen('BLACK', 1, wx.PENSTYLE_SHORT_DASH))
630+
x0, y0, x1, y1 = map(round, self._rubberband_rect)
631+
rect = [(x0, y0, x1, y0), (x1, y0, x1, y1),
632+
(x0, y0, x0, y1), (x0, y1, x1, y1)]
633+
drawDC.DrawLineList(rect, self._rubberband_pen_white)
634+
drawDC.DrawLineList(rect, self._rubberband_pen_black)
633635

634636
filetypes = {
635637
**FigureCanvasBase.filetypes,

0 commit comments

Comments
 (0)