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 "quicksettingitem.h"
#include "pluginsiteminterface.h"
#include "proxyplugincontroller.h"
#include "pluginsitem.h"
@ -88,33 +87,33 @@ void QuickSettingController::updateDockInfo(PluginsItemInterface * const itemInt
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;
if (pluginLoader->fileName().contains(TRAY_PATH)) {
// 如果是从系统目录下加载的插件,则认为它是系统插件,此时需要放入到托盘中
return PluginAttribute::Tray;
}
// 基本插件,不在任务栏上显示的插件
return PluginAttribute::None;
}
const QJsonObject &meta = pluginLoader->metaData().value("MetaData").toObject();
if (meta.contains("tool") && meta.value("tool").toBool()) {
// 如果有tool标记则认为它是工具插件例如回收站和窗管提供的相关插件
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;
bool QuickSettingController::hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const
{
return itemInter->flags() & flag;
}
QuickSettingController *QuickSettingController::instance()
@ -161,10 +160,7 @@ QList<PluginsItemInterface *> QuickSettingController::pluginInSettings()
if (plugin->pluginDisplayName().isEmpty())
continue;
PluginAttribute pluginAttr = pluginAttribute(plugin);
if (pluginAttr == QuickSettingController::PluginAttribute::Quick
|| pluginAttr == QuickSettingController::PluginAttribute::System
|| pluginAttr == QuickSettingController::PluginAttribute::Tool)
if (hasFlag(plugin, PluginFlag::Attribute_CanSetting))
settingPlugins << plugin;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -94,12 +94,12 @@ class QuickDockItem : public QWidget
Q_OBJECT
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();
void setPositon(Dock::Position position);
PluginsItemInterface *pluginItem();
bool isPrimary() const;
bool canInsert() const;
void hideToolTip();
protected:
@ -125,13 +125,14 @@ private Q_SLOTS:
private:
PluginsItemInterface *m_pluginItem;
QJsonObject m_metaData;
QString m_itemKey;
Dock::Position m_position;
DockPopupWindow *m_popupWindow;
QMenu *m_contextMenu;
QWidget *m_tipParent;
QHBoxLayout *m_mainLayout;
bool m_canInsert;
QWidget *m_dockItemParent;
};
#endif // QUICKPLUGINWINDOW_H

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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