|
2 | 2 | Abstract base classes define the primitives for Tools.
|
3 | 3 | These tools are used by `matplotlib.backend_managers.ToolManager`
|
4 | 4 |
|
5 |
| -:class:`ToolBase` |
6 |
| - Simple stateless tool |
| 5 | +`ToolBase` |
| 6 | + Simple stateless tool. |
7 | 7 |
|
8 |
| -:class:`ToolToggleBase` |
9 |
| - Tool that has two states, only one Toggle tool can be |
10 |
| - active at any given time for the same |
11 |
| - `matplotlib.backend_managers.ToolManager` |
| 8 | +`ToolToggleBase` |
| 9 | + Tool that has two states, only one Toggle tool can be active at any given time for |
| 10 | + the same `matplotlib.backend_managers.ToolManager`. |
12 | 11 | """
|
13 | 12 |
|
14 | 13 | import enum
|
|
22 | 21 | import numpy as np
|
23 | 22 |
|
24 | 23 | import matplotlib as mpl
|
25 |
| -from matplotlib._pylab_helpers import Gcf |
26 | 24 | from matplotlib import _api, cbook
|
27 | 25 |
|
28 | 26 |
|
@@ -358,101 +356,66 @@ def remove_rubberband(self):
|
358 | 356 | pass
|
359 | 357 |
|
360 | 358 |
|
361 |
| -class ToolQuit(ToolBase): |
| 359 | +class _ToolForwardingToClassicToolbar(ToolBase): |
| 360 | + _rc_entry = '' # Must be set by subclass. |
| 361 | + default_keymap = property(lambda self: mpl.rcParams[self._rc_entry]) |
| 362 | + |
| 363 | + def trigger(self, sender, event, data=None): |
| 364 | + sentinel = str(uuid.uuid4()) |
| 365 | + # Trigger classic toolbar implementation by temporarily setting the keymap to a |
| 366 | + # unique key and sending an appropriate event. |
| 367 | + with cbook._setattr_cm(event, key=sentinel), \ |
| 368 | + mpl.rc_context({self._rc_entry: sentinel}): |
| 369 | + mpl.backend_bases.key_press_handler(event, self.figure.canvas) |
| 370 | + |
| 371 | + |
| 372 | +class ToolQuit(_ToolForwardingToClassicToolbar): |
362 | 373 | """Tool to call the figure manager destroy method."""
|
363 | 374 |
|
364 | 375 | description = 'Quit the figure'
|
365 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.quit']) |
366 |
| - |
367 |
| - def trigger(self, sender, event, data=None): |
368 |
| - Gcf.destroy_fig(self.figure) |
| 376 | + _rc_entry = 'keymap.quit' |
369 | 377 |
|
370 | 378 |
|
371 |
| -class ToolQuitAll(ToolBase): |
| 379 | +class ToolQuitAll(_ToolForwardingToClassicToolbar): |
372 | 380 | """Tool to call the figure manager destroy method."""
|
373 | 381 |
|
374 | 382 | description = 'Quit all figures'
|
375 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.quit_all']) |
376 |
| - |
377 |
| - def trigger(self, sender, event, data=None): |
378 |
| - Gcf.destroy_all() |
| 383 | + _rc_entry = 'keymap.quit_all' |
379 | 384 |
|
380 | 385 |
|
381 |
| -class ToolGrid(ToolBase): |
| 386 | +class ToolGrid(_ToolForwardingToClassicToolbar): |
382 | 387 | """Tool to toggle the major grids of the figure."""
|
383 | 388 |
|
384 | 389 | description = 'Toggle major grids'
|
385 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.grid']) |
386 |
| - |
387 |
| - def trigger(self, sender, event, data=None): |
388 |
| - sentinel = str(uuid.uuid4()) |
389 |
| - # Trigger grid switching by temporarily setting :rc:`keymap.grid` |
390 |
| - # to a unique key and sending an appropriate event. |
391 |
| - with cbook._setattr_cm(event, key=sentinel), \ |
392 |
| - mpl.rc_context({'keymap.grid': sentinel}): |
393 |
| - mpl.backend_bases.key_press_handler(event, self.figure.canvas) |
| 390 | + _rc_entry = 'keymap.grid' |
394 | 391 |
|
395 | 392 |
|
396 |
| -class ToolMinorGrid(ToolBase): |
| 393 | +class ToolMinorGrid(_ToolForwardingToClassicToolbar): |
397 | 394 | """Tool to toggle the major and minor grids of the figure."""
|
398 | 395 |
|
399 | 396 | description = 'Toggle major and minor grids'
|
400 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.grid_minor']) |
401 |
| - |
402 |
| - def trigger(self, sender, event, data=None): |
403 |
| - sentinel = str(uuid.uuid4()) |
404 |
| - # Trigger grid switching by temporarily setting :rc:`keymap.grid_minor` |
405 |
| - # to a unique key and sending an appropriate event. |
406 |
| - with cbook._setattr_cm(event, key=sentinel), \ |
407 |
| - mpl.rc_context({'keymap.grid_minor': sentinel}): |
408 |
| - mpl.backend_bases.key_press_handler(event, self.figure.canvas) |
| 397 | + _rc_entry = 'keymap.grid_minor' |
409 | 398 |
|
410 | 399 |
|
411 |
| -class ToolFullScreen(ToolBase): |
| 400 | +class ToolFullScreen(_ToolForwardingToClassicToolbar): |
412 | 401 | """Tool to toggle full screen."""
|
413 | 402 |
|
414 | 403 | description = 'Toggle fullscreen mode'
|
415 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.fullscreen']) |
| 404 | + _rc_entry = 'keymap.fullscreen' |
416 | 405 |
|
417 |
| - def trigger(self, sender, event, data=None): |
418 |
| - self.figure.canvas.manager.full_screen_toggle() |
419 |
| - |
420 |
| - |
421 |
| -class AxisScaleBase(ToolToggleBase): |
422 |
| - """Base Tool to toggle between linear and logarithmic.""" |
423 | 406 |
|
424 |
| - def trigger(self, sender, event, data=None): |
425 |
| - if event.inaxes is None: |
426 |
| - return |
427 |
| - super().trigger(sender, event, data) |
428 |
| - |
429 |
| - def enable(self, event=None): |
430 |
| - self.set_scale(event.inaxes, 'log') |
431 |
| - self.figure.canvas.draw_idle() |
| 407 | +class ToolXScale(_ToolForwardingToClassicToolbar): |
| 408 | + """Tool to toggle between linear and logarithmic scales on the X axis.""" |
432 | 409 |
|
433 |
| - def disable(self, event=None): |
434 |
| - self.set_scale(event.inaxes, 'linear') |
435 |
| - self.figure.canvas.draw_idle() |
| 410 | + description = 'Toggle scale X axis' |
| 411 | + _rc_entry = 'keymap.xscale' |
436 | 412 |
|
437 | 413 |
|
438 |
| -class ToolYScale(AxisScaleBase): |
| 414 | +class ToolYScale(_ToolForwardingToClassicToolbar): |
439 | 415 | """Tool to toggle between linear and logarithmic scales on the Y axis."""
|
440 | 416 |
|
441 | 417 | description = 'Toggle scale Y axis'
|
442 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.yscale']) |
443 |
| - |
444 |
| - def set_scale(self, ax, scale): |
445 |
| - ax.set_yscale(scale) |
446 |
| - |
447 |
| - |
448 |
| -class ToolXScale(AxisScaleBase): |
449 |
| - """Tool to toggle between linear and logarithmic scales on the X axis.""" |
450 |
| - |
451 |
| - description = 'Toggle scale X axis' |
452 |
| - default_keymap = property(lambda self: mpl.rcParams['keymap.xscale']) |
453 |
| - |
454 |
| - def set_scale(self, ax, scale): |
455 |
| - ax.set_xscale(scale) |
| 418 | + _rc_entry = 'keymap.yscale' |
456 | 419 |
|
457 | 420 |
|
458 | 421 | class ToolViewsPositions(ToolBase):
|
|
0 commit comments