Skip to content

Commit 3c507cd

Browse files
committed
refactor: migrate taskmanager model to the new DockItemModel
切换 taskmanager 区域的 model 为新的 DockItemModel,以解决一系列问题: 1. 部分场景下企业微信和微信图标合并/钉钉和微信合并等问题 2. 终端执行 gitk/dde-dconfig-editor 时不会单独显示任务栏图标 3. 没有 desktop-id 的带界面的可执行程序不会单独显示任务栏图标 Log:
1 parent fc1117a commit 3c507cd

16 files changed

+430
-372
lines changed

panels/dock/taskmanager/abstractwindowmonitor.cpp

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
#include "taskmanager.h"
99

1010
namespace dock {
11-
AbstractWindowMonitor::AbstractWindowMonitor(QObject* parent)
11+
AbstractWindowMonitor::AbstractWindowMonitor(QObject *parent)
1212
: QAbstractListModel(parent)
13+
, AbstractTaskManagerInterface(nullptr)
1314
{
1415
}
1516

@@ -30,6 +31,48 @@ int AbstractWindowMonitor::rowCount(const QModelIndex &parent) const
3031
return m_trackedWindows.size();
3132
}
3233

34+
void AbstractWindowMonitor::requestActivate(const QModelIndex &index) const
35+
{
36+
auto window = m_trackedWindows.value(index.row(), nullptr);
37+
if (nullptr == window)
38+
return;
39+
40+
if (window->isActive()) {
41+
window->minimize();
42+
} else {
43+
window->activate();
44+
}
45+
}
46+
47+
void AbstractWindowMonitor::requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const
48+
{
49+
}
50+
51+
void AbstractWindowMonitor::requestNewInstance(const QModelIndex &index, const QString &action) const
52+
{
53+
}
54+
55+
void AbstractWindowMonitor::requestClose(const QModelIndex &index, bool force) const
56+
{
57+
auto window = m_trackedWindows.value(index.row(), nullptr);
58+
if (nullptr == window)
59+
return;
60+
if (force) {
61+
window->killClient();
62+
} else {
63+
window->close();
64+
}
65+
}
66+
67+
void AbstractWindowMonitor::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
68+
{
69+
}
70+
71+
void AbstractWindowMonitor::requestWindowsView(const QModelIndexList &indexes) const
72+
{
73+
qDebug() << indexes;
74+
}
75+
3376
QVariant AbstractWindowMonitor::data(const QModelIndex &index, int role) const
3477
{
3578
auto pos = index.row();
@@ -84,10 +127,10 @@ void AbstractWindowMonitor::trackWindow(AbstractWindow* window)
84127
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::WinTitleRole});
85128
});
86129

