-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Check pressed mouse buttons in pan/zoom drag handlers. #29066
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
lib/matplotlib/backend_bases.py
Outdated
@@ -3059,6 +3059,11 @@ def press_pan(self, event): | |||
|
|||
def drag_pan(self, event): | |||
"""Callback for dragging in pan/zoom mode.""" | |||
if self._pan_info.button not in event.buttons: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this be an exact match? I believe the action should terminate as soon as any button is pressed or released.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, I don't really mind either way.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, the test failures appear relevant.
Indeed, should be fixed now (synthetic events in tests needed some adjustment). |
Sometimes, the mouse_release_event ending a pan/zoom can be lost, if it occurs while the canvas does not have focus (a typical case is when a context menu is implemented on top of the canvas, see example below); this can result in rather confusing behavior as the pan/zoom continues which no mouse button is pressed. To fix this, always check that the correct button is still pressed in the motion_notify_event handlers. To test, use e.g. ``` from matplotlib import pyplot as plt from matplotlib.backends.qt_compat import QtWidgets def on_button_press(event): if event.button != 3: # Right-click. return menu = QtWidgets.QMenu() menu.addAction("Some menu action", lambda: None) menu.exec(event.guiEvent.globalPosition().toPoint()) fig = plt.figure() fig.canvas.mpl_connect("button_press_event", on_button_press) fig.add_subplot() plt.show() ``` enter pan/zoom mode, right-click to open the context menu, exit the menu, and continue moving the mouse.
Sometimes, the mouse_release_event ending a pan/zoom can be lost, if it occurs while the canvas does not have focus (a typical case is when a context menu is implemented on top of the canvas, see example below); this can result in rather confusing behavior as the pan/zoom continues which no mouse button is pressed. To fix this, always check that the correct button is still pressed in the motion_notify_event handlers.
To test, use e.g.
enter pan/zoom mode, right-click to open the context menu, exit the menu, and continue moving the mouse.
Followup to #28453 (and the original motivation for it).
PR summary
PR checklist