diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..9566032 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +push.sh +README.md diff --git a/Home.md b/Home.md deleted file mode 100644 index 46b6d33..0000000 --- a/Home.md +++ /dev/null @@ -1 +0,0 @@ -欢迎来到百科! \ No newline at end of file diff --git a/img/0/authorband.svg b/img/0/authorband.svg new file mode 100644 index 0000000..0bbf85f --- /dev/null +++ b/img/0/authorband.svg @@ -0,0 +1 @@ +Author: WingsummerAuthorWingsummer \ No newline at end of file diff --git a/img/0/downsrc.png b/img/0/downsrc.png new file mode 100644 index 0000000..9fbea7f Binary files /dev/null and b/img/0/downsrc.png differ diff --git a/img/0/dtk.png b/img/0/dtk.png new file mode 100644 index 0000000..1f28353 Binary files /dev/null and b/img/0/dtk.png differ diff --git a/img/0/lang.png b/img/0/lang.png new file mode 100644 index 0000000..a19082a Binary files /dev/null and b/img/0/lang.png differ diff --git a/img/0/licenseband.svg b/img/0/licenseband.svg new file mode 100644 index 0000000..9dc173d --- /dev/null +++ b/img/0/licenseband.svg @@ -0,0 +1 @@ +License: AGPL-3.0LicenseAGPL-3.0 \ No newline at end of file diff --git a/img/0/logo.svg b/img/0/logo.svg new file mode 100644 index 0000000..d616e67 --- /dev/null +++ b/img/0/logo.svg @@ -0,0 +1,54 @@ + + + + + + + + diff --git a/img/0/olband.svg b/img/0/olband.svg new file mode 100644 index 0000000..3ba751e --- /dev/null +++ b/img/0/olband.svg @@ -0,0 +1 @@ +OpenSource License: WingSummer OpenSource LicenseOpenSource LicenseWingSummer OpenSource License \ No newline at end of file diff --git a/img/0/screenshot.gif b/img/0/screenshot.gif new file mode 100644 index 0000000..99f0300 Binary files /dev/null and b/img/0/screenshot.gif differ diff --git a/img/1/0.png b/img/1/0.png new file mode 100644 index 0000000..b46cc0e Binary files /dev/null and b/img/1/0.png differ diff --git a/img/1/1.png b/img/1/1.png new file mode 100644 index 0000000..e5a811d Binary files /dev/null and b/img/1/1.png differ diff --git a/img/1/10.png b/img/1/10.png new file mode 100644 index 0000000..e1dcaf7 Binary files /dev/null and b/img/1/10.png differ diff --git a/img/1/11.png b/img/1/11.png new file mode 100644 index 0000000..fbef3c8 Binary files /dev/null and b/img/1/11.png differ diff --git a/img/1/2.png b/img/1/2.png new file mode 100644 index 0000000..7620430 Binary files /dev/null and b/img/1/2.png differ diff --git a/img/1/3.png b/img/1/3.png new file mode 100644 index 0000000..0adb079 Binary files /dev/null and b/img/1/3.png differ diff --git a/img/1/4.png b/img/1/4.png new file mode 100644 index 0000000..4d6f131 Binary files /dev/null and b/img/1/4.png differ diff --git a/img/1/5.png b/img/1/5.png new file mode 100644 index 0000000..6fb9b36 Binary files /dev/null and b/img/1/5.png differ diff --git a/img/1/6.png b/img/1/6.png new file mode 100644 index 0000000..be24d8d Binary files /dev/null and b/img/1/6.png differ diff --git a/img/1/7.png b/img/1/7.png new file mode 100644 index 0000000..554c69a Binary files /dev/null and b/img/1/7.png differ diff --git a/img/1/8.png b/img/1/8.png new file mode 100644 index 0000000..29e37f0 Binary files /dev/null and b/img/1/8.png differ diff --git a/img/1/9.png b/img/1/9.png new file mode 100644 index 0000000..4c5a541 Binary files /dev/null and b/img/1/9.png differ diff --git a/img/2/0.png b/img/2/0.png new file mode 100644 index 0000000..11bbb8e Binary files /dev/null and b/img/2/0.png differ diff --git a/img/88x31.png b/img/88x31.png new file mode 100644 index 0000000..4acf8c4 Binary files /dev/null and b/img/88x31.png differ diff --git a/使用教程.md b/使用教程.md new file mode 100644 index 0000000..15eed86 --- /dev/null +++ b/使用教程.md @@ -0,0 +1,209 @@ +**内容贡献者:** 寂静的羽夏 + +- [简述](#简述) + - [接口](#接口) + - [参数](#参数) + - [热键](#热键) + - [插件](#插件) + - [进程](#进程) + - [服务](#服务) + - [别名](#别名) +- [开始使用](#开始使用) + - [常规](#常规) + - [热键](#热键-1) + - [工具箱](#工具箱) + - [插件](#插件-1) + - [关于](#关于) + - [赞助](#赞助) +- [安装使用插件](#安装使用插件) +- [小结](#小结) +- [下一篇](#下一篇) + +## 简述 + +  从整个软件的设计上,有比较浓重的程序员的意味。因为这个程序设计是给我自己用的,既然我都开发出来了,Deepin 上也没有这样的软件,开源贡献出来也不是不可。 + +  但,请放心,就算你不是程序开发者,也只需了解几个概念,就可以毫无障碍的使用该软件。如果你会使用`Python`脚本编写,你可以通过内置的`WingToolPy`这个插件,你将会体验到更深度的插件联合的高效生产力,用来处理大量的重复性的工作。并且,该插件内置`Linux`特有的`DBUS`(可以理解为其他程序提供的接口),并不需要额外的配置(安装`dbus`的`Python`库),用来做一些功能十分实用的小脚本,比如快速打开设置的某一个部分,直接调用 Deepin 自带的 OCR 、看图程序,或者实现锁屏、快速更改屏幕亮度等。 + +  上一段话,其实不经意间就透露出了专业名词,其实这个不可避免。下面就开始介绍这个软件所需要的`黑话`: + +### 接口 + +  接口就好比咱们日常使用的插座,我们需要使用电器的时候,每个电器都会有个插头,有三腿的,有俩腿的,还有其他奇形怪状的。当我们把插头插到对应的插座口的时候,其实就是我们使用插头作为参数(具体什么是参数后面继续),用来访问插座(也就是接口)。还有一个类比就是比如餐厅打饭的时候,如果我们需要做到这个事情,就必须通过窗口点,这个也就是所谓接口的一个体现。 + +### 参数 + +  再举一个例子,比如做饭。如果你想要做饭,就需要一些食材和调味品,等做好后,就出了美味的菜品。而这个食材和调味品就是所谓的参数。参数就是你想要执行一个事情所需要的物资和条件。 + +### 热键 + +  热键的话,大家应该不陌生,用的非常多。复制粘贴热键大家使用电脑的时候可谓炉火纯青。而对于该软件,热键通常是指全局的,也就是在任何地方使用某个组合键(构成热键的按键),都会响应,而不是程序所指定的。 + +### 插件 + +  某些人对于插件应该是既熟悉有陌生。插件就好比你的积木,如果想要搭建更高级的建筑,就需要更高级的积木,这个就是很多插件图标的起源。 + +### 进程 + +  对于计算机来说,这个概念简单点讲就是运行的程序。只不过,在羽云工具箱里面,这个概念会更广,它即是你要打开的程序或者文件,也会是你要执行的一个插件服务。 + +### 服务 + +  服务这个概念应该是十分重要的。你去餐厅,打饭的同志给你承饭,而这个就是打饭人给干饭人提供的服务。你去 ATM 取款,而这个取钱功能就是服务。服务就是某个事物提供某功能的一个更书面的名词。 + +### 别名 + +  别名,通俗的讲就是外号。我们为了方便记住一个东西的时候,起个别名(外号)会极大方便我们的查找。 + +## 开始使用 + +> 正式版和 beta 版本有着极为巨大的差别,可以说是完全的不兼容。正式版有着更高级的功能和更少的 Bug ,而 beta 版本不具备。所以我强烈推荐使用正式版本。 + +  下面我们从程序的主界面开始介绍程序的使用: + +### 常规 + +

+ +

+ +  里面主要是我们对该软件的通用设置。开头你会看到一对奇怪的名词:“窗口工具”和“工具窗口”。 +  诶,它们到底有啥区别呢?先不要着急,在`工具箱`部分我们将会详细介绍这块。 +  `工具窗格大小`是指“窗口工具”的每一个工具格的大小,到后面你就能真正的明白它的含义了。 +  `快捷键`包含主程序所用的热键或者调用设置。运行窗体就类似`Windows`系统的运行,使用`Win + R`调出的窗口就是。而这个就是模仿的这个,只不过它只能调用插件提供的服务: + +

+ +

+ +  一个服务一般有时会有多个参数,每个参数使用空格分开,程序会自动解释并交给插件系统执行。如果输入的参数不是服务所要的或者参数不够,就会弹出错误的消息,提醒输入错误。 + +> 在上述所描述的错误情况中,日志会详细的记录程序在运行中的情况,包括插件的加载情况和错误的调用情况原由。如果你具有程序员的专业素养,你可以阅读并查出错误原因。如果不会的话,建议咨询插件开发者。 + +  `配置`是你在程序的所有设置的存储内容,它是一个二进制文件(通俗的讲用记事本打开乱码的文件)。你可以对此进行备份和导入操作。 +  `日志`是程序在运行中的记录,如果你是普通用户,就不要管它。如果程序出错了,你可以将其交给开发人员进行排错,这会十分有用。 +  `软件`是对该程序的描述,会描述软件的版本号和作者。 + +### 热键 + +

+ +

+ +  这个热键功能类似 Deepin 系统自带的快捷键功能。只不过,这个程序会更为强大,它不仅仅可以实现 Deepin 自带的快捷键功能,还可以调用插件所提供的服务。 +  我们先看一下表格所提供的结构: + +- 启用:表示这个热键是否被启用,可以点击直接修改状态。 +- 热键:显示设置的热键。 +- 执行:这个如果是打开指定文件,则为文件路径;如果是插件,则为`插件|服务名`的格式,正是图上所示例子。如果你设置的别名,则以只会显示别名。 +- 参数:执行热键带的参数。 + +  如果你不选择插件,也就是如下图所示的情况,则会使用默认方式打开文件,如果是可执行文件则直接执行。 + +

+ +

+ +  如果你选择了插件,则会是如下的情况: + +

+ +

+ +  在热键中,快捷键、文件路径/服务是必需的,其他都是可选的。 + +### 工具箱 + +  工具箱涉及两个十分重要的东西:“窗口工具”和“工具窗口”。 + +

+ +

+ +  左侧设置“窗口工具”,右侧设置“工具窗口”,可谓分工如此之明确。 +  “窗口工具”如果被调用,就会显示左上角的九宫格(不过有点区别,如果没设置的话,它是无法选择的)。因为截图截不到它,你可以试试“窗口工具”的热键(默认鼠标中键+键盘`Win`键),就会显示它。**保持鼠标按住的状态将鼠标移动到指定格子内,如果格子内有相关设置,松开就会打开相关文件和调用插件相关服务。** +  九宫格中间的格子是无法被设置的,就是默认的关闭按钮,所以你只能设置8个,不过这些差不多已经够了。 +  如果想设置某个格子,需要在这个界面鼠标点击格子,其下方会显示相关的信息,点击笔图标按钮(编辑),就会弹出编辑窗口: + +

+ +

+ +  这个和热键差不多,就是没有了快捷键的案件设置,多了一个图标设置。左下角这个按钮是预览九宫格内的图标,必须有,没有就会无效。不过内部实现该功能的时候,通常会获得默认的图标,只不过特别难看或者区分度不高。 +  图标支持文件和主题图标的设置,如果输入的是完整路径的有效图片,则会加载。如果是主题图标,比如直接输入`dialog`,它会获取系统主题的图标,剩余的其它情况都是非法的。 +  如果你想将某个格子的内容与另一个格子内容进行交换,只需选中第一个待换的格子,然后点击下面中间的按钮(交换),就会弹出交换对话框: + +

+ +

+ +  第一个待换的格子和中间的格子被禁用不能选择,是不是很人性化? +  下一个就是介绍“窗口工具”,先看看调出来是啥样: + +

+ +

+ +  前提你在里面有东西,没有的话就是空的。这个通常用于不太经常用的场合。虽然数量没有限制,但不要太多,多了这个窗体的意义就不特别大了。 + +### 插件 + +  插件标签页包含该软件加载的所有插件信息的显示,如下图所示: + +

+ +

+ +  我们就以图上的为例,所有的插件都会显示这些类似的信息。我们重点关注`服务`和`注册的热键`部分。 +  服务是稍微复杂的一个东西,它每一条都具有三种信息:`调用号:函数声明(函数名)`。 +  调用号如果你是普通用户,是可以不用管,因为你不需要了解太深,函数名也是,主要是给程序员看的。 + +> 注:对于该软件来说,每个插件还可以提供一个类似服务的东西,那就是接口,接口是服务的简化存在,它不会直接暴露给用户使用,但其他插件可以使用系统提供的接口调用,主要用于多插件的合作,由于编程语言的特性可能会导致显示混乱,所以设计成了不暴露给用户查看。 + +### 关于 + +  简单介绍软件。 + +### 赞助 + +  该软件的赞助二维码,感谢大家的支持。 + +## 安装使用插件 + +  安装和卸载插件请保证`root`权限,为了保证安全性安装文件夹的内容只能使用`root`权限去修改。如果直接使用 Deepin 自带文件管理器,就会显示如下信息: + +

+ +

+ +  下面我们来介绍一下文件夹的结构: + +- lang:程序语言文件存放位置,如果想要加载某个语言包请更名为`default.qm`,默认简体中文。 +- plglang:程序插件的语言文件存放位置,如果插件要加载语言文件,还请放到这里。 +- plugin:程序插件的存放处。 + +  插件的文件扩展名是`.wingplg`,语言包扩展名通常是`.qm`。在上图的状态你是无法修改操作的,只需右键“以管理员身份打开”: + +

+ +

+ +  此时如果文件和文件夹右下角没锁了,就说明可以修改了,只需将这两个文件分别放到对应的文件夹下。如果有其他安装要求请遵循它的说明。 + +  如果插件已加载,你可以使用热键`Win + R`(没修改的话)调用运行窗体,选择插件和服务、输入参数运行。不过常用的功能,我的建议还是配置好相应的热键、工具窗体项目或窗体工具项目。 + +## 小结 + +  总体来说,该软件的上手容易程度比 utool 和 quicker 较低,它需要配置和学习基本知识才能继续使用。不过,它提供了更高的灵活性,各插件通过设计精密的插件系统互相交流、互相调用,体现出强大的自动化的力量,满足想 DIY 提高自己生产力同志。 +  本软件还内置`WingToolPy`,它可以使用`Py`脚本实现所有的相关操作,很难想象这个软件的上限在何方。 +  如果你会使用 Qt C++ ,你可以定义你自己的插件,如果可以将自己写好的插件分享给大家,甚至开源共建生态,欢迎加入羽云工具箱大家庭! + +## 下一篇 + +  [插件开发教程](插件开发教程) + +--- + +知识共享许可
+议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 diff --git a/插件开发教程.md b/插件开发教程.md new file mode 100644 index 0000000..bd92108 --- /dev/null +++ b/插件开发教程.md @@ -0,0 +1,299 @@ +**内容贡献者:** 寂静的羽夏 + +## 简述 + +  本篇重点介绍插件如何开发,插件的机制是什么。如果你是非开发人员,本篇 Wiki 对你的作用不大,请不要浪 +自己的时间,本篇将会比较冗长。废话不多说下面开始: + +## 知识要求 + +  熟练使用`C++`并掌握`Qt`开发的基本知识 + +## 开发环境 + +  本篇使用`Qt 5.15.3`,建议与主程序使用的`Qt`框架版本保持一致,否则可能会有插件加载失败的问题。 + +## 模型 + +  本程序提供一个插件接口,名为`IWingToolPlg`,所有的插件都必须继承并实现相应的功能。下面给一个图来 +解本程序的插件模型(假设我要编写一个名为`Plugin`的插件): + +

+ +

+ +  可以看出,该插件结构十分简单,具备了插件的基本功能,同时保留了必要的功能。下面开始逐步介绍: + +## 插件信息 + +  插件信息提供了最基本的信息,包含插件名称、作者、备注等以及要注册的托盘菜单。如下是`iwingtoolplg.h`相关可以重写的函数: + +```cpp +// 指示 SDK 版本,目前采用不兼容模式 +virtual int sdkVersion() = 0; +// 签名,目前固定为 WINGSUMMER 这个宏 +virtual QString signature() = 0; +// 插件的名称,可以使用 tr 实现多语言 +virtual QString pluginName() = 0; +// 插件作者 +virtual QString pluginAuthor() = 0; +// 插件类别,目前还没啥特定的作用,以后发掘 +virtual Catagorys pluginCatagory() = 0; +// 插件版本号,作者定 +virtual uint pluginVersion() = 0; +// 插件网站,供插件作者宣传用 +virtual QString pluginWebsite() = 0; +// 插件说明 +virtual QString pluginComment() = 0; +// 插件图标,我建议必须有一个,否则后面不好识别 +virtual QIcon pluginIcon() = 0; +// 插件服务类,必须继承 QObject ,自定义 +virtual const QMetaObject *serviceMeta() = 0; +// 插件指针 +virtual const QPointer serviceHandler() = 0; +// 插件订阅,如果需要跟踪鼠标就需要订阅 +virtual HookIndex getHookSubscribe() { return HookIndex::None; } +// 注册在程序右键托盘菜单,这个对于某些功能会十分方便 +// 但非必要不要弄,因为这样的插件多了,反而麻烦了,一个插件仅有一项 +// 类型仅支持 QMenu* 或者 QAction* 否则不载入 +virtual QObject *trayRegisteredMenu() { return nullptr; } +// 插件的语言包文件名,如果空插件系统默认不加载 +// 如果有需要还请手动加载 +virtual QString translatorFile() { return QString(); } +``` + +  注释写的十分明白,我就在这里强调一下插件订阅。 +  插件订阅是为了防止接受频率过高的信号发送不必要的接收者,这有一定的资源浪费,目前里面只有鼠标跟踪相关的订阅。 +  订阅完毕后,还需要重写相关的函数,如下所示: + +```cpp +// 当鼠标任何一个键被按下就会触发该函数,如果想处理重载 +virtual void buttonPress(Qt::MouseButton btn, int x, int y) { + Q_UNUSED(btn); + Q_UNUSED(x); + Q_UNUSED(y); +} + +// 当鼠标任何一个键从被按下的状态释放就会触发该函数,如果想处理重载 +virtual void buttonRelease(Qt::MouseButton btn, int x, int y) { + Q_UNUSED(btn); + Q_UNUSED(x); + Q_UNUSED(y); +} + +// 当鼠标进行左键单击时会触发该函数,如果想处理重载 +// 该函数也就是 buttonPress 的一种特殊情况 +virtual void clicked(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); +} + +// 当鼠标双击时会触发该函数,如果想处理重载 +// 注:当鼠标双击时,系统无法识别好第一个点击,会被识别 +// 为单击,但第二个紧接的单击会被识别为双击 +virtual void doubleClicked(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); +} + + // 当鼠标滚轮滚动时会触发该函数,如果想处理重载 + virtual void mouseWheel(MouseWheelEvent direction) { Q_UNUSED(direction); } + +// 当鼠标移动时会触发该函数,如果想处理重载 +virtual void mouseMove(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); +} + +// 当鼠标进行拖拽操作时触发该函数,如果想处理重载 +virtual void mouseDrag(int x, int y) { + Q_UNUSED(x); + Q_UNUSED(y); +} +``` + +## API + +  本插件的所有`API`(即开发接口)都是以信号提供的,如下是支持的函数: + +```cpp +// 注册热键,如果被占用则返回空表示失败(通常是重复), +// 大于等于 0 则表示成功,返回句柄 +QUuid registerHotkey(QKeySequence keyseq); + +// 修改热键状态,其中 id 为注册热键句柄,enable 为热键的新状态 +bool enableHotKey(const QUuid id, bool enabled = true); + +// 修改热键 +bool editHotkey(const QUuid id, QKeySequence seq); + +// 注销热键,其中 id 为注册热键句柄 +bool unregisterHotkey(const QUuid id); + +// 跨插件函数远程调用,其中 puid 为插件的唯一标识, +// callback 为回调函数名称, params 为远程调用的参数 +QVariant remoteCall(const QString provider, const QString callback, + QVector params, RemoteCallError &err); + +// 向某个插件发送一个消息 +// 注:不要用它发送数值小于 0 的消息,会发送失败滴,别瞎搞 +QVariant sendRemoteMessage(const QString provider, int id, + QList params, RemoteCallError &err); + +// 查询某个插件是否存在 +bool isProviderExists(const QString provider); + +// 查询某个插件服务是否含有所述服务 +bool isServiceExists(const QString provider, const QString callback); + +// 查询某个插件服务是否接口 +bool isInterfaceExists(const QString provider, const QString callback); + +// 获取服务的参数类型 +QVector> getServiceParamTypes(const QString provider, + const QString callback); + +// 获取接口的参数类型 +QVector> getInterfaceParamTypes(const QString provider, + const QString callback); + +// 获取全局按下的修饰键序列 +Qt::KeyboardModifiers getPressedKeyModifiers(); + +// 获取全局按下的鼠标按键序列 +Qt::MouseButtons getPressedMouseButtons(); + +// 获取所有插件提供者名称 +QStringList getPluginProviders(); + +// 获取插件信息 +WingPluginInfo getPluginInfo(const QString provider); + +// 获取插件的所有服务名,isTr 指示是否使用本地化的 +QStringList getPluginServices(const QString provider, bool isTr = false); + +// 获取所有插件的所有接口名(注:无去重,可能有重复项) +QStringList getPluginInterfaces(const QString provider); +``` + +  同理,这里不赘述。 + +## 提供服务 + +  了解了这些函数,你还需要学习如何提供服务。而我们的服务,是通过一个类来实现的。相关的接口: + +```cpp +// 插件服务类,必须继承 QObject ,自定义 +virtual const QMetaObject *serviceMeta() = 0; +// 插件指针 +virtual const QPointer serviceHandler() = 0; +``` + +  从接口可以判断出,我们的服务是通过 Qt 的反射机制实现的,这个是为了考虑功能复杂的插件开发难度更改的。我们看看`TestPlugin`是如何提供的,如下是相关代码: + +```cpp +// 如下是提供服务 +class TestService : public QObject { + Q_OBJECT +public: + explicit TestService() {} + explicit TestService(const TestService &) : QObject(nullptr) {} + explicit TestService(QTextBrowser *browser, QDialog *d) + : b(browser), dialog(d) {} + virtual ~TestService() {} + +public slots: + PLUGINSRV void func1(int v) { + b->append(QString("[func1 call] : %1").arg(v)); + } + PLUGINSRV void func2(QString v) { b->append(QString("[func2 call] : ") + v); } + PLUGINSRV void func3() { dialog->setVisible(!dialog->isVisible()); } + +private: + void trans() { + tr("func1"); + tr("func2"); + tr("func3"); + } + +private: + QTextBrowser *b; + QDialog *dialog; +}; + +// 初始化相关 +bool TestPlugin::preInit() { + //... 略 + services = new TestService(tbinfo, dialog); + //... 略 + return true; +} + +// 如下是提供服务说明 +const QPointer TestPlugin::serviceHandler() { + return QPointer(services); +} + +const QMetaObject *TestPlugin::serviceMeta() { return services->metaObject(); } +``` + +  我们先看看如何写一个服务类。 +  服务类需要创建继承于`QObject`的类,带着`Q_OBJECT`这个宏。初始化和析构类相关的和正常的类没有任何区别,只是你要提供的所有的服务需要定义成槽函数,这个的目的是让`Qt`的`moc`系统知道这个函数,以便提供反射相关的服务,这个也是最简单的方式。 +  你可以看到,所有的服务函数前面都带有`PLUGINSRV`,这个宏表示这个就是服务函数,只需加上这个插件系统就会将其注册为服务。 +  还有一个类似服务的存在的接口,上一篇我也介绍过,它对应的宏是`PLUGININT`,使用方式和注册服务函数是一样的。 +  仅仅这样声明函数,我们显示的服务名将和服务函数名一致,这样对使用用户极不友好,我们需要本地化,所以上面声明了一个`trans`函数。这个函数名随便,只要符合`C++`的函数定义要求即可,里面的内容就是一串的`tr`函数的调用,让`Qt`语言家能够识别到。 +  声明完毕后,初始化需要在`preInit`函数,也就是预初始化函数进行初始化服务,语言本地化是在`preInit`函数之前做好的,如果不手动加载语言包的话,之后处理起来会比较麻烦。 +  有关提供服务这块,我们就介绍这么多。 + +## 消息管道 + +  消息管道是插件获取消息的唯一渠道,有关加载插件阶段信息以及消息都是通过消息管道传送的。该消息管 +函数必须重写,如下所示: + +```cpp +void plugin2MessagePipe(WingPluginMessage type, QList msg) override; +``` + +  插件之间也是可以互相发送消息号大于等于0的消息的,小于0的消息被保留。 + +## 插件加载流程 + +  这里就简单介绍插件加载流程,具体可以翻阅源代码。 +  当插件一旦被插件系统选中并尝试加载时,首先是校验插件的合法性,由于需要预初始化,所以先只检查标识、SDK 版本和插件名的合法性。下一波开始加载插件的语言包文件,如果存在,开始预初始化操作。 +  如果预初始化成功,就开始检查服务的合法性。检查通过之后,就发送开始初始化消息,正式初始化函数。初始化通过之后,如果有托盘菜单就注册,然后建立 API 调用通信,最后发送插件已加载完的消息,此时,所有的`API`已经完全可用。 + +## 插件卸载 + +  插件如果合法,是不会被插件系统主动卸载的。插件会随着插件系统的销毁而被卸载: + +```cpp +void PluginSystem::UnloadPlugin() { + for (auto item : m_plgs) { + item->unload(); + item->deleteLater(); + } +} +``` + +## 插件开发规范 + +  为了让用户拥有更好的使用体验,避免已知 Bug ,请遵守以下规范: + +1. 如果使用多语言本地化操作,请放到`plglang`文件夹下,并保持开头必须包含你的插件相关信息。比如我开发了一个插件`liba.wingplg`,请命名为`a.qm`或`liba.qm`形式。 +2. 使用`Qt`开发插件的时候,它会默认在前面加`lib`,建议保留。 +3. 插件文件名不建议使用中文名称。 +4. 不要随意修改`iwingtoolplg.h`文件,如果你不是项目开发维护者,这是很不明智的行为。它可能会使插件加载失败、想要用函数`A`结果调用`B`,甚至宿主程序崩溃的情况。 +6. 开发插件强烈建议 **开放源代码**,因为插件接口一旦更改,将采用互不兼容的模式,如果你能紧跟我的发行版也是没问题。 +7. 如果插件含有资源,请在根目录前缀修改为和插件名称一致。由于默认新建的资源为`/`,也就是根,这个必须修改,以防和他插件甚至和宿主资源冲突。 +8. 不要在插件加载完毕之前调用 API ,因为没用。 +9. 对于服务,声明函数 **不要有缺省参数,同函数名不同参数!** 因为这样会导致同一个服务名显示多个,这个插件的开发是不合格的。**如果有这样的需求请自己将其定义为接口,然后通过其他方式解决,而不是服务!** +10. 服务参数中不得含有无法从字符串转化的参数类型,比如 QList 、QVector 等等。否则这也是插件不合格的一个体现。还请将其设计为 **接口** 。 +11. 不要忽略每一个警告,除非这警告不是因为你的代码而起。 +12. 插件内容不得含有违反国家法律法规和社会道德的内容,如果想打广告,只能含有插件功能相关的广告,并且只能在插件中心中体现,不能主动弹出。插件内部不得还有干扰用户使用的相关恶意代码。 +13. 插件中心的实现最起码要有个弹窗,不要啥反应都没有。 + +--- + +知识共享许可
+议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 diff --git a/简介.md b/简介.md new file mode 100644 index 0000000..608f7d9 --- /dev/null +++ b/简介.md @@ -0,0 +1,129 @@ +**内容贡献者:** 寂静的羽夏 + +- [简述](#简述) + - [协议](#协议) +- [有关 issue](#有关-issue) +- [使用环境](#使用环境) +- [开发框架](#开发框架) +- [以后维护](#以后维护) +- [如何编译](#如何编译) + - [安装开发环境](#安装开发环境) + - [下载源代码](#下载源代码) + - [编译代码](#编译代码) +- [安装](#安装) +- [目录](#目录) +- [下一篇](#下一篇) + +## 简述 + +  `WingTool`是一个强大的插件工具箱,中文名`羽云工具箱`,支持热键响应、鼠标跟踪等基本接口。通过开发强大的对应的插件,就可以大大提高生产力。 + +  该软件如果没有任何插件,仅支持添加热键使用默认方式打开任何文件。插件的强大决定着该软件的上限,通过热键可以配置使用热键调用插件借口;默认通过鼠标中键配合`Ctrl`键可以调出工具窗口,选择合适的工具;也可以通过热键调出窗口工具,点击打开所需的文件或者软件,而不必从启动器翻找,避免任务栏图标过多以及桌面文件过多的情况。 + +

+WingTool +

+ +

+作者 +协议 +

+ +  如下是羽云十六进制编辑器的目前的主界面: + +

+效果图 +

羽云工具箱

+

+ +> 本 WIKI 目前适用于 v1.0.0 公测版及其之后的版本,请及时关注版本更新。 + +### 协议 + +  本软件如果是开源版本将遵循`AGPL-3.0`协议,请勿用于该协议之外的用途。如果你想将本软件的代码用于闭源商业代码,想要解除`GPL`系列的必须开源的限制,请必须亲自咨询我,商讨商业授权相关事宜。 + +## 有关 issue + +  本软件定位是本地生产力基础工具,旨在快速启动和使用高效工具。本人不考虑像 utool 和 quicker 之类提供插件商店。该程序不会进行与网络相关的任何操作,所有的插件安装都是本地的。如果有仅本地的需要,待该软件出 beta 之后,可以尝试该软件,发现 Bug 并递交修复。 + +## 使用环境 + +  本软件我仅仅适配 Deepin 平台,当然运行在其他 Linux 发行版也是可能的。但如果你是 Windows 操作系统以及其他的,那只能请等待其他有志之士提供维护。本 Wiki 的一切与软件功能相关介绍以最新版稳准。 + +## 开发框架 + +  QT 5.15.3 和 DTK 。 + +## 以后维护 + +  因为以后要搞科研了,所以爱好就要得放一放了。我只会在我的娱乐时间范畴进行代码的开发和维护。为了保证软件的易用性和可能受众之广,所以更新发行版相当缓慢。 + +## 如何编译 + +  本部分仅面向 Deepin 用户来进行最傻瓜式的编译。为什么写这部分?因为我发布发行版比较懒,一般是功能大改的时候才会发布,有一些 Bug 可能已经修复了,但限于发布平台的审核以及自己想积累一段更新再发布发行版的懒惰,就没有更新的发行版。那么普通非开发用户如何去编译它呢?下面将会介绍。 + +### 安装开发环境 + +  如果你没有开发环境,首先要安装 QT 和 DTK 。因为你是 Deepin ,就不用担心我的最新版代码受版本限制无法编译通过的问题,我会保持使用最新版本的 QT 和 DTK 。只要你的版本与应用商店最新保持一致即可。 + +  打开终端,输入以下指令: + +```bash +sudo apt install qt5-default qt5-qmake qt5-qmake g++ qtcreator libxtst-dev libqt5x11extras5-dev +``` + +  输入密码安装成功后,到应用商店,搜索`DTK`,如下图所示: + +

+ +

+ +  点击安装即可。 + +### 下载源代码 + +  如果你会`git`,那么直接`clone`。如果不会,可以直接点击下载打包好的源码,如下图所示(推荐第二个): + +

+ +

+ +  下载解压完毕后,你会看到文件夹和仓库显示的一样的文件布局,这说明是下载正确的。 + +### 编译代码 + +  我们双击打开`WingTool.pro`。这个是我们的项目文件,打开需要简单的配置,只需要点击`configure`按钮即可。至此,我们就可以进行编译工作了。 + +  首先点击小电脑图标,再点击`WingHexExplorer`选项,其次`Release`,最后点击锤子图标,就开始编译了,代码量稍大,第一次编译需要的时间稍长,稍等不到半分钟就完成了。 + +  然后拷贝该文件到`/opt/WingTool`文件夹下,点击覆盖即可。 + +  我们还要替换语言包文件,否则有些新添加的字符串将显示不正常,会显示英文缩写。找到`lang`文件夹,你会看到如下几个文件: + +

+ +

+ +  在编程中,`zh`表示是中文的意思。由于我是中国人,使用的是简体,所以语言包就是简体中文。`zh.qm`文件就是我们需要的最新语言包,而`zh.ts`是我翻译使用的,对你来说没啥用处,只对想要翻译成其他语言的同志有用。 + +  把它拷贝到你的安装目录下的`lang`文件夹,把`zh`改为`default`,也就是替换文件。程序会把程序目录下的`lang/default.qm`作为语言包进行加载。如果你是其他语言使用者,也可以通过该操作来转化成你所使用的语言。 + +## 安装 + +  目前安装主要有两种方式:通过仓库下载`deb`安装包安装和星火商店安装(商店的方式稍等)。 + +## 目录 + +  本 Wiki 作为该软件的使用教学,同时提供羽云十六进制编辑器的插件开发教程,一起增强程序功能,为开源社区的发展贡献自己的力量。 + +- **简介(本篇即是)** +- [使用教程](使用教程) +- [插件开发教程](插件开发教程) + +## 下一篇 + +  [使用教程](使用教程) + +--- + +知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。