From 9188fff15bdac20edbd14290bb1e44c1bcef28b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F=E4=B9=89=E8=88=AA?= Date: Fri, 6 Nov 2020 17:52:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=BB=E5=8A=A1=E6=A0=8F=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E6=98=BE=E7=A4=BA=E5=A4=A7=E5=B0=8F=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E5=AE=BD=E5=BA=A6?= =?UTF-8?q?(=E6=88=96=E9=AB=98=E5=BA=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增插件大小策略枚举类型,支持"跟随系统"和"自定义"两种类型,默认类型为"跟随系统",那么 这样系统自带的插件大小就不需要重新写代码控制,当需要控制插件大小时,返回"自定义"类型即 可. Log: 任务栏插件显示大小新增支持自定义宽度(或高度) Task: https://pms.uniontech.com/zentao/task-view-44090.html Change-Id: I6c883a66e6fe37b14b78e34d093aaf86149ee972 --- frame/controller/dockpluginscontroller.cpp | 9 +++-- frame/item/pluginsitem.cpp | 14 +++++++- frame/item/pluginsitem.h | 4 ++- frame/item/traypluginitem.cpp | 4 +-- frame/item/traypluginitem.h | 2 +- frame/panel/mainpanelcontrol.cpp | 26 ++++++++++---- frame/util/abstractpluginscontroller.cpp | 6 +++- frame/util/utils.h | 41 ++++++++++++++++++++++ interfaces/constants.h | 2 +- interfaces/pluginsiteminterface.h | 14 ++++++++ plugins/datetime/datetime.json | 2 +- plugins/datetime/datetimeplugin.cpp | 5 +++ plugins/datetime/datetimeplugin.h | 2 ++ 13 files changed, 115 insertions(+), 16 deletions(-) diff --git a/frame/controller/dockpluginscontroller.cpp b/frame/controller/dockpluginscontroller.cpp index 7aad842a5..62b0bb8ae 100644 --- a/frame/controller/dockpluginscontroller.cpp +++ b/frame/controller/dockpluginscontroller.cpp @@ -42,16 +42,21 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con if (mPluginsMap[itemInter].contains(itemKey)) return; + // 取 plugin api + QPluginLoader *pluginLoader = qobject_cast(mPluginsMap[itemInter].value("pluginloader")); + const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); + const QString &pluginApi = meta.value("api").toString(); + PluginsItem *item = nullptr; if (itemInter->pluginName() == "tray") { - item = new TrayPluginItem(itemInter, itemKey); + item = new TrayPluginItem(itemInter, itemKey, pluginApi); if (item->graphicsEffect()) { item->graphicsEffect()->setEnabled(false); } connect(static_cast(item), &TrayPluginItem::trayVisableCountChanged, this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); } else { - item = new PluginsItem(itemInter, itemKey); + item = new PluginsItem(itemInter, itemKey, pluginApi); } mPluginsMap[itemInter][itemKey] = item; diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 2a401274e..c19991d7b 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -23,6 +23,7 @@ #include "pluginsitem.h" #include "pluginsiteminterface.h" +#include "util/utils.h" #include "util/imagefactory.h" #include @@ -36,10 +37,11 @@ QPoint PluginsItem::MousePressPoint = QPoint(); -PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent) +PluginsItem::PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent) : DockItem(parent) , m_pluginInter(pluginInter) , m_centralWidget(m_pluginInter->itemWidget(itemKey)) + , m_pluginApi(plginApi) , m_itemKey(itemKey) , m_dragging(false) , m_gsettings(nullptr) @@ -99,6 +101,16 @@ QString PluginsItem::pluginName() const return m_pluginInter->pluginName(); } +PluginsItemInterface::PluginSizePolicy PluginsItem::pluginSizePolicy() const +{ + // 插件版本大于 1.2.2 才能使用 PluginsItemInterface::pluginSizePolicy 函数 + if (Utils::comparePluginApi(m_pluginApi, "1.2.2") > 0) { + return m_pluginInter->pluginSizePolicy(); + } else { + return PluginsItemInterface::System; + } +} + DockItem::ItemType PluginsItem::itemType() const { if (m_pluginInter->type() == PluginsItemInterface::Normal) { diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index e8ef4f262..cee9a859c 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -31,7 +31,7 @@ class PluginsItem : public DockItem Q_OBJECT public: - explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + explicit PluginsItem(PluginsItemInterface *const pluginInter, const QString &itemKey, const QString &plginApi, QWidget *parent = nullptr); ~PluginsItem() override; int itemSortKey() const; @@ -41,6 +41,7 @@ public: void setInContainer(const bool container); QString pluginName() const; + PluginsItemInterface::PluginSizePolicy pluginSizePolicy() const; using DockItem::showContextMenu; using DockItem::hidePopup; @@ -80,6 +81,7 @@ private: PluginsItemInterface *const m_pluginInter; QWidget *m_centralWidget; + const QString m_pluginApi; const QString m_itemKey; bool m_dragging; diff --git a/frame/item/traypluginitem.cpp b/frame/item/traypluginitem.cpp index 6746ee246..916f3341a 100644 --- a/frame/item/traypluginitem.cpp +++ b/frame/item/traypluginitem.cpp @@ -24,8 +24,8 @@ #include #include -TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent) - : PluginsItem(pluginInter, itemKey, parent) +TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QString &pluginApi, QWidget *parent) + : PluginsItem(pluginInter, itemKey, pluginApi, parent) { centralWidget()->installEventFilter(this); } diff --git a/frame/item/traypluginitem.h b/frame/item/traypluginitem.h index 648b62e14..2e77b9e56 100644 --- a/frame/item/traypluginitem.h +++ b/frame/item/traypluginitem.h @@ -29,7 +29,7 @@ class TrayPluginItem : public PluginsItem Q_OBJECT public: - TrayPluginItem(PluginsItemInterface* const pluginInter, const QString &itemKey, QWidget *parent = nullptr); + TrayPluginItem(PluginsItemInterface* const pluginInter, const QString &itemKey, const QString &pluginApi, QWidget *parent = nullptr); inline ItemType itemType() const override {return ItemType::TrayPlugin;} diff --git a/frame/panel/mainpanelcontrol.cpp b/frame/panel/mainpanelcontrol.cpp index 3c8021a75..235c1bee4 100755 --- a/frame/panel/mainpanelcontrol.cpp +++ b/frame/panel/mainpanelcontrol.cpp @@ -1058,10 +1058,17 @@ void MainPanelControl::calcuDockIconSize(int w, int h, PluginsItem *trashPlugin, if (layout) { PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) { - if (pItem->pluginName() == "datetime") { - pItem->setFixedSize(pItem->sizeHint().width(), h); - } else { + // 根据大小策略控制插件大小 + switch (pItem->pluginSizePolicy()) { + case PluginsItemInterface::System: pItem->setFixedSize(tray_item_size, tray_item_size); + break; + case PluginsItemInterface::Custom: + pItem->setFixedSize(pItem->sizeHint().width(), h); + break; + default: + pItem->setFixedSize(tray_item_size, tray_item_size); + break; } } } @@ -1073,10 +1080,17 @@ void MainPanelControl::calcuDockIconSize(int w, int h, PluginsItem *trashPlugin, if (layout) { PluginsItem *pItem = static_cast(layout->itemAt(0)->widget()); if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) { - if (pItem->pluginName() == "datetime") { - pItem->setFixedSize(w, pItem->sizeHint().height()); - } else { + // 根据大小策略控制插件大小 + switch (pItem->pluginSizePolicy()) { + case PluginsItemInterface::System: pItem->setFixedSize(tray_item_size, tray_item_size); + break; + case PluginsItemInterface::Custom: + pItem->setFixedSize(w, pItem->sizeHint().height()); + break; + default: + pItem->setFixedSize(tray_item_size, tray_item_size); + break; } } } diff --git a/frame/util/abstractpluginscontroller.cpp b/frame/util/abstractpluginscontroller.cpp index cb6745294..f6a166321 100644 --- a/frame/util/abstractpluginscontroller.cpp +++ b/frame/util/abstractpluginscontroller.cpp @@ -32,6 +32,7 @@ static const QStringList CompatiblePluginApiList { "1.1.1", "1.2", "1.2.1", + "1.2.2", DOCK_PLUGIN_API_VERSION }; @@ -194,7 +195,10 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile) return; } - m_pluginsMap.insert(interface, QMap()); + // 保存 PluginLoader 对象指针 + QMap interfaceData; + interfaceData["pluginloader"] = pluginLoader; + m_pluginsMap.insert(interface, interfaceData); QString dbusService = meta.value("depends-daemon-dbus-service").toString(); if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) { diff --git a/frame/util/utils.h b/frame/util/utils.h index 5fd928e3f..79229e620 100644 --- a/frame/util/utils.h +++ b/frame/util/utils.h @@ -82,6 +82,47 @@ inline bool isSettingConfigured(const QString& id, const QString& path, const QS } return v.toBool(); } + +/** +* @brief 比较两个插件版本号的大小 +* @param pluginApi1 第一个插件版本号 +* @param pluginApi2 第二个插件版本号 +* @return 0:两个版本号相等,1:第一个版本号大,-1:第二个版本号大 +*/ +inline int comparePluginApi(const QString &pluginApi1, const QString &pluginApi2) { + // 版本号相同 + if (pluginApi1 == pluginApi2) + return 0; + + // 拆分版本号 + QStringList subPluginApis1 = pluginApi1.split(".", QString::SkipEmptyParts, Qt::CaseSensitive); + QStringList subPluginApis2 = pluginApi2.split(".", QString::SkipEmptyParts, Qt::CaseSensitive); + for (int i = 0; i < subPluginApis1.size(); ++i) { + auto subPluginApi1 = subPluginApis1[i]; + if (subPluginApis2.size() > i) { + auto subPluginApi2 = subPluginApis2[i]; + + // 相等判断下一个子版本号 + if (subPluginApi1 == subPluginApi2) + continue; + + // 转成整形比较 + if (subPluginApi1.toInt() > subPluginApi2.toInt()) { + return 1; + } else { + return -1; + } + } + } + + // 循环结束但是没有返回,说明子版本号个数不同,且前面的子版本号都相同 + // 子版本号多的版本号大 + if (subPluginApis1.size() > subPluginApis2.size()) { + return 1; + } else { + return -1; + } +} } #endif // UTILS diff --git a/interfaces/constants.h b/interfaces/constants.h index f94c94cde..03ab85332 100644 --- a/interfaces/constants.h +++ b/interfaces/constants.h @@ -27,7 +27,7 @@ namespace Dock { #define DOCK_PLUGIN_MIME "dock/plugin" -#define DOCK_PLUGIN_API_VERSION "1.2.2" +#define DOCK_PLUGIN_API_VERSION "1.2.3" #define PROP_DISPLAY_MODE "DisplayMode" diff --git a/interfaces/pluginsiteminterface.h b/interfaces/pluginsiteminterface.h index 80ee6528f..30de23e66 100644 --- a/interfaces/pluginsiteminterface.h +++ b/interfaces/pluginsiteminterface.h @@ -40,6 +40,14 @@ public: Fixed }; + /** + * @brief Plugin size policy + */ + enum PluginSizePolicy { + System = 1 << 0, // Follow the system + Custom = 1 << 1 // The custom + }; + /// /// \brief ~PluginsItemInterface /// DON'T try to delete m_proxyInter. @@ -229,6 +237,12 @@ public: /// virtual PluginType type() { return Normal; } + /// + /// \brief plugin size policy + /// default plugin size policy + /// + virtual PluginSizePolicy pluginSizePolicy() const { return System; } + protected: /// /// \brief m_proxyInter diff --git a/plugins/datetime/datetime.json b/plugins/datetime/datetime.json index ad498eeb3..c08700b90 100644 --- a/plugins/datetime/datetime.json +++ b/plugins/datetime/datetime.json @@ -1,3 +1,3 @@ { - "api": "1.1.1" + "api": "1.2.3" } diff --git a/plugins/datetime/datetimeplugin.cpp b/plugins/datetime/datetimeplugin.cpp index ddef3e1d6..ce26e2466 100644 --- a/plugins/datetime/datetimeplugin.cpp +++ b/plugins/datetime/datetimeplugin.cpp @@ -42,6 +42,11 @@ DatetimePlugin::DatetimePlugin(QObject *parent) sessionBus.connect("com.deepin.daemon.Timedate", "/com/deepin/daemon/Timedate", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged())); } +PluginsItemInterface::PluginSizePolicy DatetimePlugin::pluginSizePolicy() const +{ + return PluginsItemInterface::Custom; +} + const QString DatetimePlugin::pluginName() const { return "datetime"; diff --git a/plugins/datetime/datetimeplugin.h b/plugins/datetime/datetimeplugin.h index 0bafa90e0..ce930b612 100644 --- a/plugins/datetime/datetimeplugin.h +++ b/plugins/datetime/datetimeplugin.h @@ -42,6 +42,8 @@ class DatetimePlugin : public QObject, PluginsItemInterface public: explicit DatetimePlugin(QObject *parent = nullptr); + PluginSizePolicy pluginSizePolicy() const override; + const QString pluginName() const override; const QString pluginDisplayName() const override; void init(PluginProxyInterface *proxyInter) override;