diff --git a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json index 3ac48dc91..e00e6d83d 100644 --- a/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json +++ b/panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json @@ -96,6 +96,17 @@ "description": "The items which is docked when dock is started.", "permissions": "readwrite", "visibility": "private" + }, + "windowIconWhitelist": { + "value": ["com.tencent.wechat"], + "serial": 0, + "flags": [], + "name": "windowIconWhitelist", + "name[zh_CN]": "窗口图标白名单", + "description": "List of app id that should prefer window icon when window split is disabled", + "permissions": "readwrite", + "visibility": "private" } + } } diff --git a/panels/dock/taskmanager/dockcombinemodel.cpp b/panels/dock/taskmanager/dockcombinemodel.cpp index cba9d77be..aa18a0655 100644 --- a/panels/dock/taskmanager/dockcombinemodel.cpp +++ b/panels/dock/taskmanager/dockcombinemodel.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2025 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,7 +7,7 @@ #include "globals.h" #include "rolecombinemodel.h" #include "taskmanager.h" - +#include "taskmanagersettings.h" namespace dock { DockCombineModel::DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent) @@ -55,7 +55,16 @@ QVariant DockCombineModel::data(const QModelIndex &index, int role) const return res; } case TaskManager::IconNameRole: { - QString winTitle = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString(); + if (TaskManagerSettings::instance()->isWindowSplit()) { + auto desktopId = data(index, TaskManager::DesktopIdRole).toString(); + auto whitelist = TaskManagerSettings::instance()->windowIconWhitelist(); + if (whitelist.contains(desktopId)) { + auto winIcon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString(); + if (!winIcon.isEmpty()) { + return winIcon; + } + } + } auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString(); if (icon.isEmpty()) { icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString(); diff --git a/panels/dock/taskmanager/dockitemmodel.cpp b/panels/dock/taskmanager/dockitemmodel.cpp index d05965260..55d7316e7 100644 --- a/panels/dock/taskmanager/dockitemmodel.cpp +++ b/panels/dock/taskmanager/dockitemmodel.cpp @@ -48,17 +48,9 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model) sourceModel()->disconnect(this); } - auto currentCount = this->rowCount(); - auto newCount = model->rowCount(); + beginResetModel(); QAbstractProxyModel::setSourceModel(model); - - if (newCount > currentCount) { - beginInsertRows(QModelIndex(), currentCount, newCount - 1); - endInsertRows(); - } else if (newCount < currentCount) { - beginRemoveRows(QModelIndex(), newCount, currentCount); - endRemoveRows(); - } + endResetModel(); connect(sourceModel(), &QAbstractItemModel::rowsInserted, this, [this](const QModelIndex &parent, int first, int last) { if (parent.isValid() || m_isUpdating) @@ -87,8 +79,6 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model) endMoveRows(); }); - auto bottomRight = this->index(std::min(currentCount, newCount), 0); - Q_EMIT dataChanged(index(0, 0), bottomRight); m_isUpdating = false; } diff --git a/panels/dock/taskmanager/globals.h b/panels/dock/taskmanager/globals.h index 6db543a09..74509a1ab 100644 --- a/panels/dock/taskmanager/globals.h +++ b/panels/dock/taskmanager/globals.h @@ -26,6 +26,7 @@ static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cg static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = "cgroupsBasedGroupingSkipCategories"; static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items"; constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements"; +constexpr auto TASKMANAGER_WINDOW_ICON_WHITELIST_KEY = "windowIconWhitelist"; // model roleNames constexpr auto MODEL_WINID = "winId"; diff --git a/panels/dock/taskmanager/taskmanagersettings.cpp b/panels/dock/taskmanager/taskmanagersettings.cpp index bbc76f83c..52aa69689 100644 --- a/panels/dock/taskmanager/taskmanagersettings.cpp +++ b/panels/dock/taskmanager/taskmanagersettings.cpp @@ -68,6 +68,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent) m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList(); m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList(); m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList(); + m_windowIconWhitelist = m_taskManagerDconfig->value(TASKMANAGER_WINDOW_ICON_WHITELIST_KEY, {"com.tencent.wechat"}).toStringList(); migrateFromDockedItems(); } @@ -113,6 +114,11 @@ QStringList TaskManagerSettings::cgroupsBasedGroupingSkipCategories() const return m_cgroupsBasedGroupingSkipCategories; } +QStringList TaskManagerSettings::windowIconWhitelist() const +{ + return m_windowIconWhitelist; +} + QStringList TaskManagerSettings::dockedElements() const { return m_dockedElements; diff --git a/panels/dock/taskmanager/taskmanagersettings.h b/panels/dock/taskmanager/taskmanagersettings.h index 7a0b6e405..168995f5b 100644 --- a/panels/dock/taskmanager/taskmanagersettings.h +++ b/panels/dock/taskmanager/taskmanagersettings.h @@ -35,6 +35,8 @@ class TaskManagerSettings : public QObject QStringList cgroupsBasedGroupingSkipIds() const; QStringList cgroupsBasedGroupingSkipCategories() const; + QStringList windowIconWhitelist() const; + void setDockedElements(const QStringList &elements); void toggleDockedElement(const QString &element); void appendDockedElement(const QString &element); @@ -64,6 +66,7 @@ class TaskManagerSettings : public QObject bool m_windowSplit; bool m_cgroupsBasedGrouping; QStringList m_dockedElements; + QStringList m_windowIconWhitelist; QStringList m_cgroupsBasedGroupingSkipAppIds; QStringList m_cgroupsBasedGroupingSkipCategories; };