MEP22:工具栏重写

状态

Progress

分支和请求

前期工作
拉动请求:

摘要

该MEP的主要目标是使用户与图形交互的方式更容易修改(添加、更改、删除)。

用户与图形的交互在画布和工具栏中被深度集成。使得任何修改都非常困难。

此MEP建议将此交互分离到工具栏、导航和工具中,以提供独立的访问和重新配置。

这种方法将更容易在用户之间创建和共享工具。在遥远的将来,我们甚至可以预见到 Tools 其中最流行的可以添加到主发行版中。

详细描述

工具栏的重新配置很复杂,大多数时候它需要一个自定义的后端。

自定义工具的创建有时会干扰工具栏,例如,请参阅https://github.com/matplotlib/matplotlib/issues/2694。此外,快捷方式是硬编码的,而且不容易修改https://github.com/matplotlib/matplotlib/issues/2699。

建议的解决方案是 Toolbar 以及 Canvas . 此操作和快捷方式的形式为 Tools .

一个新班级 Navigation 将是事件之间的桥梁 CanvasToolbar 并将它们重定向到适当的 Tool .

最后,用户交互将分为三类:

  • NavigationBase:这个类是为每个FigureManager实例化的,并将所有用户交互与工具连接起来。
  • toolbarbase:这个现有的类只作为对工具的GUI访问降级。
  • 工具库:是工具的基本定义。

实施

工具库(对象)

工具可以有一个图形表示,作为 SubplotTool 甚至不存在于工具栏中 Quit

这个 ToolBase 在定义时具有以下用于配置的类属性

  • keymap=none:用于触发工具的键
  • description=':工具的小描述
  • image=none:工具栏中使用的图像
以下实例属性在实例化时设置:
  • 名称
  • 航行
Methods
  • 触发器(self,event):这是工具的主要方法,当工具被以下触发时调用: 工具栏按钮单击 与工具keymap*关联的按键调用navigation.trigger_tool(name)
  • 设置图形(self,figure):设置图形和导航属性
  • destroy(self, *args) 摧毁 Tool 图形界面(如果存在)
可用工具
  • ToolQuit
  • ToolEnableAllNavigation
  • ToolEnableNavigation
  • ToolToggleGrid
  • ToolToggleFullScreen
  • ToolToggleYScale
  • ToolToggleXScale
  • ToolHome
  • ToolBack
  • ToolForward
  • SaveFigureBase
  • ConfigureSubplotsBase

toolToggleBase(工具库)

这个 ToolToggleBase 在定义时具有以下用于配置的类属性

  • radio_group=none:组“radio”类工具的属性(互斥)
  • 光标=无:当工具处于活动状态时要使用的光标

这个 可切换的 工具,可以捕获按键、鼠标移动和鼠标按钮按下

它定义了以下方法
  • 启用(self,event):由调用 ToolToggleBase.trigger 方法
  • 禁用(self,event):在工具未切换时调用
  • 切换: 财产 真与假
可用工具
  • ToolZoom
  • ToolPan

ToolbarBase

方法 后端实现
  • 添加工具项(self、name、group、position、image、description、toggle):将工具项添加到工具栏。此方法是来自的回调 tool_added_event (导航发射)
  • 设置消息(self,s):在工具栏或状态栏中显示消息
  • 切换工具项(self,name):在不触发事件的情况下切换工具项。
  • 移除工具项(self,name):从 Toolbar

向后兼容性

为了向后兼容,在支持的值列表中添加了“导航” rcParams["toolbar"] (default: 'toolbar2') ,用于导航类实例化,而不是导航工具栏类

使用此参数,它可以使使用现有后端的任何人都透明。

[@pelson comment: This also gives us an opportunity to avoid needing to implement all of this in the same PR - some backends can potentially exist without the new functionality for a short while (but it must be done at some point).]