diff --git a/panels/dock/tray/package/tray.qml b/panels/dock/tray/package/tray.qml index e6047748d..49b0b0566 100644 --- a/panels/dock/tray/package/tray.qml +++ b/panels/dock/tray/package/tray.qml @@ -142,7 +142,7 @@ AppletItem { preferredSection = "pinned" } - surfacesData.push({"surfaceId": surfaceId, "delegateType": "legacy-tray-plugin", "sectionType": preferredSection, "forbiddenSections": forbiddenSections}) + surfacesData.push({"surfaceId": surfaceId, "delegateType": "legacy-tray-plugin", "sectionType": preferredSection, "forbiddenSections": forbiddenSections, "isForceDock": item.pluginFlags & 0x1000}) } // actually only for datetime plugin currently for (let i = 0; i < DockCompositor.fixedPluginSurfaces.count; i++) { @@ -151,7 +151,7 @@ AppletItem { let forbiddenSections = ["stashed", "collapsable", "pinned"] let preferredSection = "fixed" - surfacesData.push({"surfaceId": surfaceId, "delegateType": "legacy-tray-plugin", "sectionType": preferredSection, "forbiddenSections": forbiddenSections}) + surfacesData.push({"surfaceId": surfaceId, "delegateType": "legacy-tray-plugin", "sectionType": preferredSection, "forbiddenSections": forbiddenSections, "isForceDock": item.pluginFlags & 0x1000}) } DDT.TraySortOrderModel.availableSurfaces = surfacesData console.log("onPluginSurfacesUpdated", surfacesData.length) diff --git a/panels/dock/tray/trayitem.cpp b/panels/dock/tray/trayitem.cpp index 99b3c655f..3313561e5 100644 --- a/panels/dock/tray/trayitem.cpp +++ b/panels/dock/tray/trayitem.cpp @@ -78,7 +78,8 @@ DockItemInfos TrayItem::dockItemInfosFromModel(QAbstractItemModel *model) const auto item = index.data(modelDataRole).value(); if (!item) return DockItemInfos{}; - if (!(item->property("pluginFlags").toInt() & Dock::Attribute_CanSetting)) { + int flags = item->property("pluginFlags").toInt(); + if (!(flags & Dock::Attribute_CanSetting) || flags & Dock::Attribute_ForceDock) { continue; } DockItemInfo itemInfo; diff --git a/panels/dock/tray/traysortordermodel.cpp b/panels/dock/tray/traysortordermodel.cpp index 94103152c..10eaa8f19 100644 --- a/panels/dock/tray/traysortordermodel.cpp +++ b/panels/dock/tray/traysortordermodel.cpp @@ -240,7 +240,7 @@ QStringList *TraySortOrderModel::getSection(const QString §ionType) return nullptr; } -QString TraySortOrderModel::findSection(const QString & surfaceId, const QString & fallback, const QStringList & forbiddenSections) +QString TraySortOrderModel::findSection(const QString & surfaceId, const QString & fallback, const QStringList & forbiddenSections, bool isForceDock) { QStringList * found = nullptr; QString result(fallback); @@ -261,6 +261,7 @@ QString TraySortOrderModel::findSection(const QString & surfaceId, const QString // 设置默认隐藏 if (!found && // 不在列表中 + !isForceDock && // 非 forceDock result != SECTION_FIXED && // 非固定位置插件(时间) !surfaceId.startsWith("internal/") && // 非内置插件 !surfaceId.startsWith("application-tray::") // 非托盘图标 @@ -296,9 +297,10 @@ void TraySortOrderModel::registerToSection(const QString & surfaceId, const QStr } QStandardItem * TraySortOrderModel::createTrayItem(const QString & name, const QString & sectionType, - const QString & delegateType, const QStringList &forbiddenSections) + const QString & delegateType, const QStringList &forbiddenSections, + bool isForceDock) { - QString actualSectionType = findSection(name, sectionType, forbiddenSections); + QString actualSectionType = findSection(name, sectionType, forbiddenSections, isForceDock); registerToSection(name, actualSectionType); qDebug() << actualSectionType << name << delegateType; @@ -310,6 +312,7 @@ QStandardItem * TraySortOrderModel::createTrayItem(const QString & name, const Q item->setData(delegateType, TraySortOrderModel::DelegateTypeRole); item->setData(forbiddenSections, TraySortOrderModel::ForbiddenSectionsRole); item->setData(-1, TraySortOrderModel::VisualIndexRole); + item->setData(isForceDock, TraySortOrderModel::IsForceDockRole); return item; } @@ -330,7 +333,7 @@ void TraySortOrderModel::updateVisualIndexes() QList results = findItems(id); if (results.isEmpty()) continue; if (stashPlaceholder == results[0]) continue; - bool itemVisible = !m_hiddenIds.contains(id); + bool itemVisible = results[0]->data(TraySortOrderModel::IsForceDockRole).toBool() || !m_hiddenIds.contains(id); results[0]->setData(SECTION_STASHED, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); if (itemVisible) { @@ -357,7 +360,7 @@ void TraySortOrderModel::updateVisualIndexes() for (const QString & id : std::as_const(m_collapsableIds)) { QList results = findItems(id); if (results.isEmpty()) continue; - bool itemVisible = !m_hiddenIds.contains(id); + bool itemVisible = results[0]->data(TraySortOrderModel::IsForceDockRole).toBool() || !m_hiddenIds.contains(id); results[0]->setData(SECTION_COLLAPSABLE, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); results[0]->setData(-1, TraySortOrderModel::VisualIndexRole); @@ -385,7 +388,7 @@ void TraySortOrderModel::updateVisualIndexes() for (const QString & id : std::as_const(m_pinnedIds)) { QList results = findItems(id); if (results.isEmpty()) continue; - bool itemVisible = !m_hiddenIds.contains(id); + bool itemVisible = results[0]->data(TraySortOrderModel::IsForceDockRole).toBool() || !m_hiddenIds.contains(id); results[0]->setData(SECTION_PINNED, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); results[0]->setData(-1, TraySortOrderModel::VisualIndexRole); @@ -408,7 +411,7 @@ void TraySortOrderModel::updateVisualIndexes() for (const QString & id : std::as_const(m_fixedIds)) { QList results = findItems(id); if (results.isEmpty()) continue; - bool itemVisible = !m_hiddenIds.contains(id); + bool itemVisible = results[0]->data(TraySortOrderModel::IsForceDockRole).toBool() || !m_hiddenIds.contains(id); results[0]->setData(SECTION_FIXED, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); results[0]->setData(-1, TraySortOrderModel::VisualIndexRole); @@ -430,6 +433,7 @@ QString TraySortOrderModel::registerSurfaceId(const QVariantMap & surfaceData) QString delegateType(surfaceData.value("delegateType", "legacy-tray-plugin").toString()); QString preferredSection(surfaceData.value("sectionType", "collapsable").toString()); QStringList forbiddenSections(surfaceData.value("forbiddenSections").toStringList()); + bool isForceDock(surfaceData.value("isForceDock").toBool()); QList results = findItems(surfaceId); if (!results.isEmpty()) { @@ -437,12 +441,12 @@ QString TraySortOrderModel::registerSurfaceId(const QVariantMap & surfaceData) // check if the item is currently in a forbidden zone QString currentSection(result->data(SectionTypeRole).toString()); if (forbiddenSections.contains(currentSection)) { - result->setData(findSection(surfaceId, preferredSection, forbiddenSections), SectionTypeRole); + result->setData(findSection(surfaceId, preferredSection, forbiddenSections, isForceDock), SectionTypeRole); } return surfaceId; } - appendRow(createTrayItem(surfaceId, preferredSection, delegateType, forbiddenSections)); + appendRow(createTrayItem(surfaceId, preferredSection, delegateType, forbiddenSections, isForceDock)); return surfaceId; } diff --git a/panels/dock/tray/traysortordermodel.h b/panels/dock/tray/traysortordermodel.h index 7be668029..52f3ba3e3 100644 --- a/panels/dock/tray/traysortordermodel.h +++ b/panels/dock/tray/traysortordermodel.h @@ -43,6 +43,7 @@ class TraySortOrderModel : public QStandardItemModel DelegateTypeRole, // this tray item cannot be drop (or moved in any form) to the given sections ForbiddenSectionsRole, + IsForceDockRole, ModelExtendedRole = 0x1000 }; Q_ENUM(Roles) @@ -85,10 +86,10 @@ class TraySortOrderModel : public QStandardItemModel QStandardItem * findItemByVisualIndex(int visualIndex, VisualSections visualSection) const; QStringList * getSection(const QString & sectionType); - QString findSection(const QString & surfaceId, const QString & fallback, const QStringList & forbiddenSections = {}); + QString findSection(const QString & surfaceId, const QString & fallback, const QStringList & forbiddenSections, bool isForceDock); void registerToSection(const QString & surfaceId, const QString & sectionType); QStandardItem * createTrayItem(const QString & name, const QString & sectionType, - const QString & delegateType, const QStringList & forbiddenSections = {}); + const QString & delegateType, const QStringList & forbiddenSections = {}, bool isForceDock = false); void updateVisualIndexes(); QString registerSurfaceId(const QVariantMap &surfaceData); void loadDataFromDConfig();