From 4f3f7a0aed3df7b1d485db081e05fd3738289023 Mon Sep 17 00:00:00 2001 From: donghualin Date: Mon, 28 Nov 2022 15:30:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=8F=92=E4=BB=B6=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E6=A0=87=E8=AE=B0=E6=9D=A5=E5=86=B3=E5=AE=9A=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在决定插件的位置的时候,根据插件的返回的标记来决定当前插件是属于固定插件、快捷插件、托盘插件、系统插件还是工具插件 Log: Influence: 任务栏插件类型 Task: https://pms.uniontech.com/task-view-220099.html Change-Id: I5dedc16fd7ccaac9d54dccf657e1a938bf3f2160 --- frame/controller/quicksettingcontroller.cpp | 54 ++++++++++----------- frame/controller/quicksettingcontroller.h | 5 +- frame/controller/toolapphelper.cpp | 6 +-- frame/item/pluginsitem.cpp | 5 -- frame/item/pluginsitem.h | 2 - frame/item/quicksettingitem.cpp | 14 +++--- frame/item/quicksettingitem.h | 1 - frame/window/quickpluginwindow.cpp | 30 +++++++----- frame/window/quickpluginwindow.h | 7 +-- plugins/bluetooth/bluetooth.json | 1 - plugins/multitasking/multitasking.json | 3 +- plugins/show-desktop/show-desktop.json | 3 +- plugins/shutdown/shutdown.json | 3 +- plugins/sound/sound.json | 3 +- plugins/trash/trash.json | 3 +- 15 files changed, 64 insertions(+), 76 deletions(-) diff --git a/frame/controller/quicksettingcontroller.cpp b/frame/controller/quicksettingcontroller.cpp index ab4d3186a..370ed8ea2 100644 --- a/frame/controller/quicksettingcontroller.cpp +++ b/frame/controller/quicksettingcontroller.cpp @@ -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 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; } diff --git a/frame/controller/quicksettingcontroller.h b/frame/controller/quicksettingcontroller.h index 559940a41..a23b69aa2 100644 --- a/frame/controller/quicksettingcontroller.h +++ b/frame/controller/quicksettingcontroller.h @@ -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 pluginInSettings(); PluginAttribute pluginAttribute(PluginsItemInterface * const itemInter) const; + bool hasFlag(PluginsItemInterface *itemInter, PluginFlag flag) const; Q_SIGNALS: void pluginInserted(PluginsItemInterface *itemInter, const PluginAttribute); diff --git a/frame/controller/toolapphelper.cpp b/frame/controller/toolapphelper.cpp index 6359a8141..500f0445d 100644 --- a/frame/controller/toolapphelper.cpp +++ b/frame/controller/toolapphelper.cpp @@ -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) diff --git a/frame/item/pluginsitem.cpp b/frame/item/pluginsitem.cpp index 7a115a808..c50355178 100644 --- a/frame/item/pluginsitem.cpp +++ b/frame/item/pluginsitem.cpp @@ -330,8 +330,3 @@ PluginsItemInterface *PluginsItem::pluginItem() const { return m_pluginInter; } - -QJsonObject PluginsItem::metaData() const -{ - return m_jsonData; -} diff --git a/frame/item/pluginsitem.h b/frame/item/pluginsitem.h index 7e3bfbb3d..7a4b70959 100644 --- a/frame/item/pluginsitem.h +++ b/frame/item/pluginsitem.h @@ -55,8 +55,6 @@ public: PluginsItemInterface *pluginItem() const; - QJsonObject metaData() const; - public slots: void refreshIcon() override; diff --git a/frame/item/quicksettingitem.cpp b/frame/item/quicksettingitem.cpp index 711c37443..36b960e20 100644 --- a/frame/item/quicksettingitem.cpp +++ b/frame/item/quicksettingitem.cpp @@ -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; } diff --git a/frame/item/quicksettingitem.h b/frame/item/quicksettingitem.h index 52e4c4879..962114883 100644 --- a/frame/item/quicksettingitem.h +++ b/frame/item/quicksettingitem.h @@ -57,7 +57,6 @@ protected: private: PluginsItemInterface *m_pluginInter; QString m_itemKey; - QJsonObject m_metaData; }; class QuickSettingFactory diff --git a/frame/window/quickpluginwindow.cpp b/frame/window/quickpluginwindow.cpp index 50eb4286c..e2b9fd5f9 100644 --- a/frame/window/quickpluginwindow.cpp +++ b/frame/window/quickpluginwindow.cpp @@ -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(layoutBefore->widget()); QuickDockItem *dockItem = qobject_cast(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(layoutBefore->widget()); - if (dockBeforeItem->isPrimary()) + if (dockBeforeItem->canInsert()) break; QuickDockItem *dockItem = qobject_cast(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() diff --git a/frame/window/quickpluginwindow.h b/frame/window/quickpluginwindow.h index 16f3dc24f..be2c66a11 100644 --- a/frame/window/quickpluginwindow.h +++ b/frame/window/quickpluginwindow.h @@ -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 diff --git a/plugins/bluetooth/bluetooth.json b/plugins/bluetooth/bluetooth.json index 936d08d86..8400bab79 100644 --- a/plugins/bluetooth/bluetooth.json +++ b/plugins/bluetooth/bluetooth.json @@ -1,5 +1,4 @@ { "api": "2.0.0", - "primary" : true, "depends-daemon-dbus-service": "org.deepin.daemon.Bluetooth1" } diff --git a/plugins/multitasking/multitasking.json b/plugins/multitasking/multitasking.json index cdda5b480..bec81f0da 100644 --- a/plugins/multitasking/multitasking.json +++ b/plugins/multitasking/multitasking.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "fixed": true + "api": "2.0.0" } diff --git a/plugins/show-desktop/show-desktop.json b/plugins/show-desktop/show-desktop.json index cdda5b480..bec81f0da 100644 --- a/plugins/show-desktop/show-desktop.json +++ b/plugins/show-desktop/show-desktop.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "fixed": true + "api": "2.0.0" } diff --git a/plugins/shutdown/shutdown.json b/plugins/shutdown/shutdown.json index a1a7e7292..bec81f0da 100644 --- a/plugins/shutdown/shutdown.json +++ b/plugins/shutdown/shutdown.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "system": true + "api": "2.0.0" } diff --git a/plugins/sound/sound.json b/plugins/sound/sound.json index e5b6168c7..181aef926 100644 --- a/plugins/sound/sound.json +++ b/plugins/sound/sound.json @@ -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" } diff --git a/plugins/trash/trash.json b/plugins/trash/trash.json index a5a5d1d82..bec81f0da 100644 --- a/plugins/trash/trash.json +++ b/plugins/trash/trash.json @@ -1,4 +1,3 @@ { - "api": "2.0.0", - "tool": true + "api": "2.0.0" }