From 1b57ebcac7680b02566b27acfe78e7d48959105e Mon Sep 17 00:00:00 2001 From: Wang Zichong Date: Thu, 13 Nov 2025 11:51:01 +0800 Subject: [PATCH] chore: make hover preview proxy model simpler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 简化 HoverPreviewProxyModel, 使 model 本身不与设置项耦合, 过滤规则 在 taskmanager.cpp 控制 Log: --- .../taskmanager/hoverpreviewproxymodel.cpp | 43 +++++++------------ .../dock/taskmanager/hoverpreviewproxymodel.h | 20 ++++----- panels/dock/taskmanager/taskmanager.cpp | 8 +++- 3 files changed, 30 insertions(+), 41 deletions(-) diff --git a/panels/dock/taskmanager/hoverpreviewproxymodel.cpp b/panels/dock/taskmanager/hoverpreviewproxymodel.cpp index c7afb3db8..69c1b4273 100644 --- a/panels/dock/taskmanager/hoverpreviewproxymodel.cpp +++ b/panels/dock/taskmanager/hoverpreviewproxymodel.cpp @@ -4,7 +4,6 @@ #include "hoverpreviewproxymodel.h" #include "taskmanager.h" -#include "taskmanagersettings.h" #include @@ -13,26 +12,22 @@ namespace dock HoverPreviewProxyModel::HoverPreviewProxyModel(QObject *parent) : QSortFilterProxyModel(parent) - , m_settings(TaskManagerSettings::instance()) { // 设置动态排序,确保模型变化时自动重新过滤 setDynamicSortFilter(true); } -void HoverPreviewProxyModel::setFilterModelIndex(const QModelIndex &index) +void HoverPreviewProxyModel::setFilter(QString filter, enum FilterMode mode) { - if (m_filterIndex == index) - return; + m_filter = filter; + m_filterMode = mode; - m_filterIndex = index; - - // 触发过滤器重新计算 invalidateFilter(); } void HoverPreviewProxyModel::clearFilter() { - setFilterModelIndex(QModelIndex()); + setFilter(QString(), FilterByAppId); } bool HoverPreviewProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const @@ -40,7 +35,7 @@ bool HoverPreviewProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & Q_UNUSED(sourceParent) // 如果没有设置过滤条件,则不显示任何行 - if (!m_filterIndex.isValid()) + if (m_filter.isEmpty()) return false; if (!sourceModel()) @@ -56,27 +51,19 @@ bool HoverPreviewProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex & if (winId == 0) return false; - // 根据 noTaskGrouping 配置采用不同的过滤策略 - bool isWindowSplit = (m_settings && m_settings->isWindowSplit()); - - if (isWindowSplit) { - // noTaskGrouping = true: 精确匹配该模型索引对应的窗口 - // 比较窗口ID是否匹配 - QVariant filterWinId = m_filterIndex.data(TaskManager::WinIdRole); - uint32_t targetWinId = filterWinId.toUInt(); - + switch (m_filterMode) { + case FilterByAppId: { + QString currentDesktopId = sourceIndex.data(TaskManager::DesktopIdRole).toString(); + return currentDesktopId == m_filter; + } + case FilterByWinId: { + uint32_t targetWinId = m_filter.toUInt(); bool result = (winId == targetWinId && targetWinId != 0); - // 在 WindowSplit 模式下,精确匹配单个窗口 - return result; - } else { - // noTaskGrouping = false: 基于 DesktopIdRole 匹配应用的所有窗口 - QVariant currentDesktopId = sourceIndex.data(TaskManager::DesktopIdRole); - QVariant filterDesktopId = m_filterIndex.data(TaskManager::DesktopIdRole); - - bool result = (currentDesktopId.toString() == filterDesktopId.toString()); - // 在 Grouped 模式下,匹配同一应用的所有窗口 return result; } + } + + return false; } } diff --git a/panels/dock/taskmanager/hoverpreviewproxymodel.h b/panels/dock/taskmanager/hoverpreviewproxymodel.h index 09b246387..f1fff44e8 100644 --- a/panels/dock/taskmanager/hoverpreviewproxymodel.h +++ b/panels/dock/taskmanager/hoverpreviewproxymodel.h @@ -24,20 +24,16 @@ class HoverPreviewProxyModel : public QSortFilterProxyModel public: explicit HoverPreviewProxyModel(QObject *parent = nullptr); + enum FilterMode { + FilterByAppId, + FilterByWinId, + }; + /** * @brief 设置要预览的模型索引,在 noTaskGrouping 模式下精确匹配该窗口 * @param index 要预览的模型索引,无效索引则清除过滤条件 */ - void setFilterModelIndex(const QModelIndex &index); - - /** - * @brief 获取当前过滤的模型索引 - * @return 当前过滤的模型索引 - */ - QModelIndex filterModelIndex() const - { - return m_filterIndex; - } + void setFilter(QString filter, enum FilterMode mode); /** * @brief 清除过滤条件,重置模型状态 @@ -48,8 +44,8 @@ class HoverPreviewProxyModel : public QSortFilterProxyModel bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; private: - QModelIndex m_filterIndex; // 当前过滤的模型索引 - TaskManagerSettings *m_settings; // 任务管理器设置,用于获取 noTaskGrouping 状态 + FilterMode m_filterMode; + QString m_filter; }; } diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 6abeeceed..074d8ae89 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -248,7 +248,13 @@ void TaskManager::requestPreview(const QModelIndex &index, QObject *relativePosi } // Set the preview filter condition based on the incoming model index - m_hoverPreviewModel->setFilterModelIndex(index); + if (windowSplit()) { + QString winId = index.data(TaskManager::WinIdRole).toString(); + m_hoverPreviewModel->setFilter(winId, HoverPreviewProxyModel::FilterByWinId); + } else { + QString appId = index.data(TaskManager::DesktopIdRole).toString(); + m_hoverPreviewModel->setFilter(appId, HoverPreviewProxyModel::FilterByAppId); + } // Check if there are any windows after filtering if (m_hoverPreviewModel->rowCount() == 0) {