Skip to content

Commit 4af5797

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 a60d9fb commit 4af5797

16 files changed

+304
-276
lines changed

panels/dock/taskmanager/abstractwindowmonitor.cpp

Lines changed: 55 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

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

33+
void AbstractWindowMonitor::requestActivate(const QModelIndex &index) const
34+
{
35+
auto window = m_trackedWindows.value(index.row(), nullptr);
36+
if (nullptr == window)
37+
return;
38+
39+
if (window->isActive()) {
40+
window->minimize();
41+
} else {
42+
window->activate();
43+
}
44+
}
45+
46+
void AbstractWindowMonitor::requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const
47+
{
48+
}
49+
50+
void AbstractWindowMonitor::requestNewInstance(const QModelIndex &index, const QString &action) const
51+
{
52+
}
53+
54+
void AbstractWindowMonitor::requestClose(const QModelIndex &index, bool force) const
55+
{
56+
auto window = m_trackedWindows.value(index.row(), nullptr);
57+
if (nullptr == window)
58+
return;
59+
if (force) {
60+
window->killClient();
61+
} else {
62+
window->close();
63+
}
64+
}
65+
66+
void AbstractWindowMonitor::requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const
67+
{
68+
}
69+
70+
void AbstractWindowMonitor::requestPreview(const QModelIndexList &indexes,
71+
QObject *relativePositionItem,
72+
int32_t previewXoffset,
73+
int32_t previewYoffset,
74+
uint32_t direction) const
75+
{
76+
qDebug() << indexes;
77+
}
78+
79+
void AbstractWindowMonitor::requestWindowsView(const QModelIndexList &indexes) const
80+
{
81+
qDebug() << indexes;
82+
}
83+
3284
QVariant AbstractWindowMonitor::data(const QModelIndex &index, int role) const
3385
{
3486
auto pos = index.row();
@@ -83,10 +135,10 @@ void AbstractWindowMonitor::trackWindow(AbstractWindow* window)
83135
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::WinTitleRole});
84136
});
85137

