Skip to content

Commit 784fdaf

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 784fdaf

15 files changed

+299
-274
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

@@ -30,6 +31,57 @@ 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::requestPreview(const QModelIndexList &indexes,
72+
QObject *relativePositionItem,
73+
int32_t previewXoffset,
74+
int32_t previewYoffset,
75+
uint32_t direction) const
76+
{
77+
qDebug() << indexes;
78+
}
79+
80+
void AbstractWindowMonitor::requestWindowsView(const QModelIndexList &indexes) const
81+
{
82+
qDebug() << indexes;
83+
}
84+
3385
QVariant AbstractWindowMonitor::data(const QModelIndex &index, int role) const
3486
{
3587
auto pos = index.row();
@@ -84,10 +136,10 @@ void AbstractWindowMonitor::trackWindow(AbstractWindow* window)
84136
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::WinTitleRole});
85137
});
86138

87-
connect(window, &AbstractWindow::isActiveChanged, this, [this, window]() {
139+
connect(window, &AbstractWindow::stateChanged, this, [this, window]() {
88140
auto pos = m_trackedWindows.indexOf(window);
89141
auto modelIndex = index(pos);
90-
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole});
142+
Q_EMIT dataChanged(modelIndex, modelIndex, {TaskManager::ActiveRole, TaskManager::AttentionRole});
91143
});
92144
connect(window, &AbstractWindow::shouldSkipChanged, this, [this, window]() {
93145
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/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
@@ -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

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 7 additions & 74 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());
@@ -146,9 +135,6 @@ bool TaskManager::init()
146135
m_itemModel = new DockItemModel(m_dockGlobalElementModel, this);
147136
}
148137

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

167-
ItemModel *TaskManager::dataModel()
158+
DockItemModel *TaskManager::dataModel() const
168159
{
169-
return ItemModel::instance();
160+
return m_itemModel;
170161
}
171162

172163
void TaskManager::requestActivate(const QModelIndex &index) const
@@ -250,25 +241,6 @@ void TaskManager::handleWindowAdded(QPointer<AbstractWindow> window)
250241
ItemModel::instance()->addItem(appitem);
251242
}
252243

253-
void TaskManager::clickItem(const QString& itemId, const QString& menuId)
254-
{
255-
auto item = ItemModel::instance()->getItemById(itemId);
256-
if(!item) return;
257-
258-
if (menuId == DOCK_ACTION_ALLWINDOW) {
259-
QList<uint32_t> windowIds;
260-
auto windows = item->data().toStringList();
261-
std::transform(windows.begin(), windows.end(), std::back_inserter(windowIds), [](const QString &windowId) {
262-
return windowId.toUInt();
263-
});
264-
265-
m_windowMonitor->presentWindows(windowIds);
266-
return;
267-
}
268-
269-
item->handleClick(menuId);
270-
}
271-
272244
void TaskManager::dropFilesOnItem(const QString& itemId, const QStringList& urls)
273245
{
274246
auto indexes = m_itemModel->match(m_itemModel->index(0, 0), TaskManager::ItemIdRole, itemId, 1, Qt::MatchExactly);
@@ -284,21 +256,6 @@ void TaskManager::dropFilesOnItem(const QString& itemId, const QStringList& urls
284256
m_itemModel->requestOpenUrls(indexes.first(), urlList);
285257
}
286258

287-
void TaskManager::showItemPreview(const QString &itemId, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction)
288-
{
289-
auto item = ItemModel::instance()->getItemById(itemId).get();
290-
if (!item) {
291-
return;
292-
}
293-
294-
QPointer<AppItem> pItem = reinterpret_cast<AppItem *>(item);
295-
if (pItem.isNull()) {
296-
return;
297-
}
298-
299-
m_windowMonitor->showItemPreview(pItem, relativePositionItem, previewXoffset, previewYoffset, direction);
300-
}
301-
302259
void TaskManager::hideItemPreview()
303260
{
304261
m_windowMonitor->hideItemPreview();
@@ -314,30 +271,6 @@ void TaskManager::setAppItemWindowIconGeometry(const QString& appid, QObject* re
314271
}
315272
}
316273

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

0 commit comments

Comments
 (0)