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

Skip to content

Commit 86d80aa

Browse files
authored
Merge pull request #12904 from timhoffm/mouse-forward-backward
Support forward/backward mouse buttons
2 parents 977f415 + 0ff1924 commit 86d80aa

File tree

5 files changed

+56
-12
lines changed

5 files changed

+56
-12
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Support for forward/backward mouse buttons
2+
``````````````````````````````````````````
3+
4+
Figure managers now support a ``button_press`` event for mouse buttons, similar
5+
to the ``key_press`` events. This allows binding actions to mouse buttons (see
6+
`.MouseButton`).
7+
8+
The first application of this mechanism is support of forward/backward mouse
9+
buttons in figures created with the Qt5 backend.

lib/matplotlib/backend_bases.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,8 @@ class MouseButton(IntEnum):
13671367
LEFT = 1
13681368
MIDDLE = 2
13691369
RIGHT = 3
1370+
BACK = 8
1371+
FORWARD = 9
13701372

13711373

13721374
class MouseEvent(LocationEvent):
@@ -2386,6 +2388,18 @@ def _get_uniform_gridstate(ticks):
23862388
a.set_navigate(i == n)
23872389

23882390

2391+
def button_press_handler(event, canvas, toolbar=None):
2392+
"""
2393+
The default Matplotlib button actions for extra mouse buttons.
2394+
"""
2395+
if toolbar is not None:
2396+
button_name = str(MouseButton(event.button))
2397+
if button_name in rcParams['keymap.back']:
2398+
toolbar.back()
2399+
elif button_name in rcParams['keymap.forward']:
2400+
toolbar.forward()
2401+
2402+
23892403
class NonGuiException(Exception):
23902404
pass
23912405

@@ -2403,22 +2417,34 @@ class FigureManagerBase(object):
24032417
The figure number
24042418
24052419
key_press_handler_id : int
2406-
The default key handler cid, when using the toolmanager. Can be used
2407-
to disable default key press handling ::
2420+
The default key handler cid, when using the toolmanager.
2421+
To disable the default key press handling use::
24082422
24092423
figure.canvas.mpl_disconnect(
24102424
figure.canvas.manager.key_press_handler_id)
2425+
2426+
button_press_handler_id : int
2427+
The default mouse button handler cid, when using the toolmanager.
2428+
To disable the default button press handling use::
2429+
2430+
figure.canvas.mpl_disconnect(
2431+
figure.canvas.manager.button_press_handler_id)
2432+
24112433
"""
24122434
def __init__(self, canvas, num):
24132435
self.canvas = canvas
24142436
canvas.manager = self # store a pointer to parent
24152437
self.num = num
24162438

24172439
self.key_press_handler_id = None
2440+
self.button_press_handler_id = None
24182441
if rcParams['toolbar'] != 'toolmanager':
24192442
self.key_press_handler_id = self.canvas.mpl_connect(
24202443
'key_press_event',
24212444
self.key_press)
2445+
self.button_press_handler_id = self.canvas.mpl_connect(
2446+
'button_press_event',
2447+
self.button_press)
24222448

24232449
self.toolmanager = None
24242450
self.toolbar = None
@@ -2455,6 +2481,13 @@ def key_press(self, event):
24552481
if rcParams['toolbar'] != 'toolmanager':
24562482
key_press_handler(event, self.canvas, self.canvas.toolbar)
24572483

2484+
def button_press(self, event):
2485+
"""
2486+
The default Matplotlib button actions for extra mouse buttons.
2487+
"""
2488+
if rcParams['toolbar'] != 'toolmanager':
2489+
button_press_handler(event, self.canvas, self.canvas.toolbar)
2490+
24582491
def get_window_title(self):
24592492
"""Get the title text of the window containing the figure.
24602493

lib/matplotlib/backends/backend_qt5.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from matplotlib._pylab_helpers import Gcf
1212
from matplotlib.backend_bases import (
1313
_Backend, FigureCanvasBase, FigureManagerBase, NavigationToolbar2,
14-
TimerBase, cursors, ToolContainerBase, StatusbarBase)
14+
TimerBase, cursors, ToolContainerBase, StatusbarBase, MouseButton)
1515
import matplotlib.backends.qt_editor.figureoptions as figureoptions
1616
from matplotlib.backends.qt_editor.formsubplottool import UiSubplotTool
1717
from matplotlib.backend_managers import ToolManager
@@ -213,11 +213,11 @@ def _timer_stop(self):
213213
class FigureCanvasQT(QtWidgets.QWidget, FigureCanvasBase):
214214

215215
# map Qt button codes to MouseEvent's ones:
216-
buttond = {QtCore.Qt.LeftButton: 1,
217-
QtCore.Qt.MidButton: 2,
218-
QtCore.Qt.RightButton: 3,
219-
# QtCore.Qt.XButton1: None,
220-
# QtCore.Qt.XButton2: None,
216+
buttond = {QtCore.Qt.LeftButton: MouseButton.LEFT,
217+
QtCore.Qt.MidButton: MouseButton.MIDDLE,
218+
QtCore.Qt.RightButton: MouseButton.RIGHT,
219+
QtCore.Qt.XButton1: MouseButton.BACK,
220+
QtCore.Qt.XButton2: MouseButton.FORWARD,
221221
}
222222

223223
@_allow_super_init

lib/matplotlib/rcsetup.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,8 +1425,10 @@ def _validate_linestyle(ls):
14251425
# key-mappings (multi-character mappings should be a list/tuple)
14261426
'keymap.fullscreen': [['f', 'ctrl+f'], validate_stringlist],
14271427
'keymap.home': [['h', 'r', 'home'], validate_stringlist],
1428-
'keymap.back': [['left', 'c', 'backspace'], validate_stringlist],
1429-
'keymap.forward': [['right', 'v'], validate_stringlist],
1428+
'keymap.back': [['left', 'c', 'backspace', 'MouseButton.BACK'],
1429+
validate_stringlist],
1430+
'keymap.forward': [['right', 'v', 'MouseButton.FORWARD'],
1431+
validate_stringlist],
14301432
'keymap.pan': [['p'], validate_stringlist],
14311433
'keymap.zoom': [['o'], validate_stringlist],
14321434
'keymap.save': [['s', 'ctrl+s'], validate_stringlist],

matplotlibrc.template

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,8 @@
583583
## Leave the field(s) empty if you don't need a key-map. (i.e., fullscreen : '')
584584
#keymap.fullscreen : f, ctrl+f ## toggling
585585
#keymap.home : h, r, home ## home or reset mnemonic
586-
#keymap.back : left, c, backspace ## forward / backward keys to enable
587-
#keymap.forward : right, v ## left handed quick navigation
586+
#keymap.back : left, c, backspace, MouseButton.BACK ## forward / backward keys
587+
#keymap.forward : right, v, MouseButton.FORWARD ## for quick navigation
588588
#keymap.pan : p ## pan mnemonic
589589
#keymap.zoom : o ## zoom mnemonic
590590
#keymap.save : s, ctrl+s ## saving current figure

0 commit comments

Comments
 (0)