87-
connect(window, &AbstractWindow::isActiveChanged, this, [this, window]() {
130+
connect(window, &AbstractWindow::stateChanged, this, [this, window]() {
88131
auto pos = m_trackedWindows.indexOf(window);
89132
auto modelIndex = index(pos);
90-
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole});
133+
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole, TaskManager::AttentionRole});
91134
});
92135
connect(window, &AbstractWindow::shouldSkipChanged, this, [this, window]() {
93136
auto pos = m_trackedWindows.indexOf(window);

panels/dock/taskmanager/abstractwindowmonitor.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#pragma once
66

7+
#include "abstracttaskmanagerinterface.h"
78
#include "abstractwindow.h"
89
#include "taskmanager.h"
910

@@ -14,7 +15,7 @@
1415

1516
namespace dock {
1617
class AppItem;
17-
class AbstractWindowMonitor : public QAbstractListModel
18+
class AbstractWindowMonitor : public QAbstractListModel, public AbstractTaskManagerInterface
1819
{
1920
Q_OBJECT
2021

@@ -34,16 +35,27 @@ class AbstractWindowMonitor : public QAbstractListModel
3435
// TODO: remove this when Modelized finizhed.
3536
virtual QPointer<AbstractWindow> getWindowByWindowId(ulong windowId) = 0;
3637

38+
void requestActivate(const QModelIndex &index) const override;
39+
void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const override;
40+
void requestNewInstance(const QModelIndex &index, const QString &action) const override;
41+
void requestClose(const QModelIndex &index, bool force = false) const override;
42+
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
43+
44+
virtual void
45+
requestPreview(QAbstractItemModel *sourceModel, QWindow *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) = 0;
46+
47+
void requestWindowsView(const QModelIndexList &indexes) const override;
48+
3749
virtual void presentWindows(QList<uint32_t> windowsId) = 0;
3850

39-
virtual void showItemPreview(const QPointer<AppItem>& item, QObject* relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) = 0;
4051
virtual void hideItemPreview() = 0;
4152

4253
Q_SIGNALS:
4354
void windowAdded(QPointer<AbstractWindow> window);
4455
// true -> At least one window is at fullscreen state. false -> none of the windows is at fullscreen state.
4556
void windowFullscreenChanged(bool);
4657
void WindowMonitorShutdown();
58+
void previewShouldClear();
4759

4860
private:
4961
QList<AbstractWindow*> m_trackedWindows;

panels/dock/taskmanager/dockcombinemodel.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ QVariant DockCombineModel::data(const QModelIndex &index, int role) const
5353
return res;
5454
}
5555
case TaskManager::IconNameRole: {
56+
QString winTitle = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
5657
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
5758
if (icon.isEmpty()) {
5859
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();

panels/dock/taskmanager/dockgroupmodel.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ QVariantList DockGroupModel::all(const QModelIndex &index, int role) const
9191
QVariantList res;
9292
auto rowCount = RoleGroupModel::rowCount(index);
9393
for (int i = 0; i < rowCount; i++) {
94-
auto window = RoleGroupModel::data(index, role);
95-
if (window.isValid())
94+
auto childIndex = RoleGroupModel::index(i, 0, index);
95+
auto window = RoleGroupModel::data(childIndex, role);
96+
// Check if the data is valid and not empty
97+
if (window.isValid() && !window.toString().isEmpty())
9698
res.append(window);
9799
}
98100

panels/dock/taskmanager/dockitemmodel.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,14 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model)
9595

9696
void DockItemModel::dumpItemInfo(const QModelIndex &index)
9797
{
98-
qDebug() << "Index in DockItemModel:" << index << "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
99-
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole) << "DockedRole:" << data(index, TaskManager::DockedRole);
98+
// clang-format off
99+
qDebug() << "Index in DockItemModel:" << index
100+
<< "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
101+
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole)
102+
<< "WinIconRole:" << data(index, TaskManager::WinIconRole)
103+
<< "IconNameRole:" << data(index, TaskManager::IconNameRole)
104+
<< "DockedRole:" << data(index, TaskManager::DockedRole);
105+
// clang-format on
100106
}
101107

102108
QHash<int, QByteArray> DockItemModel::roleNames() const

panels/dock/taskmanager/package/AppItem.qml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Item {
2222
required property string menus
2323
required property list<string> windows
2424
required property int visualIndex
25+
required property var modelIndex
2526

26-
signal clickItem(itemId: string, menuId: string)
2727
signal dropFilesOnItem(itemId: string, files: list<string>)
2828
signal dragFinished()
2929

@@ -145,7 +145,7 @@ Item {
145145
delegate: LP.MenuItem {
146146
text: modelData.name
147147
onTriggered: {
148-
root.clickItem(root.itemId, modelData.id)
148+
TaskManager.requestNewInstance(root.modelIndex, modelData.id);
149149
}
150150
}
151151
onObjectAdded: (index, object) => contextMenu.insertItem(index, object)
@@ -286,7 +286,8 @@ Item {
286286
property int yOffset: 0
287287
onTriggered: {
288288
if (root.windows.length != 0 || Qt.platform.pluginName === "wayland") {
289-
taskmanager.Applet.showItemPreview(root.itemId, Panel.rootObject, xOffset, yOffset, Panel.position)
289+
// 使用基于 modelIndex 的预览API,确保精确匹配
290+
taskmanager.Applet.requestPreview(root.modelIndex, Panel.rootObject, xOffset, yOffset, Panel.position);
290291
}
291292
}
292293
}
@@ -316,14 +317,17 @@ Item {
316317
closeItemPreview()
317318
}
318319
onClicked: function (mouse) {
320+
let index = root.modelIndex;
319321
if (mouse.button === Qt.RightButton) {
320322
contextMenuLoader.active = true
321323
MenuHelper.openMenu(contextMenuLoader.item)
322324
} else {
323325
if (root.windows.length === 0) {
324-
launchAnimation.start()
326+
launchAnimation.start();
327+
TaskManager.requestNewInstance(index, "");
328+
return;
325329
}
326-
root.clickItem(root.itemId, "")
330+
TaskManager.requestActivate(index);
327331
}
328332
}
329333

panels/dock/taskmanager/package/TaskManager.qml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ ContainmentItem {
8282
}
8383
delegate: Item {
8484
id: delegateRoot
85+
required property int index
8586
required property bool active
8687
required property bool attention
8788
required property string itemId
8889
required property string name
8990
required property string iconName
91+
required property string icon // winIconName
9092
required property string menus
9193
required property list<string> windows
9294
z: attention ? -1 : 0
@@ -113,6 +115,7 @@ ContainmentItem {
113115
implicitHeight: useColumnLayout ? visualModel.cellWidth : taskmanager.implicitHeight
114116

115117
property int visualIndex: DelegateModel.itemsIndex
118+
property var modelIndex: visualModel.modelIndex(index)
116119

117120
AppItem {
118121
id: app
@@ -126,9 +129,9 @@ ContainmentItem {
126129
menus: delegateRoot.menus
127130
windows: delegateRoot.windows
128131
visualIndex: delegateRoot.visualIndex
132+
modelIndex: delegateRoot.modelIndex
129133
ListView.delayRemove: Drag.active
130134
Component.onCompleted: {
131-
clickItem.connect(taskmanager.Applet.clickItem)
132135
dropFilesOnItem.connect(taskmanager.Applet.dropFilesOnItem)
133136
}
134137
onDragFinished: function() {

panels/dock/taskmanager/rolecombinemodel.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ QHash<int, QByteArray> RoleCombineModel::createRoleNames() const
318318
std::for_each(minorRoleNames.constBegin(), minorRoleNames.constEnd(), [&lastRole, &roleNames, this](auto &roleName) {
319319
roleNames.insert(++lastRole, roleName);
320320
});
321-
322321
return roleNames;
323322
}
324323

0 commit comments

Comments
 (0)