86-
connect(window, &AbstractWindow::isActiveChanged, this, [this, window]() {
138+
connect(window, &AbstractWindow::stateChanged, this, [this, window]() {
87139
auto pos = m_trackedWindows.indexOf(window);
88140
auto modelIndex = index(pos);
89-
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole});
141+
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole, TaskManager::AttentionRole});
90142
});
91143
connect(window, &AbstractWindow::shouldSkipChanged, this, [this, window]() {
92144
auto pos = m_trackedWindows.indexOf(window);

panels/dock/taskmanager/abstractwindowmonitor.h

Lines changed: 15 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,9 +35,21 @@ 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+
void requestPreview(const QModelIndexList &indexes,
45+
QObject *relativePositionItem,
46+
int32_t previewXoffset,
47+
int32_t previewYoffset,
48+
uint32_t direction) const override;
49+
void requestWindowsView(const QModelIndexList &indexes) const override;
50+
3751
virtual void presentWindows(QList<uint32_t> windowsId) = 0;
3852

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

4255
Q_SIGNALS:

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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ void DockGlobalElementModel::requestNewInstance(const QModelIndex &index, const
319319
if (action == DOCK_ACTION_DOCK) {
320320
} else if (action == DOCK_ACTION_FORCEQUIT) {
321321
} else if (action == DOCK_ACTION_CLOSEALL) {
322+
requestClose(index);
322323
} else {
323324
auto data = m_data.value(index.row());
324325
auto id = std::get<0>(data);

panels/dock/taskmanager/dockitemmodel.cpp

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

9494
void DockItemModel::dumpItemInfo(const QModelIndex &index)
9595
{
96-
qDebug() << "Index in DockItemModel:" << index << "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
97-
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole) << "DockedRole:" << data(index, TaskManager::DockedRole);
96+
// clang-format off
97+
qDebug() << "Index in DockItemModel:" << index
98+
<< "DesktopIdRole:" << data(index, TaskManager::DesktopIdRole)
99+
<< "ItemIdRole:" << data(index, TaskManager::ItemIdRole)
100+
<< "WinIconRole:" << data(index, TaskManager::WinIconRole)
101+
<< "IconNameRole:" << data(index, TaskManager::IconNameRole)
102+
<< "DockedRole:" << data(index, TaskManager::DockedRole);
103+
// clang-format on
98104
}
99105

100106
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+
var indexes = [root.modelIndex];
290+
taskmanager.Applet.requestPreview(indexes, 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
@@ -309,7 +309,6 @@ QHash<int, QByteArray> RoleCombineModel::createRoleNames() const
309309
std::for_each(minorRoleNames.constBegin(), minorRoleNames.constEnd(), [&lastRole, &roleNames, this](auto &roleName) {
310310
roleNames.insert(++lastRole, roleName);
311311
});
312-
313312
return roleNames;
314313
}
315314

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 11 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,12 @@ TaskManager::TaskManager(QObject *parent)
7272
, AbstractTaskManagerInterface(nullptr)
7373
, m_windowFullscreen(false)
7474
{
75-
qRegisterMetaType<ObjectInterfaceMap>();
76-
qDBusRegisterMetaType<ObjectInterfaceMap>();
77-
qRegisterMetaType<ObjectMap>();
78-
qDBusRegisterMetaType<ObjectMap>();
79-
qDBusRegisterMetaType<QStringMap>();
80-
qRegisterMetaType<QStringMap>();
81-
qRegisterMetaType<PropMap>();
82-
qDBusRegisterMetaType<PropMap>();
83-
qDBusRegisterMetaType<QDBusObjectPath>();
84-
8575
connect(Settings, &TaskManagerSettings::allowedForceQuitChanged, this, &TaskManager::allowedForceQuitChanged);
8676
connect(Settings, &TaskManagerSettings::windowSplitChanged, this, &TaskManager::windowSplitChanged);
8777
}
8878

8979
bool TaskManager::load()
9080
{
91-
loadDockedAppItems();
9281
auto platformName = QGuiApplication::platformName();
9382
if (QStringLiteral("wayland") == platformName) {
9483
m_windowMonitor.reset(new TreeLandWindowMonitor());
@@ -145,9 +134,6 @@ bool TaskManager::init()
145134
m_itemModel = new DockItemModel(m_dockGlobalElementModel, this);
146135
}
147136

148-
if (m_windowMonitor)
149-
m_windowMonitor->start();
150-
151137
connect(m_windowMonitor.data(), &AbstractWindowMonitor::windowFullscreenChanged, this, [this] (bool isFullscreen) {
152138
m_windowFullscreen = isFullscreen;
153139
emit windowFullscreenChanged(isFullscreen);
@@ -160,12 +146,17 @@ bool TaskManager::init()
160146
modifyOpacityChanged();
161147
connect(appearanceApplet, SIGNAL(opacityChanged()), this, SLOT(modifyOpacityChanged()));
162148
}
149+
QTimer::singleShot(500, [this]() {
150+
if (m_windowMonitor)
151+
m_windowMonitor->start();
152+
});
153+
163154
return true;
164155
}
165156

166-
ItemModel *TaskManager::dataModel()
157+
DockItemModel *TaskManager::dataModel() const
167158
{
168-
return ItemModel::instance();
159+
return m_itemModel;
169160
}
170161

171162
void TaskManager::requestActivate(const QModelIndex &index) const
@@ -249,46 +240,13 @@ void TaskManager::handleWindowAdded(QPointer<AbstractWindow> window)
249240
ItemModel::instance()->addItem(appitem);
250241
}
251242

252-
void TaskManager::clickItem(const QString& itemId, const QString& menuId)
253-
{
254-
auto item = ItemModel::instance()->getItemById(itemId);
255-
if(!item) return;
256-
257-
if (menuId == DOCK_ACTION_ALLWINDOW) {
258-
QList<uint32_t> windowIds;
259-
auto windows = item->data().toStringList();
260-
std::transform(windows.begin(), windows.end(), std::back_inserter(windowIds), [](const QString &windowId) {
261-
return windowId.toUInt();
262-
});
263-
264-
m_windowMonitor->presentWindows(windowIds);
265-
return;
266-
}
267-
268-
item->handleClick(menuId);
269-
}
270-
271243
void TaskManager::dropFilesOnItem(const QString& itemId, const QStringList& urls)
272244
{
273-
auto item = ItemModel::instance()->getItemById(itemId);
274-
if(!item) return;
245+
qWarning() << "TODO: this is legacy code from rebasing, this need to be implemented elsewhere";
246+
// auto item = ItemModel::instance()->getItemById(itemId);
247+
// if(!item) return;
275248

276-
item->handleFileDrop(urls);
277-
}
278-
279-
void TaskManager::showItemPreview(const QString &itemId, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction)
280-
{
281-
auto item = ItemModel::instance()->getItemById(itemId).get();
282-
if (!item) {
283-
return;
284-
}
285-
286-
QPointer<AppItem> pItem = reinterpret_cast<AppItem *>(item);
287-
if (pItem.isNull()) {
288-
return;
289-
}
290-
291-
m_windowMonitor->showItemPreview(pItem, relativePositionItem, previewXoffset, previewYoffset, direction);
249+
// item->handleFileDrop(urls);
292250
}
293251

294252
void TaskManager::hideItemPreview()
@@ -306,30 +264,6 @@ void TaskManager::setAppItemWindowIconGeometry(const QString& appid, QObject* re
306264
}
307265
}
308266

309-
void TaskManager::loadDockedAppItems()
310-
{
311-
// TODO: remove this function once migrated to DockItemModel (when dataModel() returns m_itemModel instead of ItemModel::instance())
312-
for (const auto &apps : TaskManagerSettings::instance()->dockedElements()) {
313-
// app names in dockedElements are in format of "desktop/<appid>"
314-
auto appid = apps.split('/').last();
315-
auto desktopfile = DESKTOPFILEFACTORY::createById(appid, "amAPP");
316-
auto valid = desktopfile->isValied();
317-
318-
if (!valid.first) {
319-
qInfo(taskManagerLog()) << "failed to load " << appid << " beacause " << valid.second;
320-
continue;
321-
}
322-
323-
auto appitem = desktopfile->getAppItem();
324-
if (appitem.isNull()) {
325-
appitem = new AppItem(appid);
326-
}
327-
328-
appitem->setDesktopFileParser(desktopfile);
329-
ItemModel::instance()->addItem(appitem);
330-
}
331-
}
332-
333267
bool TaskManager::allowForceQuit()
334268
{
335269
return Settings->isAllowedForceQuit();

0 commit comments

Comments
 (0)