diff --git a/doc/api/next_api_changes/behavior/20611-MRR.rst b/doc/api/next_api_changes/behavior/20611-MRR.rst new file mode 100644 index 000000000000..62288874dc6b --- /dev/null +++ b/doc/api/next_api_changes/behavior/20611-MRR.rst @@ -0,0 +1,6 @@ +``RectangleSelector`` ``onselect`` now reports actual mouse press and release coordinates +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The current docstrings in `.RectangleSelector` describe ``onselect`` as a function with the +the signature ``def onselect(eclick: MouseEvent, erelease: MouseEvent)``. The +previous behaviour reported the ``extent`` of the rectangle, not the mouse event +coordinates. The new behaviour reports the actual mouse event coordinates. diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index 71ebd176f0b9..473fece3a796 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -17,8 +17,8 @@ def onselect(epress, erelease): ax._got_onselect = True assert epress.xdata == 100 assert epress.ydata == 100 - assert erelease.xdata == 199 - assert erelease.ydata == 199 + assert erelease.xdata == 200 + assert erelease.ydata == 200 tool = widgets.RectangleSelector(ax, onselect, **kwargs) do_event(tool, 'press', xdata=100, ydata=100, button=1) diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index a199e45d4018..c7dbc1b80b15 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -2701,7 +2701,6 @@ def _press(self, event): if self._active_handle is None: x = event.xdata y = event.ydata - self.visible = False self.extents = x, x, y, y self.visible = True else: @@ -2714,25 +2713,13 @@ def _release(self, event): if not self._interactive: self._to_draw.set_visible(False) - # update the eventpress and eventrelease with the resulting extents - x0, x1, y0, y1 = self.extents - self._eventpress.xdata = x0 - self._eventpress.ydata = y0 - xy0 = self.ax.transData.transform([x0, y0]) - self._eventpress.x, self._eventpress.y = xy0 - - self._eventrelease.xdata = x1 - self._eventrelease.ydata = y1 - xy1 = self.ax.transData.transform([x1, y1]) - self._eventrelease.x, self._eventrelease.y = xy1 - # calculate dimensions of box or line if self.spancoords == 'data': - spanx = abs(self._eventpress.xdata - self._eventrelease.xdata) - spany = abs(self._eventpress.ydata - self._eventrelease.ydata) + spanx = abs(self._eventpress.xdata - event.xdata) + spany = abs(self._eventpress.ydata - event.ydata) elif self.spancoords == 'pixels': - spanx = abs(self._eventpress.x - self._eventrelease.x) - spany = abs(self._eventpress.y - self._eventrelease.y) + spanx = abs(self._eventpress.x - event.x) + spany = abs(self._eventpress.y - event.y) else: _api.check_in_list(['data', 'pixels'], spancoords=self.spancoords) @@ -2747,7 +2734,7 @@ def _release(self, event): return # call desired function - self.onselect(self._eventpress, self._eventrelease) + self.onselect(self._eventpress, event) self.update() return False