feat: 任务栏插件显示大小新增支持自定义宽度(或高度)

新增插件大小策略枚举类型,支持"跟随系统"和"自定义"两种类型,默认类型为"跟随系统",那么
这样系统自带的插件大小就不需要重新写代码控制,当需要控制插件大小时,返回"自定义"类型即
可.

Log: 任务栏插件显示大小新增支持自定义宽度(或高度)
Task: https://pms.uniontech.com/zentao/task-view-44090.html
Change-Id: I6c883a66e6fe37b14b78e34d093aaf86149ee972
This commit is contained in:
苏义航 2020-11-06 17:52:08 +08:00 committed by suyihang
parent 039b985355
commit 9188fff15b
13 changed files with 115 additions and 16 deletions

View File

@ -42,16 +42,21 @@ void DockPluginsController::itemAdded(PluginsItemInterface *const itemInter, con
if (mPluginsMap[itemInter].contains(itemKey)) if (mPluginsMap[itemInter].contains(itemKey))
return; return;
// 取 plugin api
QPluginLoader *pluginLoader = qobject_cast<QPluginLoader*>(mPluginsMap[itemInter].value("pluginloader"));
const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject();
const QString &pluginApi = meta.value("api").toString();
PluginsItem *item = nullptr; PluginsItem *item = nullptr;
if (itemInter->pluginName() == "tray") { if (itemInter->pluginName() == "tray") {
item = new TrayPluginItem(itemInter, itemKey); item = new TrayPluginItem(itemInter, itemKey, pluginApi);
if (item->graphicsEffect()) { if (item->graphicsEffect()) {
item->graphicsEffect()->setEnabled(false); item->graphicsEffect()->setEnabled(false);
} }
connect(static_cast<TrayPluginItem *>(item), &TrayPluginItem::trayVisableCountChanged, connect(static_cast<TrayPluginItem *>(item), &TrayPluginItem::trayVisableCountChanged,
this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection); this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection);
} else { } else {
item = new PluginsItem(itemInter, itemKey); item = new PluginsItem(itemInter, itemKey, pluginApi);
} }
mPluginsMap[itemInter][itemKey] = item; mPluginsMap[itemInter][itemKey] = item;

View File

@ -23,6 +23,7 @@
#include "pluginsitem.h" #include "pluginsitem.h"
#include "pluginsiteminterface.h" #include "pluginsiteminterface.h"
#include "util/utils.h"
#include "util/imagefactory.h" #include "util/imagefactory.h"
#include <QPainter> #include <QPainter>
@ -36,10 +37,11 @@
QPoint PluginsItem::MousePressPoint = QPoint(); 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) : DockItem(parent)
, m_pluginInter(pluginInter) , m_pluginInter(pluginInter)
, m_centralWidget(m_pluginInter->itemWidget(itemKey)) , m_centralWidget(m_pluginInter->itemWidget(itemKey))
, m_pluginApi(plginApi)
, m_itemKey(itemKey) , m_itemKey(itemKey)
, m_dragging(false) , m_dragging(false)
, m_gsettings(nullptr) , m_gsettings(nullptr)
@ -99,6 +101,16 @@ QString PluginsItem::pluginName() const
return m_pluginInter->pluginName(); 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 DockItem::ItemType PluginsItem::itemType() const
{ {
if (m_pluginInter->type() == PluginsItemInterface::Normal) { if (m_pluginInter->type() == PluginsItemInterface::Normal) {

View File

@ -31,7 +31,7 @@ class PluginsItem : public DockItem
Q_OBJECT Q_OBJECT
public: 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; ~PluginsItem() override;
int itemSortKey() const; int itemSortKey() const;
@ -41,6 +41,7 @@ public:
void setInContainer(const bool container); void setInContainer(const bool container);
QString pluginName() const; QString pluginName() const;
PluginsItemInterface::PluginSizePolicy pluginSizePolicy() const;
using DockItem::showContextMenu; using DockItem::showContextMenu;
using DockItem::hidePopup; using DockItem::hidePopup;
@ -80,6 +81,7 @@ private:
PluginsItemInterface *const m_pluginInter; PluginsItemInterface *const m_pluginInter;
QWidget *m_centralWidget; QWidget *m_centralWidget;
const QString m_pluginApi;
const QString m_itemKey; const QString m_itemKey;
bool m_dragging; bool m_dragging;

View File

@ -24,8 +24,8 @@
#include <QEvent> #include <QEvent>
#include <QGSettings> #include <QGSettings>
TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, QWidget *parent) TrayPluginItem::TrayPluginItem(PluginsItemInterface * const pluginInter, const QString &itemKey, const QString &pluginApi, QWidget *parent)
: PluginsItem(pluginInter, itemKey, parent) : PluginsItem(pluginInter, itemKey, pluginApi, parent)
{ {
centralWidget()->installEventFilter(this); centralWidget()->installEventFilter(this);
} }

View File

@ -29,7 +29,7 @@ class TrayPluginItem : public PluginsItem
Q_OBJECT Q_OBJECT
public: 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;} inline ItemType itemType() const override {return ItemType::TrayPlugin;}

View File

@ -1058,10 +1058,17 @@ void MainPanelControl::calcuDockIconSize(int w, int h, PluginsItem *trashPlugin,
if (layout) { if (layout) {
PluginsItem *pItem = static_cast<PluginsItem *>(layout->itemAt(0)->widget()); PluginsItem *pItem = static_cast<PluginsItem *>(layout->itemAt(0)->widget());
if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) { if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) {
if (pItem->pluginName() == "datetime") { // 根据大小策略控制插件大小
pItem->setFixedSize(pItem->sizeHint().width(), h); switch (pItem->pluginSizePolicy()) {
} else { case PluginsItemInterface::System:
pItem->setFixedSize(tray_item_size, tray_item_size); 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) { if (layout) {
PluginsItem *pItem = static_cast<PluginsItem *>(layout->itemAt(0)->widget()); PluginsItem *pItem = static_cast<PluginsItem *>(layout->itemAt(0)->widget());
if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) { if (pItem && pItem != trashPlugin && pItem != shutdownPlugin && pItem != keyboardPlugin && pItem !=notificationPlugin) {
if (pItem->pluginName() == "datetime") { // 根据大小策略控制插件大小
pItem->setFixedSize(w, pItem->sizeHint().height()); switch (pItem->pluginSizePolicy()) {
} else { case PluginsItemInterface::System:
pItem->setFixedSize(tray_item_size, tray_item_size); 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;
} }
} }
} }

View File

@ -32,6 +32,7 @@ static const QStringList CompatiblePluginApiList {
"1.1.1", "1.1.1",
"1.2", "1.2",
"1.2.1", "1.2.1",
"1.2.2",
DOCK_PLUGIN_API_VERSION DOCK_PLUGIN_API_VERSION
}; };
@ -194,7 +195,10 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile)
return; return;
} }
m_pluginsMap.insert(interface, QMap<QString, QObject *>()); // 保存 PluginLoader 对象指针
QMap<QString, QObject *> interfaceData;
interfaceData["pluginloader"] = pluginLoader;
m_pluginsMap.insert(interface, interfaceData);
QString dbusService = meta.value("depends-daemon-dbus-service").toString(); QString dbusService = meta.value("depends-daemon-dbus-service").toString();
if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) { if (!dbusService.isEmpty() && !m_dbusDaemonInterface->isServiceRegistered(dbusService).value()) {

View File

@ -82,6 +82,47 @@ inline bool isSettingConfigured(const QString& id, const QString& path, const QS
} }
return v.toBool(); 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 #endif // UTILS

View File

@ -27,7 +27,7 @@
namespace Dock { namespace Dock {
#define DOCK_PLUGIN_MIME "dock/plugin" #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" #define PROP_DISPLAY_MODE "DisplayMode"

View File

@ -40,6 +40,14 @@ public:
Fixed Fixed
}; };
/**
* @brief Plugin size policy
*/
enum PluginSizePolicy {
System = 1 << 0, // Follow the system
Custom = 1 << 1 // The custom
};
/// ///
/// \brief ~PluginsItemInterface /// \brief ~PluginsItemInterface
/// DON'T try to delete m_proxyInter. /// DON'T try to delete m_proxyInter.
@ -229,6 +237,12 @@ public:
/// ///
virtual PluginType type() { return Normal; } virtual PluginType type() { return Normal; }
///
/// \brief plugin size policy
/// default plugin size policy
///
virtual PluginSizePolicy pluginSizePolicy() const { return System; }
protected: protected:
/// ///
/// \brief m_proxyInter /// \brief m_proxyInter

View File

@ -1,3 +1,3 @@
{ {
"api": "1.1.1" "api": "1.2.3"
} }

View File

@ -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())); 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 const QString DatetimePlugin::pluginName() const
{ {
return "datetime"; return "datetime";

View File

@ -42,6 +42,8 @@ class DatetimePlugin : public QObject, PluginsItemInterface
public: public:
explicit DatetimePlugin(QObject *parent = nullptr); explicit DatetimePlugin(QObject *parent = nullptr);
PluginSizePolicy pluginSizePolicy() const override;
const QString pluginName() const override; const QString pluginName() const override;
const QString pluginDisplayName() const override; const QString pluginDisplayName() const override;
void init(PluginProxyInterface *proxyInter) override; void init(PluginProxyInterface *proxyInter) override;