MEP9:全球互动经理

为所有与艺术家的用户交互添加全局管理器;根据用户的需要使任何艺术家可调整大小、可移动、可突出显示和可选。

状态

Discussion

摘要

其目标是能够以与绘图程序非常相似的方式与Matplotlib艺术家进行交互。适当时,用户应该能够移动、调整大小或选择画布上已经存在的艺术家。当然,脚本编写者最终控制着一个艺术家是否能够与之交互,或者是否是静态的。

要做到这一点的代码已经被私人实现和测试,并且需要从当前的“mixin”实现迁移到matplotlib的真正部分。

最终结果是Matplotlib.artist.artist有四个新关键字: _moveable_, _resizeable_, _selectable_, 和 _highlightable_. 将这些关键字中的任何一个设置为true都将激活该艺术家的交互性。

实际上,此MEP是Matplotlib中事件处理的逻辑扩展;Matplotlib已经支持“低级”交互,如鼠标左键、按键或类似操作。MEP将支持扩展到逻辑级别,当检测到来自用户的某些交互手势时,将对艺术家执行回调。

详细描述

这一新功能将用于允许最终用户更好地与图形交互。很多时候,图形几乎是用户想要的,但是需要对组件进行小的重新定位和/或调整大小。而不是强迫用户返回脚本来尝试错误的位置,简单的拖放将是合适的。

此外,这将更好地支持使用matplotlib的应用程序;在这里,最终用户没有合理的访问权限或希望编辑底层源代码,以便对绘图进行微调。在这里,如果Matplotlib提供了这种功能,人们可以移动画布上的艺术家或调整其大小以满足他们的需要。此外,如果应用程序支持这种类型的东西,用户应该能够突出显示(用鼠标悬停)一个艺术家,并通过双击选择它。在这个MEP中,我们还希望本机支持突出显示和选择;当选择艺术家时,由应用程序来处理发生的事情。典型的处理方法是显示一个对话框来编辑艺术家的属性。

将来,Matplotlib也可以为每个艺术家提供后端特定的属性对话框(这不是此MEP的一部分),这些对话框在艺术家选择时引发。这种MEP将是实现这种能力的必要踏脚石。

Matplotlib中目前有一些交互功能(例如legend.draggable()),但它们往往分散,不适用于所有艺术家。该MEP旨在统一交互界面,使其适用于所有艺术家。

当前MEP还包括用于调整艺术家大小的抓取手柄,以及在移动或调整艺术家大小时绘制的适当框。

实施

  • 向艺术家的“树”中添加适当的方法,以便交互管理器具有一致的接口,以便交互管理器处理。如果要支持交互,建议添加到艺术家中的方法是:
    • 获取像素位置:获取艺术家边界框左下角的像素位置
    • 获取像素大小(self):获取艺术家边界框的大小,以像素为单位
    • 设置“像素位置”和“大小”(self、x、y、dx、dy):设置艺术家的新大小,使其适合指定的边界框。
  • 为后端添加功能:1)提供光标,因为这些光标是移动/调整大小的视觉指示所必需的;2)提供获取当前鼠标位置的函数
  • 实施经理。这已经被私下(由DHYAMS)做为一种混合,并且已经被测试了很多。目标是将管理器的功能转移到艺术家中,使其正确地位于Matplotlib中,而不是像我目前所编写的那样作为“猴子补丁”。

mixin 的当前摘要

(请注意,这种混合现在只是私有代码,但显然可以添加到分支中)

交互部分混合:

mixin类使在matplotlib画布上绘制的任何通用对象都可以移动,并且可能可以调整大小。PowerPoint模型被尽可能地遵循;不是因为我迷恋PowerPoint,而是因为这是大多数人理解的。艺术家也可以选择,这意味着当双击时,艺术家将收到on_activated()回调。最后,一个艺术家可以是高光的,这意味着每当鼠标经过时,一个高光就会在艺术家身上绘制出来。通常,高光艺术家也可以选择,但这取决于用户。因此,基本上有四个属性可以由用户根据每个艺术家设置:

  • 高亮的
  • 可选择的
  • 可移动的
  • 可调节的

要可移动(可拖动)或可调整大小,作为mixin目标的对象必须支持以下协议:

  • 获取像素位置(自身)
  • 获取像素大小(自身)
  • 设置_像素_位置_和_大小(self、x、y、sx、sy)

请注意,不可调整大小的对象可以忽略sx和sy参数。要实现高亮度,作为mixin目标的对象还必须支持以下协议:

  • 突出显示(自我)

返回将用于绘制突出显示的艺术家列表。

如果作为mixin目标的对象不是matplotlib艺术家,则还必须实现以下协议。这样做通常是相当琐碎的,因为必须有一个艺术家 在某处 正在绘制。通常,您的对象只是将这些调用路由到该艺术家。

  • 获得数字(自我)
  • GETX轴(自)
  • 包含(自身,事件)
  • 设置动画(self,flag)
  • 绘制(自身,渲染器)
  • 显示(自己)

对艺术家调用以下通知,并且艺术家可以选择实现这些通知。

  • 选择开始(自我)
  • 在“选择”端(自身)
  • 开始(自我)
  • 在拖拽端(自身)
  • 打开激活(自我)
  • 突出显示(自我)
  • 单击鼠标右键(self,event)
  • 在“左键单击”(Self,Event)
  • 点击鼠标中键(self,event)
  • 在上下文中单击(self,event)
  • 启动(自我,事件)
  • 开关键(自我,事件)

如果没有交互式艺术家处理事件,则在画布上调用以下通知:

  • 按(self,event)
  • 在“左键单击”(Self,Event)
  • 点击鼠标中键(self,event)
  • 单击鼠标右键(self,event)
  • 在上下文中单击(self,event)
  • 启动(自我,事件)
  • 开关键(自我,事件)

以下函数(如果存在)可用于修改交互对象的行为:

  • Press_filter(self,event)确定对象是否希望将Press事件路由到它
  • 对象可以使用handle_unpicked_cursor()来设置光标,因为当光标在对象被取消拾取时经过该对象。

支持多个画布,维护每个画布的拖动锁定、运动通知和全局“启用”标志。通过在调整大小期间按住SHIFT键来支持固定的纵横比调整。

已知问题:

  • 在选择/拖动操作期间不遵守zorder。由于采用了闪电技术,我不相信这是可以解决的。我能想到的唯一方法是搜索所有比我更大的zorder的艺术家,将它们全部设置为动画,然后在每次拖动刷新期间将它们全部重新绘制到顶部。这可能很慢,需要尝试。
  • mixin只适用于wx后端,因为有两个原因:1)光标是硬编码的;2)调用wx.getmouseposition(),这两个缺点都可以通过让每个后端提供这些东西来合理地修复。

向后兼容性

向后兼容性没有问题,尽管一旦有了向后兼容性,就应该废弃一些现有的交互函数(如legend.draggable())。

选择

我不知道。