Skip to content

Commit

Permalink
doc: add plugins description
Browse files Browse the repository at this point in the history
Change-Id: I6403434d80e05d77339235003a3ecfd468f4f45d
  • Loading branch information
sbwtw committed Aug 1, 2018
1 parent e9dda3c commit 30812a3
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions technology-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 的创建、销毁操作,移动、交换、刷新等信号的起始点都从这里开始。
Expand Down Expand Up @@ -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 中有某些符号没有解析成功,或是插件版本与主程序的版本不相同。
Expand Down

0 comments on commit 30812a3

Please sign in to comment.