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))
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;
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<TrayPluginItem *>(item), &TrayPluginItem::trayVisableCountChanged,
this, &DockPluginsController::trayVisableCountChanged, Qt::UniqueConnection);
} else {
item = new PluginsItem(itemInter, itemKey);
item = new PluginsItem(itemInter, itemKey, pluginApi);
}
mPluginsMap[itemInter][itemKey] = item;

View File

@ -23,6 +23,7 @@
#include "pluginsitem.h"
#include "pluginsiteminterface.h"
#include "util/utils.h"
#include "util/imagefactory.h"
#include <QPainter>
@ -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) {

View File

@ -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;

View File

@ -24,8 +24,8 @@
#include <QEvent>
#include <QGSettings>
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);
}

View File

@ -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;}

View File

@ -1058,10 +1058,17 @@ void MainPanelControl::calcuDockIconSize(int w, int h, PluginsItem *trashPlugin,
if (layout) {
PluginsItem *pItem = static_cast<PluginsItem *>(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<PluginsItem *>(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;
}
}
}

View File

@ -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<QString, QObject *>());
// 保存 PluginLoader 对象指针
QMap<QString, QObject *> 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()) {

View File

@ -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

View File

@ -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"

View File

@ -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

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()));
}
PluginsItemInterface::PluginSizePolicy DatetimePlugin::pluginSizePolicy() const
{
return PluginsItemInterface::Custom;
}
const QString DatetimePlugin::pluginName() const
{
return "datetime";

View File

@ -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;