Skip to content

Commit de92edc

Browse files
committed
refactor: prepare for combined model for taskmanager
为后续多任务区域切换到新的合并模型做出准备. 目前的表现行为仍然和之前一致,无行为变化(taskmanager实际使用的仍然是原模型). Log:
1 parent 9b4fe73 commit de92edc

15 files changed

+1335
-27
lines changed

panels/dock/taskmanager/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ add_library(dock-taskmanager SHARED ${DBUS_INTERFACES}
6666
desktopfileamparser.cpp
6767
desktopfileamparser.h
6868
desktopfileparserfactory.h
69+
dockcombinemodel.cpp
70+
dockcombinemodel.h
71+
dockitemmodel.cpp
72+
dockitemmodel.h
73+
dockglobalelementmodel.cpp
74+
dockglobalelementmodel.h
75+
dockgroupmodel.cpp
76+
dockgroupmodel.h
6977
taskmanager.cpp
7078
taskmanager.h
7179
treelandwindow.cpp
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
2+
//
3+
// SPDX-License-Identifier: GPL-3.0-or-later
4+
5+
#pragma once
6+
7+
#include <QAbstractProxyModel>
8+
#include <QModelIndex>
9+
#include <algorithm>
10+
#include <utility>
11+
12+
namespace dock
13+
{
14+
class AbstractTaskManagerInterface
15+
{
16+
public:
17+
virtual void requestActivate(const QModelIndex &index) const = 0;
18+
virtual void requestNewInstance(const QModelIndex &index, const QString &action) const = 0;
19+
virtual void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const = 0;
20+
virtual void requestClose(const QModelIndex &index, bool force = false) const = 0;
21+
virtual void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const = 0;
22+
23+
virtual void
24+
requestPreview(const QModelIndexList &indexes, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) const = 0;
25+
virtual void requestWindowsView(const QModelIndexList &indexes) const = 0;
26+
};
27+
28+
template<typename Func, typename... Args>
29+
void callInterfaceMethod(const QAbstractProxyModel *model, const QModelIndex &index, Func func, Args &&...args)
30+
{
31+
if (nullptr == model) {
32+
return;
33+
}
34+
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(model->sourceModel());
35+
if (interface != nullptr) {
36+
(interface->*func)(model->mapToSource(index), std::forward<Args>(args)...);
37+
}
38+
}
39+
40+
template<typename Func, typename... Args>
41+
void callInterfaceMethod(const QAbstractProxyModel *model, const QModelIndexList &indexes, Func func, Args &&...args)
42+
{
43+
if (nullptr == model) {
44+
return;
45+
}
46+
QModelIndexList sourceModelIndexes;
47+
std::transform(indexes.begin(), indexes.end(), std::back_inserter(sourceModelIndexes), [model](const auto &index) {
48+
return model->mapToSource(index);
49+
});
50+
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(model->sourceModel());
51+
if (interface != nullptr) {
52+
(interface->*func)(sourceModelIndexes, std::forward<Args>(args)...);
53+
}
54+
}
55+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
2+
//
3+
// SPDX-License-Identifier: GPL-3.0-or-later
4+
5+
#include "dockcombinemodel.h"
6+
#include "abstracttaskmanagerinterface.h"
7+
#include "globals.h"
8+
#include "rolecombinemodel.h"
9+
#include "taskmanager.h"
10+
11+
namespace dock
12+
{
13+
DockCombineModel::DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent)
14+
: RoleCombineModel(major, minor, majorRoles, func, parent)
15+
{
16+
// due to role has changed by RoleGroupModel, so we redirect role to TaskManager::Roles.
17+
m_roleMaps = {{TaskManager::ActiveRole, RoleCombineModel::roleNames().key(MODEL_ACTIVE)},
18+
{TaskManager::AttentionRole, RoleCombineModel::roleNames().key(MODEL_ATTENTION)},
19+
{TaskManager::DesktopIdRole, RoleCombineModel::roleNames().key(MODEL_DESKTOPID)},
20+
{TaskManager::IconNameRole, RoleCombineModel::roleNames().key(MODEL_ICONNAME)},
21+
{TaskManager::IdentityRole, RoleCombineModel::roleNames().key(MODEL_IDENTIFY)},
22+
{TaskManager::ActionsRole, RoleCombineModel::roleNames().key(MODEL_ACTIONS)},
23+
{TaskManager::NameRole, RoleCombineModel::roleNames().key(MODEL_NAME)},
24+
{TaskManager::WinIdRole, RoleCombineModel::roleNames().key(MODEL_WINID)},
25+
{TaskManager::WinTitleRole, RoleCombineModel::roleNames().key(MODEL_TITLE)}};
26+
}
27+
28+
QHash<int, QByteArray> DockCombineModel::roleNames() const
29+
{
30+
return {{TaskManager::ActiveRole, MODEL_ACTIVE},
31+
{TaskManager::AttentionRole, MODEL_ATTENTION},
32+
{TaskManager::DesktopIdRole, MODEL_DESKTOPID},
33+
{TaskManager::IconNameRole, MODEL_ICONNAME},
34+
{TaskManager::IdentityRole, MODEL_IDENTIFY},
35+
{TaskManager::ActionsRole, MODEL_ACTIONS},
36+
{TaskManager::NameRole, MODEL_NAME},
37+
{TaskManager::WinIdRole, MODEL_WINID},
38+
{TaskManager::WinTitleRole, MODEL_TITLE}};
39+
}
40+
41+
QVariant DockCombineModel::data(const QModelIndex &index, int role) const
42+
{
43+
switch (role) {
44+
case TaskManager::DesktopIdRole: {
45+
auto res = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::DesktopIdRole)).toString();
46+
if (res.isEmpty()) {
47+
auto data = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IdentityRole)).toStringList();
48+
res = data.value(0, "");
49+
}
50+
return res;
51+
}
52+
case TaskManager::IconNameRole: {
53+
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
54+
if (icon.isEmpty()) {
55+
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
56+
}
57+
return icon;
58+
}
59+
default: {
60+
auto newRole = m_roleMaps.value(role, -1);
61+
if (newRole == -1) {
62+
return QVariant();
63+
}
64+
65+
return RoleCombineModel::data(index, newRole);
66+
}
67+
}
68+
69+
return QVariant();
70+
}
71+
72+
void DockCombineModel::requestActivate(const QModelIndex &index) const
73+
{
74+
callInterfaceMethod(this, index, &AbstractTaskManagerInterface::requestActivate);
75+
}
76+
77+
void DockCombineModel::requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const
78+
{
79+
callInterfaceMethod(this, index, &AbstractTaskManagerInterface::requestOpenUrls, urls);
80+
}
81+
82+
void DockCombineModel::requestNewInstance(const QModelIndex &index, const QString &action) const
83+
{
84+
callInterfaceMethod(this, index, &AbstractTaskManagerInterface::requestNewInstance, action);
85+
}
86+
87+
void DockCombineModel::requestClose(const QModelIndex &index, bool force) const
88+
{
89+
callInterfaceMethod(this, index, &AbstractTaskManagerInterface::requestClose, force);
90+
}
91+
92+
void DockCombineModel::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
93+
{
94+
callInterfaceMethod(this, index, &AbstractTaskManagerInterface::requestUpdateWindowGeometry, geometry, delegate);
95+
}
96+
97+
void DockCombineModel::requestPreview(const QModelIndexList &indexes,
98+
QObject *relativePositionItem,
99+
int32_t previewXoffset,
100+
int32_t previewYoffset,
101+
uint32_t direction) const
102+
{
103+
callInterfaceMethod(this, indexes, &AbstractTaskManagerInterface::requestPreview, relativePositionItem, previewXoffset, previewYoffset, direction);
104+
}
105+
106+
void DockCombineModel::requestWindowsView(const QModelIndexList &indexes) const
107+
{
108+
callInterfaceMethod(this, indexes, &AbstractTaskManagerInterface::requestWindowsView);
109+
}
110+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
2+
//
3+
// SPDX-License-Identifier: GPL-3.0-or-later
4+
5+
#pragma once
6+
7+
#include "abstracttaskmanagerinterface.h"
8+
#include "rolecombinemodel.h"
9+
10+
namespace dock
11+
{
12+
class DockCombineModel : public RoleCombineModel, public AbstractTaskManagerInterface
13+
{
14+
Q_OBJECT
15+
16+
public:
17+
DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent = nullptr);
18+
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
19+
QHash<int, QByteArray> roleNames() const override;
20+
21+
void requestActivate(const QModelIndex &index) const override;
22+
void requestNewInstance(const QModelIndex &index, const QString &action) const override;
23+
void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const override;
24+
void requestClose(const QModelIndex &index, bool force = false) const override;
25+
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
26+
void requestPreview(const QModelIndexList &indexes,
27+
QObject *relativePositionItem,
28+
int32_t previewXoffset,
29+
int32_t previewYoffset,
30+
uint32_t direction) const override;
31+
void requestWindowsView(const QModelIndexList &indexes) const override;
32+
33+
private:
34+
QHash<int, int> m_roleMaps;
35+
};
36+
}

0 commit comments

Comments
 (0)