Skip to content

Commit 181e6da

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

16 files changed

+1238
-35
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: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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+
protected:
17+
template<typename Func, typename... Args>
18+
void callInterfaceMethod(const QModelIndex &index, Func func, Args &&...args) const
19+
{
20+
if (nullptr == m_model) {
21+
return;
22+
}
23+
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(m_model->sourceModel());
24+
if (interface != nullptr) {
25+
(interface->*func)(m_model->mapToSource(index), std::forward<Args>(args)...);
26+
}
27+
}
28+
29+
template<typename Func, typename... Args>
30+
void callInterfaceMethod(const QModelIndexList &indexes, Func func, Args &&...args) const
31+
{
32+
if (nullptr == m_model) {
33+
return;
34+
}
35+
QModelIndexList sourceModelIndexes;
36+
std::transform(indexes.begin(), indexes.end(), std::back_inserter(sourceModelIndexes), [this](const auto &index) {
37+
return m_model->mapToSource(index);
38+
});
39+
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(m_model->sourceModel());
40+
if (interface != nullptr) {
41+
(interface->*func)(sourceModelIndexes, std::forward<Args>(args)...);
42+
}
43+
}
44+
45+
public:
46+
AbstractTaskManagerInterface(QAbstractProxyModel *model)
47+
: m_model(model){};
48+
49+
virtual void requestActivate(const QModelIndex &index) const
50+
{
51+
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestActivate);
52+
}
53+
virtual void requestNewInstance(const QModelIndex &index, const QString &action) const
54+
{
55+
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestNewInstance, action);
56+
}
57+
virtual void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const
58+
{
59+
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestOpenUrls, urls);
60+
}
61+
virtual void requestClose(const QModelIndex &index, bool force = false) const
62+
{
63+
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestClose, force);
64+
}
65+
virtual void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const
66+
{
67+
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestUpdateWindowGeometry, geometry, delegate);
68+
}
69+
70+
virtual void
71+
requestPreview(const QModelIndexList &indexes, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) const
72+
{
73+
callInterfaceMethod(indexes, &AbstractTaskManagerInterface::requestPreview, relativePositionItem, previewXoffset, previewYoffset, direction);
74+
}
75+
virtual void requestWindowsView(const QModelIndexList &indexes) const
76+
{
77+
callInterfaceMethod(indexes, &AbstractTaskManagerInterface::requestWindowsView);
78+
}
79+
80+
protected:
81+
QAbstractProxyModel *m_model;
82+
};
83+
}

panels/dock/taskmanager/dconfig/org.deepin.ds.dock.taskmanager.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@
4242
"description": "The default apps which is docked when dock is started.",
4343
"permissions": "readwrite",
4444
"visibility": "private"
45+
},
46+
"dockedElements": {
47+
"value": ["desktop/dde-file-manager", "desktop/deepin-app-storedesktop", "desktop/org.deepin.browser", "desktop/deepin-mail", "desktop/deepin-terminal", "desktop/dde-calendar", "desktop/deepin-music", "desktop/deepin-editor", "desktop/deepin-calculator", "desktop/org.deepin.dde.control-center", "desktop/dde-trash"],
48+
"serial": 0,
49+
"flags": [],
50+
"name": "dockedElements",
51+
"name[zh_CN]": "任务栏驻留项目",
52+
"description": "The items which is docked when dock is started.",
53+
"permissions": "readwrite",
54+
"visibility": "private"
4555
}
4656
}
4757
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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+
, AbstractTaskManagerInterface(this)
16+
{
17+
// due to role has changed by RoleGroupModel, so we redirect role to TaskManager::Roles.
18+
m_roleMaps = {{TaskManager::ActiveRole, RoleCombineModel::roleNames().key(MODEL_ACTIVE)},
19+
{TaskManager::AttentionRole, RoleCombineModel::roleNames().key(MODEL_ATTENTION)},
20+
{TaskManager::DesktopIdRole, RoleCombineModel::roleNames().key(MODEL_DESKTOPID)},
21+
{TaskManager::IconNameRole, RoleCombineModel::roleNames().key(MODEL_ICONNAME)},
22+
{TaskManager::IdentityRole, RoleCombineModel::roleNames().key(MODEL_IDENTIFY)},
23+
{TaskManager::ActionsRole, RoleCombineModel::roleNames().key(MODEL_ACTIONS)},
24+
{TaskManager::NameRole, RoleCombineModel::roleNames().key(MODEL_NAME)},
25+
{TaskManager::WinIdRole, RoleCombineModel::roleNames().key(MODEL_WINID)},
26+
{TaskManager::WinTitleRole, RoleCombineModel::roleNames().key(MODEL_TITLE)}};
27+
}
28+
29+
QHash<int, QByteArray> DockCombineModel::roleNames() const
30+
{
31+
return {{TaskManager::ActiveRole, MODEL_ACTIVE},
32+
{TaskManager::AttentionRole, MODEL_ATTENTION},
33+
{TaskManager::DesktopIdRole, MODEL_DESKTOPID},
34+
{TaskManager::IconNameRole, MODEL_ICONNAME},
35+
{TaskManager::IdentityRole, MODEL_IDENTIFY},
36+
{TaskManager::ActionsRole, MODEL_ACTIONS},
37+
{TaskManager::NameRole, MODEL_NAME},
38+
{TaskManager::WinIdRole, MODEL_WINID},
39+
{TaskManager::WinTitleRole, MODEL_TITLE}};
40+
}
41+
42+
QVariant DockCombineModel::data(const QModelIndex &index, int role) const
43+
{
44+
switch (role) {
45+
case TaskManager::DesktopIdRole: {
46+
auto res = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::DesktopIdRole)).toString();
47+
if (res.isEmpty()) {
48+
auto data = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IdentityRole)).toStringList();
49+
res = data.value(0, "");
50+
}
51+
return res;
52+
}
53+
case TaskManager::IconNameRole: {
54+
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
55+
if (icon.isEmpty()) {
56+
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
57+
}
58+
return icon;
59+
}
60+
default: {
61+
auto newRole = m_roleMaps.value(role, -1);
62+
if (newRole == -1) {
63+
return QVariant();
64+
}
65+
66+
return RoleCombineModel::data(index, newRole);
67+
}
68+
}
69+
70+
return QVariant();
71+
}
72+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
private:
22+
QHash<int, int> m_roleMaps;
23+
};
24+
}

0 commit comments

Comments
 (0)