From db91106447e46997e7c58c7d7f55a5827c84c32d Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 14 May 2020 23:25:18 +0200 Subject: [PATCH] Reorder NavigationToolbar2 methods. This PR only moves methods around, and does not change any actual implementation code. Right now NavigationToolbar2 methods are implemented in a very haphazard order. In particular the successively called event handlers for interactive panning and zooming are not defined next to one another, which makes logic hard to follow. This PR moves `home`, `back` and `forward` next to one another (in the same order as they appear in the toolbar); `pan`, `press_pan`, `drag_pan`, and `release_pan` next to one another in that order; and likewise for `zoom`, `press_zoom`, `drag_zoom`, and `release_zoom`. --- lib/matplotlib/backend_bases.py | 160 ++++++++++++++++---------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 1a957b212e96..e0ec6f85852d 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2762,18 +2762,6 @@ def __init__(self, canvas): def set_message(self, s): """Display a message on toolbar or in status bar.""" - def back(self, *args): - """ - Move back up the view lim stack. - - For convenience of being directly connected as a GUI callback, which - often get passed additional parameters, this method accepts arbitrary - parameters, but does not use them. - """ - self._nav_stack.back() - self.set_history_buttons() - self._update_view() - def draw_rubberband(self, event, x0, y0, x1, y1): """ Draw a rectangle rubberband to indicate zoom limits. @@ -2784,27 +2772,39 @@ def draw_rubberband(self, event, x0, y0, x1, y1): def remove_rubberband(self): """Remove the rubberband.""" - def forward(self, *args): + def home(self, *args): """ - Move forward in the view lim stack. + Restore the original view. For convenience of being directly connected as a GUI callback, which often get passed additional parameters, this method accepts arbitrary parameters, but does not use them. """ - self._nav_stack.forward() + self._nav_stack.home() self.set_history_buttons() self._update_view() - def home(self, *args): + def back(self, *args): """ - Restore the original view. + Move back up the view lim stack. For convenience of being directly connected as a GUI callback, which often get passed additional parameters, this method accepts arbitrary parameters, but does not use them. """ - self._nav_stack.home() + self._nav_stack.back() + self.set_history_buttons() + self._update_view() + + def forward(self, *args): + """ + Move forward in the view lim stack. + + For convenience of being directly connected as a GUI callback, which + often get passed additional parameters, this method accepts arbitrary + parameters, but does not use them. + """ + self._nav_stack.forward() self.set_history_buttons() self._update_view() @@ -2908,6 +2908,14 @@ def _zoom_pan_handler(self, event): elif event.name == "button_release_event": self.release_zoom(event) + @cbook.deprecated("3.3") + def press(self, event): + """Called whenever a mouse button is pressed.""" + + @cbook.deprecated("3.3") + def release(self, event): + """Callback for mouse button release.""" + def pan(self, *args): """ Toggle the pan/zoom tool. @@ -2924,10 +2932,6 @@ def pan(self, *args): a.set_navigate_mode(self.mode) self.set_message(self.mode) - @cbook.deprecated("3.3") - def press(self, event): - """Called whenever a mouse button is pressed.""" - def press_pan(self, event): """Callback for mouse button press in pan/zoom mode.""" if event.button in [1, 3]: @@ -2955,6 +2959,49 @@ def press_pan(self, event): if press is not None: press(event) + def drag_pan(self, event): + """Callback for dragging in pan/zoom mode.""" + for a, ind in self._xypress: + #safer to use the recorded button at the press than current button: + #multiple button can get pressed during motion... + a.drag_pan(self._button_pressed, event.key, event.x, event.y) + self.canvas.draw_idle() + + def release_pan(self, event): + """Callback for mouse button release in pan/zoom mode.""" + + if self._button_pressed is None: + return + self.canvas.mpl_disconnect(self._id_drag) + self._id_drag = self.canvas.mpl_connect( + 'motion_notify_event', self.mouse_move) + for a, ind in self._xypress: + a.end_pan() + if not self._xypress: + return + self._xypress = [] + self._button_pressed = None + self.push_current() + release = cbook._deprecate_method_override( + __class__.press, self, since="3.3", message="Calling an " + "overridden release() at pan stop is deprecated since %(since)s " + "and will be removed %(removal)s; override release_pan() instead.") + if release is not None: + release(event) + self._draw() + + def zoom(self, *args): + """Toggle zoom to rect mode.""" + if self.mode == _Mode.ZOOM: + self.mode = _Mode.NONE + self.canvas.widgetlock.release(self) + else: + self.mode = _Mode.ZOOM + self.canvas.widgetlock(self) + for a in self.canvas.figure.get_axes(): + a.set_navigate_mode(self.mode) + self.set_message(self.mode) + def press_zoom(self, event): """Callback for mouse button press in zoom to rect mode.""" if event.button not in [1, 3]: @@ -2982,52 +3029,6 @@ def press_zoom(self, event): if press is not None: press(event) - def push_current(self): - """Push the current view limits and position onto the stack.""" - self._nav_stack.push( - WeakKeyDictionary( - {ax: (ax._get_view(), - # Store both the original and modified positions. - (ax.get_position(True).frozen(), - ax.get_position().frozen())) - for ax in self.canvas.figure.axes})) - self.set_history_buttons() - - @cbook.deprecated("3.3") - def release(self, event): - """Callback for mouse button release.""" - - def release_pan(self, event): - """Callback for mouse button release in pan/zoom mode.""" - - if self._button_pressed is None: - return - self.canvas.mpl_disconnect(self._id_drag) - self._id_drag = self.canvas.mpl_connect( - 'motion_notify_event', self.mouse_move) - for a, ind in self._xypress: - a.end_pan() - if not self._xypress: - return - self._xypress = [] - self._button_pressed = None - self.push_current() - release = cbook._deprecate_method_override( - __class__.press, self, since="3.3", message="Calling an " - "overridden release() at pan stop is deprecated since %(since)s " - "and will be removed %(removal)s; override release_pan() instead.") - if release is not None: - release(event) - self._draw() - - def drag_pan(self, event): - """Callback for dragging in pan/zoom mode.""" - for a, ind in self._xypress: - #safer to use the recorded button at the press than current button: - #multiple button can get pressed during motion... - a.drag_pan(self._button_pressed, event.key, event.x, event.y) - self.canvas.draw_idle() - def drag_zoom(self, event): """Callback for dragging in zoom mode.""" start_xy = self._zoom_info["start_xy"] @@ -3093,6 +3094,17 @@ def release_zoom(self, event): if release is not None: release(event) + def push_current(self): + """Push the current view limits and position onto the stack.""" + self._nav_stack.push( + WeakKeyDictionary( + {ax: (ax._get_view(), + # Store both the original and modified positions. + (ax.get_position(True).frozen(), + ax.get_position().frozen())) + for ax in self.canvas.figure.axes})) + self.set_history_buttons() + @cbook.deprecated("3.3", alternative="toolbar.canvas.draw_idle()") def draw(self): """Redraw the canvases, update the locators.""" @@ -3153,18 +3165,6 @@ def update(self): self._nav_stack.clear() self.set_history_buttons() - def zoom(self, *args): - """Toggle zoom to rect mode.""" - if self.mode == _Mode.ZOOM: - self.mode = _Mode.NONE - self.canvas.widgetlock.release(self) - else: - self.mode = _Mode.ZOOM - self.canvas.widgetlock(self) - for a in self.canvas.figure.get_axes(): - a.set_navigate_mode(self.mode) - self.set_message(self.mode) - def set_history_buttons(self): """Enable or disable the back/forward button."""