From a3f715f764131d8845aa288e100214fbfa06f60e Mon Sep 17 00:00:00 2001 From: wjyrich Date: Thu, 27 Nov 2025 16:05:21 +0800 Subject: [PATCH] feat: add dock-specific tray item visibility control MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added new dconfig property "dockHiddenSurfaceIds" to store tray items that should be hidden in dock but remain visible in other areas like control center 2. Introduced DockVisibleRole to track separate visibility state for dock display 3. Modified TrayItemPositioner.qml to consider both visibility and dockVisible properties when positioning items 4. Updated tray item filtering logic to check dockVisible status in addition to existing visibility checks 5. Added setDockVisible and isDockVisible methods for controlling dock- specific visibility 6. Enhanced updateVisualIndexes method to handle both visibility states when calculating visual positions Log: Added ability to hide tray items from dock while keeping them visible in control center Influence: 1. Test tray items can be hidden from dock while remaining visible in control center 2. Verify dockHiddenSurfaceIds configuration is properly saved and loaded 3. Test visual positioning considers both visibility and dockVisible states 4. Verify tray items with Attribute_ForceDock flag are always visible in dock 5. Test collapsable, pinned, and fixed sections handle dock visibility correctly 6. Verify stash placeholder visibility logic works with new dockVisible property feat: 添加 Dock 特定托盘项可见性控制 1. 新增 dconfig 属性 "dockHiddenSurfaceIds" 用于存储在 Dock 中隐藏但在控 制中心等其他区域保持可见的托盘项 2. 引入 DockVisibleRole 来跟踪 Dock 显示的独立可见性状态 3. 修改 TrayItemPositioner.qml 在定位项目时同时考虑可见性和 dockVisible 属性 4. 更新托盘项过滤逻辑,在现有可见性检查基础上增加 dockVisible 状态检查 5. 添加 setDockVisible 和 isDockVisible 方法来控制 Dock 特定可见性 6. 增强 updateVisualIndexes 方法,在计算视觉位置时处理两种可见性状态 注: 加上此参数为了处理,在控制中心可以显示相应的插件项,保证在控制中心的任务栏插件列表可以驻留在任务栏的,但是即使控制中心可以控制保留驻留在任务栏,也可以通过此参数设置为不显示在任务栏。 Log: 新增在控制中心保持可见的同时从 Dock 隐藏托盘项的功能 Influence: 1. 测试托盘项可以从 Dock 隐藏同时在控制中心保持可见 2. 验证 dockHiddenSurfaceIds 配置是否正确保存和加载 3. 测试视觉定位同时考虑可见性和 dockVisible 状态 4. 验证带有 Attribute_ForceDock 标志的托盘项在 Dock 中始终可见 5. 测试可折叠、固定和固定部分正确处理 Dock 可见性 6. 验证隐藏占位符可见性逻辑与新的 dockVisible 属性正常工作 PMS: BUG-341141 BUG-341651 --- .../dock/dconfig/org.deepin.ds.dock.tray.json | 11 +++++ .../dock/tray/package/TrayItemPositioner.qml | 4 +- panels/dock/tray/traysortordermodel.cpp | 43 ++++++++++++++++--- panels/dock/tray/traysortordermodel.h | 5 +++ 4 files changed, 56 insertions(+), 7 deletions(-) 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);