diff --git a/panels/dock/dconfig/org.deepin.ds.dock.tray.json b/panels/dock/dconfig/org.deepin.ds.dock.tray.json index dc216dc66..610b70bf7 100644 --- a/panels/dock/dconfig/org.deepin.ds.dock.tray.json +++ b/panels/dock/dconfig/org.deepin.ds.dock.tray.json @@ -67,6 +67,17 @@ "permissions": "readwrite", "visibility": "private" }, + "dockHiddenSurfaceIds": { + "value": [], + "serial": 0, + "flags": [], + "name": "Dock Hidden Surface IDs", + "name[zh_CN]": "在 Dock 中隐藏的标识 ID 列表", + "description": "Tray plugin surface IDs that should be hidden from dock tray but keep visible in other areas (e.g., control center)", + "description[zh_CN]": "在 Dock 托盘中隐藏但在其他区域(如控制中心)仍保持可见的标识 ID 列表", + "permissions": "readwrite", + "visibility": "private" + }, "isCollapsed": { "value": false, "serial": 0, diff --git a/panels/dock/tray/package/TrayItemPositioner.qml b/panels/dock/tray/package/TrayItemPositioner.qml index eac3b75e6..47f935804 100644 --- a/panels/dock/tray/package/TrayItemPositioner.qml +++ b/panels/dock/tray/package/TrayItemPositioner.qml @@ -12,8 +12,8 @@ Control { if (DDT.TraySortOrderModel.isUpdating) { return false } - if (model.sectionType === "collapsable") return !collapsed && model.visibility - return model.sectionType !== "stashed" && model.visibility + if (model.sectionType === "collapsable") return !collapsed && model.visibility && model.dockVisible + return model.sectionType !== "stashed" && model.visibility && model.dockVisible } property size visualSize: Qt.size(0, 0) diff --git a/panels/dock/tray/traysortordermodel.cpp b/panels/dock/tray/traysortordermodel.cpp index 2dd03f34c..6276417fe 100644 --- a/panels/dock/tray/traysortordermodel.cpp +++ b/panels/dock/tray/traysortordermodel.cpp @@ -27,6 +27,7 @@ TraySortOrderModel::TraySortOrderModel(QObject *parent) defaultRoleNames.insert({ {TraySortOrderModel::SurfaceIdRole, QByteArrayLiteral("surfaceId")}, {TraySortOrderModel::VisibilityRole, QByteArrayLiteral("visibility")}, + {TraySortOrderModel::DockVisibleRole, QByteArrayLiteral("dockVisible")}, {TraySortOrderModel::SectionTypeRole, QByteArrayLiteral("sectionType")}, {TraySortOrderModel::VisualIndexRole, QByteArrayLiteral("visualIndex")}, {TraySortOrderModel::DelegateTypeRole, QByteArrayLiteral("delegateType")}, @@ -44,7 +45,7 @@ TraySortOrderModel::TraySortOrderModel(QObject *parent) appendRow(createTrayItem("internal/action-toggle-quick-settings", SECTION_TRAY_ACTION, "action-toggle-quick-settings")); connect(m_dconfig.get(), &Dtk::Core::DConfig::valueChanged, this, [this](const QString &key){ - if (key == QLatin1String("hiddenSurfaceIds")) { + if (key == QLatin1String("hiddenSurfaceIds") || key == QLatin1String("dockHiddenSurfaceIds")) { loadDataFromDConfig(); updateVisualIndexes(); } @@ -218,6 +219,26 @@ bool TraySortOrderModel::isDisplayedSurface(const QString &surfaceId) const return !m_hiddenIds.contains(surfaceId); } +void TraySortOrderModel::setDockVisible(const QString &surfaceId, bool visible) +{ + if (visible) { + if (m_dockHiddenIds.contains(surfaceId)) { + m_dockHiddenIds.removeOne(surfaceId); + } + } else { + if (!m_dockHiddenIds.contains(surfaceId)) { + m_dockHiddenIds.append(surfaceId); + } + } + updateVisualIndexes(); + saveDataToDConfig(); +} + +bool TraySortOrderModel::isDockVisible(const QString &surfaceId) const +{ + return !m_dockHiddenIds.contains(surfaceId); +} + QStandardItem *TraySortOrderModel::findItemByVisualIndex(int visualIndex, VisualSections visualSection) const { QStandardItem * result = nullptr; @@ -325,6 +346,7 @@ QStandardItem *TraySortOrderModel::createTrayItem(const QString &name, QStandardItem * item = new QStandardItem(name); item->setData(name, TraySortOrderModel::SurfaceIdRole); item->setData(true, TraySortOrderModel::VisibilityRole); + item->setData(true, TraySortOrderModel::DockVisibleRole); item->setData(actualSectionType, TraySortOrderModel::SectionTypeRole); item->setData(delegateType, TraySortOrderModel::DelegateTypeRole); item->setData(forbiddenSections, TraySortOrderModel::ForbiddenSectionsRole); @@ -361,8 +383,11 @@ void TraySortOrderModel::updateVisualIndexes() // forcedock and can not setting plugin need always set to visible auto pluginFlags = results[0]->data(TraySortOrderModel::PluginFlagsRole).toInt(); bool itemVisible = (pluginFlags & Dock::Attribute_ForceDock) || !(pluginFlags & Dock::Attribute_ForceDock) || !m_hiddenIds.contains(id); + bool dockVisible = !m_dockHiddenIds.contains(id); results[0]->setData(SECTION_STASHED, TraySortOrderModel::SectionTypeRole); - if (itemVisible) { + results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); + results[0]->setData(dockVisible, TraySortOrderModel::DockVisibleRole); + if (itemVisible && dockVisible) { showStashActionVisible = true; results[0]->setData(stashedVisualIndex, TraySortOrderModel::VisualIndexRole); stashedVisualIndex++; @@ -389,9 +414,11 @@ void TraySortOrderModel::updateVisualIndexes() if (results[0]->data(TraySortOrderModel::VisualIndexRole).toInt() != -1) continue; auto pluginFlags = results[0]->data(TraySortOrderModel::PluginFlagsRole).toInt(); bool itemVisible = (pluginFlags & Dock::Attribute_ForceDock) || !(pluginFlags & Dock::Attribute_CanSetting) || !m_hiddenIds.contains(id); + bool dockVisible = !m_dockHiddenIds.contains(id); results[0]->setData(SECTION_COLLAPSABLE, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); - if (itemVisible) { + results[0]->setData(dockVisible, TraySortOrderModel::DockVisibleRole); + if (itemVisible && dockVisible) { toogleCollapseActionVisible = true; if (!m_collapsed) { results[0]->setData(currentVisualIndex++, TraySortOrderModel::VisualIndexRole); @@ -418,9 +445,11 @@ void TraySortOrderModel::updateVisualIndexes() if (results[0]->data(TraySortOrderModel::VisualIndexRole).toInt() != -1) continue; auto flags = results[0]->data(TraySortOrderModel::PluginFlagsRole).toInt(); bool itemVisible = (flags & Dock::Attribute_ForceDock) || !(flags & Dock::Attribute_CanSetting) || !m_hiddenIds.contains(id); + bool dockVisible = !m_dockHiddenIds.contains(id); results[0]->setData(SECTION_PINNED, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); - if (itemVisible) { + results[0]->setData(dockVisible, TraySortOrderModel::DockVisibleRole); + if (itemVisible && dockVisible) { results[0]->setData(currentVisualIndex, TraySortOrderModel::VisualIndexRole); currentVisualIndex++; } @@ -443,9 +472,11 @@ void TraySortOrderModel::updateVisualIndexes() if (results[0]->data(TraySortOrderModel::VisualIndexRole).toInt() != -1) continue; auto flags = results[0]->data(TraySortOrderModel::PluginFlagsRole).toInt(); bool itemVisible = (flags & Dock::Attribute_ForceDock) || !(flags & Dock::Attribute_CanSetting) || !m_hiddenIds.contains(id); + bool dockVisible = !m_dockHiddenIds.contains(id); results[0]->setData(SECTION_FIXED, TraySortOrderModel::SectionTypeRole); results[0]->setData(itemVisible, TraySortOrderModel::VisibilityRole); - if (itemVisible) { + results[0]->setData(dockVisible, TraySortOrderModel::DockVisibleRole); + if (itemVisible && dockVisible) { results[0]->setData(currentVisualIndex, TraySortOrderModel::VisualIndexRole); currentVisualIndex++; } @@ -489,6 +520,7 @@ void TraySortOrderModel::loadDataFromDConfig() m_collapsableIds = m_dconfig->value("collapsableSurfaceIds").toStringList(); m_pinnedIds = m_dconfig->value("pinnedSurfaceIds").toStringList(); m_hiddenIds = m_dconfig->value("hiddenSurfaceIds").toStringList(); + m_dockHiddenIds = m_dconfig->value("dockHiddenSurfaceIds").toStringList(); m_collapsed = m_dconfig->value("isCollapsed").toBool(); } @@ -498,6 +530,7 @@ void TraySortOrderModel::saveDataToDConfig() m_dconfig->setValue("collapsableSurfaceIds", m_collapsableIds); m_dconfig->setValue("pinnedSurfaceIds", m_pinnedIds); m_dconfig->setValue("hiddenSurfaceIds", m_hiddenIds); + m_dconfig->setValue("dockHiddenSurfaceIds", m_dockHiddenIds); m_dconfig->setValue("isCollapsed", m_collapsed); } diff --git a/panels/dock/tray/traysortordermodel.h b/panels/dock/tray/traysortordermodel.h index 2bcdff2eb..2f24a9825 100644 --- a/panels/dock/tray/traysortordermodel.h +++ b/panels/dock/tray/traysortordermodel.h @@ -40,6 +40,7 @@ class TraySortOrderModel : public QStandardItemModel enum Roles { SurfaceIdRole = Qt::UserRole, // actually "pluginId::itemKey" or an internal one. VisibilityRole, + DockVisibleRole, SectionTypeRole, VisualIndexRole, DelegateTypeRole, @@ -63,6 +64,8 @@ class TraySortOrderModel : public QStandardItemModel Q_INVOKABLE bool dropToDockTray(const QString & draggedSurfaceId, int dropVisualIndex, bool isBefore); Q_INVOKABLE void setSurfaceVisible(const QString & surfaceId, bool visible); Q_INVOKABLE bool isDisplayedSurface(const QString &surfaceId) const; + Q_INVOKABLE void setDockVisible(const QString & surfaceId, bool visible); + Q_INVOKABLE bool isDockVisible(const QString &surfaceId) const; Q_INVOKABLE QModelIndex getModelIndexByVisualIndex(int visualIndex) const; signals: @@ -89,6 +92,8 @@ class TraySortOrderModel : public QStandardItemModel QStringList m_fixedIds; // surface IDs that should be invisible/hidden from the tray area. QStringList m_hiddenIds; + // surface IDs that should be hidden from dock tray but keep VisibilityRole true. + QStringList m_dockHiddenIds; QStandardItem * findItemByVisualIndex(int visualIndex, VisualSections visualSection) const; QStringList * getSection(const QString & sectionType);