Skip to content

Commit e0e5eb3

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 4552f1b commit e0e5eb3

23 files changed

+598
-441
lines changed

panels/dock/taskmanager/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ add_library(dock-taskmanager SHARED ${DBUS_INTERFACES}
7474
dockglobalelementmodel.h
7575
dockgroupmodel.cpp
7676
dockgroupmodel.h
77+
hoverpreviewproxymodel.cpp
78+
hoverpreviewproxymodel.h
7779
taskmanager.cpp
7880
taskmanager.h
7981
treelandwindow.cpp

panels/dock/taskmanager/abstracttaskmanagerinterface.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@ class AbstractTaskManagerInterface
6666
{
6767
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestUpdateWindowGeometry, geometry, delegate);
6868
}
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-
}
7569
virtual void requestWindowsView(const QModelIndexList &indexes) const
7670
{
7771
callInterfaceMethod(indexes, &AbstractTaskManagerInterface::requestWindowsView);

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/dockglobalelementmodel.cpp

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ DockGlobalElementModel::DockGlobalElementModel(QAbstractItemModel *appsModel, Do
4141
}
4242
std::for_each(m_data.begin(), m_data.end(), [this, first, last](auto &data) {
4343
if (std::get<1>(data) == m_appsModel && std::get<2>(data) >= first) {
44-
data = std::make_tuple(std::get<0>(data), std::get<1>(data), std::get<2>(data) - -((last - first) + 1));
44+
data = std::make_tuple(std::get<0>(data), std::get<1>(data), std::get<2>(data) - ((last - first) + 1));
4545
}
4646
});
4747
});
@@ -293,7 +293,21 @@ QVariant DockGlobalElementModel::data(const QModelIndex &index, int role) const
293293
if (model == m_activeAppModel) {
294294
return QStringList{model->index(row, 0).data(TaskManager::WinIdRole).toString()};
295295
}
296-
return QVariant();
296+
// For m_appsModel data, we need to find all related windows
297+
QStringList windowIds;
298+
for (int i = 0; i < m_activeAppModel->rowCount(); ++i) {
299+
QModelIndex appIndex = m_activeAppModel->index(i, 0);
300+
QVariant identityData = appIndex.data(TaskManager::IdentityRole);
301+
QStringList identities = identityData.toStringList();
302+
303+
if (identities.contains(id)) {
304+
QString winId = appIndex.data(TaskManager::WinIdRole).toString();
305+
if (!winId.isEmpty() && winId != "0") {
306+
windowIds.append(winId);
307+
}
308+
}
309+
}
310+
return windowIds;
297311
}
298312
case TaskManager::MenusRole: {
299313
return getMenus(index);
@@ -384,25 +398,6 @@ void DockGlobalElementModel::requestUpdateWindowGeometry(const QModelIndex &inde
384398
Q_UNUSED(delegate)
385399
}
386400

387-
void DockGlobalElementModel::requestPreview(const QModelIndexList &indexes,
388-
QObject *relativePositionItem,
389-
int32_t previewXoffset,
390-
int32_t previewYoffset,
391-
uint32_t direction) const
392-
{
393-
QModelIndexList sourceIndexes;
394-
for (auto index : indexes) {
395-
auto data = m_data.value(index.row());
396-
auto id = std::get<0>(data);
397-
auto sourceModel = std::get<1>(data);
398-
auto sourceRow = std::get<2>(data);
399-
if (sourceModel == m_activeAppModel) {
400-
sourceIndexes.append(sourceModel->index(sourceRow, 0));
401-
}
402-
}
403-
m_activeAppModel->requestPreview(sourceIndexes, relativePositionItem, previewXoffset, previewYoffset, direction);
404-
}
405-
406401
void DockGlobalElementModel::requestWindowsView(const QModelIndexList &indexes) const
407402
{
408403
Q_UNUSED(indexes)

panels/dock/taskmanager/dockglobalelementmodel.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,6 @@ class DockGlobalElementModel : public QAbstractListModel, public AbstractTaskMan
3434
void requestClose(const QModelIndex &index, bool force = false) const override;
3535
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
3636

37-
void requestPreview(const QModelIndexList &indexes,
38-
QObject *relativePositionItem,
39-
int32_t previewXoffset,
40-
int32_t previewYoffset,
41-
uint32_t direction) const override;
4237
void requestWindowsView(const QModelIndexList &indexes) const override;
4338

4439
private:

panels/dock/taskmanager/dockgroupmodel.cpp

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,23 +137,6 @@ void DockGroupModel::requestUpdateWindowGeometry(const QModelIndex &index, const
137137
Q_UNUSED(delegate)
138138
}
139139

140-
void DockGroupModel::requestPreview(const QModelIndexList &indexes,
141-
QObject *relativePositionItem,
142-
int32_t previewXoffset,
143-
int32_t previewYoffset,
144-
uint32_t direction) const
145-
{
146-
QModelIndexList proxyIndexes;
147-
for (auto index : indexes) {
148-
for (int i = 0; i < RoleGroupModel::rowCount(index); ++i) {
149-
auto proxyIndex = createIndex(i, 0, index.row());
150-
proxyIndexes.append(proxyIndex);
151-
}
152-
}
153-
154-
callInterfaceMethod(proxyIndexes, &AbstractTaskManagerInterface::requestPreview, relativePositionItem, previewXoffset, previewYoffset, direction);
155-
}
156-
157140
void DockGroupModel::requestWindowsView(const QModelIndexList &indexes) const
158141
{
159142
QModelIndexList sourceIndexes;
@@ -165,4 +148,4 @@ void DockGroupModel::requestWindowsView(const QModelIndexList &indexes) const
165148

166149
callInterfaceMethod(sourceIndexes, &AbstractTaskManagerInterface::requestWindowsView);
167150
}
168-
}
151+
}

panels/dock/taskmanager/dockgroupmodel.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ class DockGroupModel : public RoleGroupModel, public AbstractTaskManagerInterfac
2222
void requestActivate(const QModelIndex &index) const override;
2323
void requestClose(const QModelIndex &index, bool force = false) const override;
2424
void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const override;
25-
void requestPreview(const QModelIndexList &indexes,
26-
QObject *relativePositionItem,
27-
int32_t previewXoffset,
28-
int32_t previewYoffset,
29-
uint32_t direction) const override;
3025
void requestWindowsView(const QModelIndexList &indexes) const override;
3126

3227
private:

panels/dock/taskmanager/dockitemmodel.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@ DockItemModel::DockItemModel(QAbstractItemModel *globalModel, QObject *parent)
1919
, m_isUpdating(false)
2020
{
2121
auto updateSourceModel = [this]() {
22-
if (TaskManagerSettings::instance()->isWindowSplit() == m_split)
22+
bool isWindowSplit = TaskManagerSettings::instance()->isWindowSplit();
23+
if (isWindowSplit == m_split)
2324
return;
2425

25-
m_split = TaskManagerSettings::instance()->isWindowSplit();
26-
if (m_split) {
26+
m_split = isWindowSplit;
27+
28+
if (isWindowSplit) {
29+
// noTaskGrouping = true: 不分组,每个窗口单独显示
2730
setSourceModel(m_globalModel);
2831
m_groupModel.reset(nullptr);
2932
} else {
33+
// noTaskGrouping = false: 分组显示,同一应用的窗口合并
3034
m_groupModel.reset(new DockGroupModel(m_globalModel, TaskManager::DesktopIdRole));
3135
setSourceModel(m_groupModel.get());
3236
}
@@ -93,8 +97,14 @@ void DockItemModel::setSourceModel(QAbstractItemModel *model)
9397

9498
void DockItemModel::dumpItemInfo(const QModelIndex &index)
9599
{
96-
qDebug() << "Index in DockItemModel:" << index << "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
97-
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole) << "DockedRole:" << data(index, TaskManager::DockedRole);
100+
// clang-format off
101+
qDebug() << "Index in DockItemModel:" << index
102+
<< "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
103+
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole)
104+
<< "WinIconRole:" << data(index, TaskManager::WinIconRole)
105+
<< "IconNameRole:" << data(index, TaskManager::IconNameRole)
106+
<< "DockedRole:" << data(index, TaskManager::DockedRole);
107+
// clang-format on
98108
}
99109

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

0 commit comments

Comments
 (0)