如何编写 Peony 插件
1、什么是peony的插件?
peony的插件是基于Qt Plugin的一套插件框架。Qt Plugin这个功能比较冷门。它是需要由开发者手动加载的.so,并做了一定的约束,是插件可以在peony运行过程中,可以进行热加载。
peony的扩展框架借鉴了老版本的扩展框架,它分为调用和实现两个部分,调用部分散步在UI层中,关于其接口部分的代码可以在https://github.com/ukui/peony/tree/master/plugin-iface中找到,而具体实现则可能不需要在项目内部,我们可以在ukui项目下的peony-extensions项目中找到(https://github.com/ukui/peony-extensions)。
2、插件调用的基本流程
上面我们也讲到,扩展框架的调用部分散布在ui层中,这些插件的接口会在特定的上下文中被调用,因此我们可以通过此时传入插件实例的参数实现各种各样的操作扩展,比如菜单插件,它会在菜单初始化时被调用,调用端传入了菜单类型(视图、侧边栏或者桌面),当前目录的uri,以及选中文件的urilist,对应的,实现端需要我们返回一个result,通过这样的一个流程,我们可以在右键菜单中实现打开终端,格式化等可扩展的操作。
3、插件开发的应用范围
在peony中,菜单、属性窗口的标签页、预览窗格以及文件视图都可以以插件的形式进行开发。peony项目中有一些被注释的插件demo,可以让开发者简单的了解如何编写一个peony的插件。如果你希望在菜单中增加一项,又不希望修改源码,不妨试一试写一个MenuPluginInterface的插件实例。
4、插件存在的缺陷
目前的插件框架没有一个很好的二进制兼容性,尤其是对于基于libpeony2的文件视图插件来说,我们可能需要在peony更新之后重新编译一遍插件项目,才能保证peony的正常运作。
目前的插件没有实现统一的管理,想要禁用一个插件,就需要从系统中去除它,这对于用户来说可能并不友好
5、主要接口定义
public:
enum PluginType
{
Invalid,
//右键菜单栏插件接口
MenuPlugin,
//预览窗口插件接口
PreviewPagePlugin,
//文件浏览器窗口插件
DirectoryViewPlugin,
//文件浏览器窗口插件2
DirectoryViewPlugin2,
//工具栏插件
ToolBarPlugin,
//详情页窗口插件
PropertiesWindowPlugin,
ColumnProviderPlugin,
StylePlugin,
VFSPlugin,
Other
};
virtual ~PluginInterface() {}
virtual PluginType pluginType() = 0;
virtual const QString name() = 0;
virtual const QString description() = 0;
virtual const QIcon icon() = 0;
virtual void setEnable(bool enable) = 0;
virtual bool isEnable() = 0;
};
参考资料: