fix: 插件根据标记来决定插件的类型

在决定插件的位置的时候,根据插件的返回的标记来决定当前插件是属于固定插件、快捷插件、托盘插件、系统插件还是工具插件

Log:
Influence: 任务栏插件类型
Task: https://pms.uniontech.com/task-view-220099.html
Change-Id: I5dedc16fd7ccaac9d54dccf657e1a938bf3f2160
This commit is contained in:
donghualin 2022-11-28 15:30:34 +08:00
parent c7df15ce0e
commit 4f3f7a0aed
15 changed files with 64 additions and 76 deletions

View File

@ -20,7 +20,6 @@
*/ */
#include "quicksettingcontroller.h" #include "quicksettingcontroller.h"
#include "quicksettingitem.h" #include "quicksettingitem.h"
#include "pluginsiteminterface.h"
#include "proxyplugincontroller.h" #include "proxyplugincontroller.h"
#include "pluginsitem.h" #include "pluginsitem.h"
@ -88,33 +87,33 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt
QuickSettingController::PluginAttribute QuickSettingController::pluginAttribute(PluginsItemInterface * const itemInter) const QuickSettingController::PluginAttribute QuickSettingController::pluginAttribute(PluginsItemInterface * const itemInter) const
{ {
QPluginLoader *pluginLoader = ProxyPluginController::instance(PluginType::QuickPlugin)->pluginLoader(itemInter); // 工具插件,例如回收站
if (!pluginLoader) if (hasFlag(itemInter, PluginFlag::Type_Tool))
return PluginAttribute::Tool;
// 系统插件,例如关机按钮
if (hasFlag(itemInter, PluginFlag::Type_System))
return PluginAttribute::System;
// 托盘插件,例如磁盘图标
if (hasFlag(itemInter, PluginFlag::Type_Tray))
return PluginAttribute::Tray;
// 固定插件,例如显示桌面和多任务试图
if (hasFlag(itemInter, PluginFlag::Type_Fixed))
return PluginAttribute::Fixed;
// 通用插件,一般的插件都是通用插件,就是放在快捷插件区域的那些插件
if (hasFlag(itemInter, PluginFlag::Type_Common))
return PluginAttribute::Quick; return PluginAttribute::Quick;
if (pluginLoader->fileName().contains(TRAY_PATH)) { // 基本插件,不在任务栏上显示的插件
// 如果是从系统目录下加载的插件,则认为它是系统插件,此时需要放入到托盘中 return PluginAttribute::None;
return PluginAttribute::Tray; }
}
const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject(); bool QuickSettingController::hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const
if (meta.contains("tool") && meta.value("tool").toBool()) { {
// 如果有tool标记则认为它是工具插件例如回收站和窗管提供的相关插件 return itemInter->flags() & flag;
return PluginAttribute::Tool;
}
if (meta.contains("system") && meta.value("system").toBool()) {
// 如果有system标记则认为它是右侧的关机按钮插件
return PluginAttribute::System;
}
if (meta.contains("fixed") && meta.value("fixed").toBool()) {
// 如果有fixed标记则认为它是固定区域的插件例如显示桌面和多任务视图
return PluginAttribute::Fixed;
}
// 其他的都认为是快捷插件
return PluginAttribute::Quick;
} }
QuickSettingController *QuickSettingController::instance() QuickSettingController *QuickSettingController::instance()
@ -161,10 +160,7 @@ QList<PluginsItemInterface *> QuickSettingController::pluginInSettings()
if (plugin->pluginDisplayName().isEmpty()) if (plugin->pluginDisplayName().isEmpty())
continue; continue;
PluginAttribute pluginAttr = pluginAttribute(plugin); if (hasFlag(plugin, PluginFlag::Attribute_CanSetting))
if (pluginAttr == QuickSettingController::PluginAttribute::Quick
|| pluginAttr == QuickSettingController::PluginAttribute::System
|| pluginAttr == QuickSettingController::PluginAttribute::Tool)
settingPlugins << plugin; settingPlugins << plugin;
} }

View File

@ -22,6 +22,7 @@
#define QUICKSETTINGCONTROLLER_H #define QUICKSETTINGCONTROLLER_H
#include "abstractpluginscontroller.h" #include "abstractpluginscontroller.h"
#include "pluginsiteminterface.h"
class QuickSettingItem; class QuickSettingItem;
class PluginsItem; class PluginsItem;
@ -32,7 +33,8 @@ class QuickSettingController : public AbstractPluginsController
public: public:
enum class PluginAttribute { enum class PluginAttribute {
Quick = 0, // 快捷区域插件 None = 0, // 不在任何区域显示的插件
Quick, // 快捷区域插件
Tool, // 工具插件(回收站和窗管开发的另一套插件) Tool, // 工具插件(回收站和窗管开发的另一套插件)
System, // 系统插件(关机插件) System, // 系统插件(关机插件)
Tray, // 托盘插件U盘图标等 Tray, // 托盘插件U盘图标等
@ -47,6 +49,7 @@ public:
PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem); PluginsItem *pluginItemWidget(PluginsItemInterface *pluginItem);
QList<PluginsItemInterface *> pluginInSettings(); QList<PluginsItemInterface *> pluginInSettings();
PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const;
bool hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const;
Q_SIGNALS: Q_SIGNALS:
void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute); void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute);

View File

@ -136,11 +136,7 @@ bool ToolAppHelper::pluginInTool(DockItem *dockItem) const
if (!pluginItem) if (!pluginItem)
return false; return false;
QJsonObject metaData = pluginItem->metaData(); return (QuickSettingController::instance()->pluginAttribute(pluginItem->pluginItem()) == QuickSettingController::PluginAttribute::Tool);
if (metaData.contains("tool"))
return metaData.value("tool").toBool();
return false;
} }
void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter) void ToolAppHelper::pluginItemAdded(PluginsItemInterface *itemInter)

View File

@ -330,8 +330,3 @@ PluginsItemInterface *PluginsItem::pluginItem() const
{ {
return m_pluginInter; return m_pluginInter;
} }
QJsonObject PluginsItem::metaData() const
{
return m_jsonData;
}

View File

@ -55,8 +55,6 @@ public:
PluginsItemInterface *pluginItem() const; PluginsItemInterface *pluginItem() const;
QJsonObject metaData() const;
public slots: public slots:
void refreshIcon() override; void refreshIcon() override;

View File

@ -51,7 +51,6 @@ QuickSettingItem::QuickSettingItem(PluginsItemInterface *const pluginInter, QWid
: DockItem(parent) : DockItem(parent)
, m_pluginInter(pluginInter) , m_pluginInter(pluginInter)
, m_itemKey(QuickSettingController::instance()->itemKey(pluginInter)) , m_itemKey(QuickSettingController::instance()->itemKey(pluginInter))
, m_metaData(QuickSettingController::instance()->metaData(pluginInter))
{ {
setAcceptDrops(true); setAcceptDrops(true);
this->installEventFilter(this); this->installEventFilter(this);
@ -130,16 +129,19 @@ QColor QuickSettingItem::foregroundColor() const
QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter) QuickSettingItem *QuickSettingFactory::createQuickWidget(PluginsItemInterface * const pluginInter)
{ {
QuickSettingController *quickController = QuickSettingController::instance();
// 如果显示在面板的图标或者Widget为空则不让显示(例如电池插件) // 如果显示在面板的图标或者Widget为空则不让显示(例如电池插件)
if (pluginInter->icon(DockPart::QuickPanel).isNull() && !pluginInter->itemWidget(QUICK_ITEM_KEY)) if (!quickController->hasFlag(pluginInter, PluginFlag::Type_Common))
return nullptr; return nullptr;
const QJsonObject metaData = QuickSettingController::instance()->metaData(pluginInter); if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Multi))
if (metaData.contains("primary") && metaData.value("primary").toBool())
return new MultiQuickItem(pluginInter); return new MultiQuickItem(pluginInter);
if (pluginInter->itemWidget(QUICK_ITEM_KEY) && metaData.contains("applet") && metaData.value("applet").toBool()) if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Full))
return new FullQuickItem(pluginInter); return new FullQuickItem(pluginInter);
return new SingleQuickItem(pluginInter); if (quickController->hasFlag(pluginInter, PluginFlag::Quick_Single))
return new SingleQuickItem(pluginInter);
return nullptr;
} }

View File

@ -57,7 +57,6 @@ protected:
private: private:
PluginsItemInterface *m_pluginInter; PluginsItemInterface *m_pluginInter;
QString m_itemKey; QString m_itemKey;
QJsonObject m_metaData;
}; };
class QuickSettingFactory class QuickSettingFactory

View File

@ -290,7 +290,7 @@ void QuickPluginWindow::onRequestUpdate()
if (pluginLoader) if (pluginLoader)
metaData = pluginLoader->metaData().value("MetaData").toObject(); metaData = pluginLoader->metaData().value("MetaData").toObject();
itemWidget = new QuickDockItem(item, metaData, quickController->itemKey(item), this); itemWidget = new QuickDockItem(item, quickController->itemKey(item), this);
itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT); itemWidget->setFixedSize(ICONWIDTH, ICONHEIGHT);
itemWidget->installEventFilter(this); itemWidget->installEventFilter(this);
itemWidget->setMouseTracking(true); itemWidget->setMouseTracking(true);
@ -471,7 +471,7 @@ int QuickPluginWindow::getDropIndex(QPoint point)
QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget()); QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget());
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget()); QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
if (dockItem->isPrimary()) if (dockItem->canInsert())
continue; continue;
if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x()) if (dockBeforeItem->geometry().x() > point.x() && dockItem->geometry().right() < point.x())
@ -485,7 +485,7 @@ int QuickPluginWindow::getDropIndex(QPoint point)
continue; continue;
QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget()); QuickDockItem *dockBeforeItem = qobject_cast<QuickDockItem *>(layoutBefore->widget());
if (dockBeforeItem->isPrimary()) if (dockBeforeItem->canInsert())
break; break;
QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget()); QuickDockItem *dockItem = qobject_cast<QuickDockItem *>(layoutItem->widget());
@ -558,16 +558,17 @@ void QuickPluginWindow::initConnection()
* @param pluginItem * @param pluginItem
* @param parent * @param parent
*/ */
QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent) QuickDockItem::QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent)
: QWidget(parent) : QWidget(parent)
, m_pluginItem(pluginItem) , m_pluginItem(pluginItem)
, m_metaData(metaData)
, m_itemKey(itemKey) , m_itemKey(itemKey)
, m_position(Dock::Position::Bottom) , m_position(Dock::Position::Bottom)
, m_popupWindow(new DockPopupWindow) , m_popupWindow(new DockPopupWindow)
, m_contextMenu(new QMenu(this)) , m_contextMenu(new QMenu(this))
, m_tipParent(nullptr) , m_tipParent(nullptr)
, m_mainLayout(nullptr) , m_mainLayout(nullptr)
, m_canInsert(QuickSettingController::instance()->hasFlag(pluginItem, PluginFlag::Attribute_CanInsert))
, m_dockItemParent(nullptr)
{ {
initUi(); initUi();
initConnection(); initConnection();
@ -588,12 +589,9 @@ PluginsItemInterface *QuickDockItem::pluginItem()
return m_pluginItem; return m_pluginItem;
} }
bool QuickDockItem::isPrimary() const bool QuickDockItem::canInsert() const
{ {
if (m_metaData.contains("primary")) return m_canInsert;
return m_metaData.value("primary").toBool();
return false;
} }
void QuickDockItem::hideToolTip() void QuickDockItem::hideToolTip()
@ -703,8 +701,10 @@ void QuickDockItem::hideEvent(QHideEvent *event)
return QWidget::hideEvent(event); return QWidget::hideEvent(event);
QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey); QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey);
if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) if (itemWidget && m_mainLayout->indexOf(itemWidget) >= 0) {
m_mainLayout->removeWidget(m_pluginItem->itemWidget(m_itemKey)); itemWidget->setParent(m_dockItemParent);
m_mainLayout->removeWidget(itemWidget);
}
} }
QPixmap QuickDockItem::iconPixmap() const QPixmap QuickDockItem::iconPixmap() const
@ -725,7 +725,11 @@ void QuickDockItem::initUi()
m_mainLayout = new QHBoxLayout(this); m_mainLayout = new QHBoxLayout(this);
m_mainLayout->setContentsMargins(0, 0, 0, 0); m_mainLayout->setContentsMargins(0, 0, 0, 0);
m_pluginItem->itemWidget(m_itemKey)->installEventFilter(this); QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey);
if (itemWidget) {
m_dockItemParent = itemWidget->parentWidget();
itemWidget->installEventFilter(this);
}
} }
void QuickDockItem::initAttribute() void QuickDockItem::initAttribute()

View File

@ -94,12 +94,12 @@ class QuickDockItem : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit QuickDockItem(PluginsItemInterface *pluginItem, const QJsonObject &metaData, const QString itemKey, QWidget *parent = nullptr); explicit QuickDockItem(PluginsItemInterface *pluginItem, const QString &itemKey, QWidget *parent = nullptr);
~QuickDockItem(); ~QuickDockItem();
void setPositon(Dock::Position position); void setPositon(Dock::Position position);
PluginsItemInterface *pluginItem(); PluginsItemInterface *pluginItem();
bool isPrimary() const; bool canInsert() const;
void hideToolTip(); void hideToolTip();
protected: protected:
@ -125,13 +125,14 @@ private Q_SLOTS:
private: private:
PluginsItemInterface *m_pluginItem; PluginsItemInterface *m_pluginItem;
QJsonObject m_metaData;
QString m_itemKey; QString m_itemKey;
Dock::Position m_position; Dock::Position m_position;
DockPopupWindow *m_popupWindow; DockPopupWindow *m_popupWindow;
QMenu *m_contextMenu; QMenu *m_contextMenu;
QWidget *m_tipParent; QWidget *m_tipParent;
QHBoxLayout *m_mainLayout; QHBoxLayout *m_mainLayout;
bool m_canInsert;
QWidget *m_dockItemParent;
}; };
#endif // QUICKPLUGINWINDOW_H #endif // QUICKPLUGINWINDOW_H

View File

@ -1,5 +1,4 @@
{ {
"api": "2.0.0", "api": "2.0.0",
"primary" : true,
"depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1"
} }

View File

@ -1,4 +1,3 @@
{ {
"api": "2.0.0", "api": "2.0.0"
"fixed": true
} }

View File

@ -1,4 +1,3 @@
{ {
"api": "2.0.0", "api": "2.0.0"
"fixed": true
} }

View File

@ -1,4 +1,3 @@
{ {
"api": "2.0.0", "api": "2.0.0"
"system": true
} }

View File

@ -1,5 +1,4 @@
{ {
"api": "2.0.0", "api": "2.0.0",
"depends-daemon-dbus-service": "org.deepin.daemon.Audio1", "depends-daemon-dbus-service": "org.deepin.daemon.Audio1"
"applet": true
} }

View File

@ -1,4 +1,3 @@
{ {
"api": "2.0.0", "api": "2.0.0"
"tool": true
} }