doc: add plugins description

Change-Id: I6403434d80e05d77339235003a3ecfd468f4f45d
This commit is contained in:
石博文 2018-08-01 09:52:24 +08:00
parent e9dda3caef
commit 30812a3082
No known key found for this signature in database
GPG Key ID: FC9610D6400A173C
Notes: gerrit 2018-08-01 10:04:41 +08:00
Verified+1: <jenkins@deepin.com>
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Wed, 01 Aug 2018 10:04:40 +0800
Reviewed-on: https://cr.deepin.io/37296
Project: dde/dde-dock
Branch: refs/heads/master

View File

@ -24,6 +24,26 @@ dock 上所存放的所有条目都继承自 `Item` 类。这样设计的原因
Dock 上从左至右(或从上至下)有不同的 Items 区域,在不同的显示模式下,不同工作区的显示状态或者调整策略都不一样,将它们统一为 Items 进行管理,可以极大的减小在这方面的工作。
其中AppItem 与 PluginsItem 是比较复杂的类型,详细说明:
#### AppItem
AppItem 是在 dock 上最经常与用户交互的类型,它关联着每个应用程序的窗口列表。所有的数据都是从后端(dde-initializer)的 DBus 服务中所获取的,具体的数据格式可以参考后端相关文档。
这里需要注意的是,后端数据分为两大块。一个是整体上的,即获取系统中有哪些需要显示在 dock 上的应用程序;另一个是每个应用程序,它有哪些窗口,应用程序的属性及它的各个窗口的属性等数据。
由于 dock 的管理单元是每个 Item所以有几个应用程序即总共应该创建几个 Item 这种控制策略应该由 ItemController 负责,而每个应用程序的窗口数据、属性数据,则由对应的 AppItem 自己去负责。由于都是读取同一个 DBus 服务,在这部分的数据处理一定要分清楚模块,否则会使整体上的数据流比较混乱。
##### Window Preview
窗口预览是应用程序类型特有的一个功能,由 `item/components` 下面的几个类提供。这部分的代码被封装在了 AppItem 内部,并利用 `DockItem` 标准的显示 Popup 的接口来显示预览窗口。这部分的代码比较独立,只与 AppItem 自己的实现有关。
#### PluginsItem
PluginsItem 是与插件所注册的某个具体 Item 相关联__并不是与某个插件进行直接关联__。因为一个插件可能注册多个 Item也可能一个 Item 也不注册。
PluginsItem 是一个对外来控件的包装类,所以在这里面大多工作都是将 DockItem 的一些事件或者行为转发或者加入到外来控件上,实现对外来控件的一个控制效果。
### Item Controller
`DockItemController` 类是控制与管理所有 Items 的地方。任何 Item 的创建、销毁操作,移动、交换、刷新等信号的起始点都从这里开始。
@ -53,6 +73,12 @@ Dock 上从左至右(或从上至下)有不同的 Items 区域,在不同
插件是符合标准的 Qt Plugins。插件的开发不必熟悉 dock 的所有代码,只需要熟悉一般的 Qt 插件开发过程,并了解 dock 所提供的接口。dock 的接口安装 `dde-dock-dev` 包即可。这也是方便插件开发者在无需配置完整的 dock 开发环境的情况下,更方便的进行 dock 插件的开发。
### 插件的一般组织形式
一般来说,一个插件由一个主控制类和至少一个控件类组成。控制类通过 dock 的插件接口与主程序通信,并获知当前 dock 的一些状态。通过插件自己的业务需求和 dock 的状态,可以调用接口添加新的 Items 到 dock 面板上,或是从面板上删除之前自己添加的 Items。
对于插件请求创建的每个 Item主程序都会调用插件的主控制类获取一个 Widget 作为显示内容,并创建一个 PluginsItem 对此 Widget 进行包装。包装后的 PluginsItem 将会作为标准的 DockItem 注册到 MainPanel 上显示出来。
### 插件开发中的调试方法
在加载插件失败时,主程序会打印相关信息,仔细参考相关日志即可发现大部分问题。一般就是对应插件的 so 中有某些符号没有解析成功,或是插件版本与主程序的版本不相同。