Skip to content

Commit d84eb17

Browse files
committed
refactor: migrated docked items config to TASKMANAGER_DOCKEDELEMENTS_KEY
使 ItemModel 使用新的任务栏驻留配置,并确保任务栏驻留顺序的保存位置也使用 新的任务栏驻留配置. 此提交旨在进一步与 ItemModel 解耦,便于后续模型切换重构分支的合入. Log:
1 parent 3f4b017 commit d84eb17

File tree

9 files changed

+95
-124
lines changed

9 files changed

+95
-124
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
"serial": 0,
3939
"flags": [],
4040
"name": "Docked_Items",
41-
"name[zh_CN]": "已固定项目",
42-
"description": "The default apps which is docked when dock is started.",
41+
"name[zh_CN]": "已固定项目(已弃用)",
42+
"description": "`Docked_Items` is deprecated, please use `dockedElements` instead",
4343
"permissions": "readwrite",
4444
"visibility": "private"
4545
},

panels/dock/taskmanager/desktopfileabstractparser.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,7 @@ bool DesktopfileAbstractParser::isDocked()
134134
return false;
135135
}
136136

137-
QJsonObject desktopfile;
138-
desktopfile["type"] = type();
139-
desktopfile["id"] = id();
140-
return TaskManagerSettings::instance()->dockedDesktopFiles().contains(desktopfile);
137+
return TaskManagerSettings::instance()->isDocked(QStringLiteral("desktop/%1").arg(id()));
141138
}
142139

143140
void DesktopfileAbstractParser::setDocked(bool docked)
@@ -147,14 +144,12 @@ void DesktopfileAbstractParser::setDocked(bool docked)
147144
return;
148145
}
149146

150-
QJsonObject desktopfile;
151-
desktopfile["type"] = type();
152-
desktopfile["id"] = id();
147+
auto desktopElement = QStringLiteral("desktop/%1").arg(id());
153148

154149
if (docked) {
155-
TaskManagerSettings::instance()->appnedDockedDesktopfiles(desktopfile);
150+
TaskManagerSettings::instance()->appendDockedElements(desktopElement);
156151
} else {
157-
TaskManagerSettings::instance()->removeDockedDesktopfile(desktopfile);
152+
TaskManagerSettings::instance()->removeDockedElements(desktopElement);
158153
}
159154

160155
Q_EMIT dockedChanged();

panels/dock/taskmanager/itemmodel.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -72,29 +72,6 @@ QVariant ItemModel::data(const QModelIndex &index, int role) const
7272
return QVariant();
7373
}
7474

75-
void ItemModel::moveTo(const QString &id, int dIndex)
76-
{
77-
// simply do nothing if dIndex is invalid
78-
if (dIndex >= m_items.size() || dIndex < 0) {
79-
return;
80-
}
81-
82-
auto sItem = getItemById(id);
83-
auto dItem = m_items.at(dIndex);
84-
85-
int sIndex = m_items.indexOf(sItem);
86-
if (sIndex == dIndex) {
87-
return;
88-
}
89-
beginMoveRows(QModelIndex(), sIndex, sIndex, QModelIndex(), dIndex > sIndex ? (dIndex + 1) : dIndex);
90-
m_items.move(sIndex, dIndex);
91-
endMoveRows();
92-
93-
if (sItem->isDocked() || dItem->isDocked()) {
94-
TaskManagerSettings::instance()->setDockedDesktopFiles(dumpDockedItems());
95-
}
96-
}
97-
9875
QJsonArray ItemModel::dumpDockedItems() const
9976
{
10077
QJsonArray result;

panels/dock/taskmanager/itemmodel.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class ItemModel : public QAbstractListModel
3131
static ItemModel* instance();
3232
Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
3333
Q_INVOKABLE QVariant data(const QModelIndex &index, int role = ItemIdRole) const Q_DECL_OVERRIDE;
34-
Q_INVOKABLE void moveTo(const QString &id, int index);
3534

3635
QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
3736

panels/dock/taskmanager/package/TaskManager.qml

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,15 @@ ContainmentItem {
3333
implicitWidth: useColumnLayout ? Panel.rootObject.dockSize : (Math.min(remainingSpacesForTaskManager, appContainer.implicitWidth) + forceRelayoutWorkaround)
3434
implicitHeight: useColumnLayout ? (Math.min(remainingSpacesForTaskManager, appContainer.implicitHeight) + forceRelayoutWorkaround) : Panel.rootObject.dockSize
3535

36-
// Find target index by position using ListView's built-in indexAt method instead of relying on fixed width
37-
function findTargetIndexByPosition(dragPosition) {
38-
if (!appContainer || !appContainer.model || appContainer.model.count === 0) {
39-
return 0
40-
}
41-
42-
// Use ListView's built-in indexAt method
43-
let targetIndex = appContainer.indexAt(dragPosition.x, dragPosition.y)
44-
45-
// If no valid index found, return end position
46-
if (targetIndex === -1) {
47-
return appContainer.model.count
36+
// Helper function to find the current index of an app by its appId in the visualModel
37+
function findAppIndex(appId) {
38+
for (let i = 0; i < visualModel.items.count; i++) {
39+
const item = visualModel.items.get(i);
40+
if (item.model.itemId === appId) {
41+
return item.itemsIndex
42+
}
4843
}
49-
50-
return targetIndex
44+
return -1
5145
}
5246

5347
OverflowContainer {
@@ -174,19 +168,28 @@ ContainmentItem {
174168

175169
onPositionChanged: function(drag) {
176170
if (launcherDndDesktopId === "") return
177-
let dragPosition = Qt.point(drag.x, drag.y)
178-
let targetIndex = taskmanager.findTargetIndexByPosition(dragPosition)
171+
let targetIndex = appContainer.indexAt(drag.x, drag.y)
179172
let appId = taskmanager.Applet.desktopIdToAppId(launcherDndDesktopId)
180-
taskmanager.Applet.dataModel.moveTo(appId, targetIndex)
173+
let currentIndex = taskmanager.findAppIndex(appId)
174+
if (currentIndex !== -1 && targetIndex !== -1 && currentIndex !== targetIndex) {
175+
visualModel.items.move(currentIndex, targetIndex)
176+
}
181177
}
182178

183179
onDropped: function(drop) {
184180
Panel.contextDragging = false
185181
if (launcherDndDesktopId === "") return
186-
let dropPosition = Qt.point(drop.x, drop.y)
187-
let targetIndex = taskmanager.findTargetIndexByPosition(dropPosition)
182+
let targetIndex = appContainer.indexAt(drop.x, drop.y)
188183
let appId = taskmanager.Applet.desktopIdToAppId(launcherDndDesktopId)
189-
taskmanager.Applet.dataModel.moveTo(appId, targetIndex)
184+
let currentIndex = taskmanager.findAppIndex(appId)
185+
if (currentIndex !== -1 && targetIndex !== -1 && currentIndex !== targetIndex) {
186+
visualModel.items.move(currentIndex, targetIndex)
187+
}
188+
let appIds = []
189+
for (let i = 0; i < visualModel.items.count; i++) {
190+
appIds.push(visualModel.items.get(i).model.itemId)
191+
}
192+
taskmanager.Applet.saveDockElementsOrder(appIds)
190193
resetDndState()
191194
}
192195

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,17 +223,17 @@ void TaskManager::handleWindowAdded(QPointer<AbstractWindow> window)
223223
QString desktopId;
224224
if (res.size() > 0) {
225225
desktopId = res.first().data(m_activeAppModel->roleNames().key("desktopId")).toString();
226-
qCDebug(taskManagerLog()) << "identify bt model:" << desktopId;
226+
qCDebug(taskManagerLog()) << "identify by model:" << desktopId;
227227
}
228228

229229
if (!desktopId.isEmpty()) {
230230
desktopfile = DESKTOPFILEFACTORY::createById(desktopId, "amAPP");
231-
qCDebug(taskManagerLog()) << "identify bt AM:" << desktopId;
231+
qCDebug(taskManagerLog()) << "identify by AM:" << desktopId;
232232
}
233233

234234
if (desktopfile.isNull() || !desktopfile->isValied().first) {
235235
desktopfile = DESKTOPFILEFACTORY::createByWindow(window);
236-
qCDebug(taskManagerLog()) << "identify bt Fallback:" << desktopId;
236+
qCDebug(taskManagerLog()) << "identify by Fallback:" << desktopId;
237237
}
238238

239239
auto appitem = desktopfile->getAppItem();
@@ -308,12 +308,11 @@ void TaskManager::setAppItemWindowIconGeometry(const QString& appid, QObject* re
308308

309309
void TaskManager::loadDockedAppItems()
310310
{
311-
// TODO: add support for group and dir type
312-
for (const auto& appValueRef : TaskManagerSettings::instance()->dockedDesktopFiles()) {
313-
auto app = appValueRef.toObject();
314-
auto appid = app.value("id").toString();
315-
auto type = app.value("type").toString();
316-
auto desktopfile = DESKTOPFILEFACTORY::createById(appid, type);
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");
317316
auto valid = desktopfile->isValied();
318317

319318
if (!valid.first) {
@@ -431,6 +430,19 @@ void TaskManager::activateWindow(uint32_t windowID)
431430
#endif
432431
}
433432

433+
void TaskManager::saveDockElementsOrder(const QStringList &appIds)
434+
{
435+
const QStringList &dockedElements = TaskManagerSettings::instance()->dockedElements();
436+
QStringList newDockedElements;
437+
for (const auto &appId : appIds) {
438+
auto desktopElement = QString("desktop/%1").arg(appId);
439+
if (dockedElements.contains(desktopElement) && !newDockedElements.contains(desktopElement)) {
440+
newDockedElements.append(desktopElement);
441+
}
442+
}
443+
TaskManagerSettings::instance()->setDockedElements(newDockedElements);
444+
}
445+
434446
void TaskManager::modifyOpacityChanged()
435447
{
436448
DS_NAMESPACE::DAppletBridge appearanceBridge("org.deepin.ds.dde-appearance");

panels/dock/taskmanager/taskmanager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class TaskManager : public DS_NAMESPACE::DContainment, public AbstractTaskManage
9999

100100
Q_INVOKABLE void setAppItemWindowIconGeometry(const QString& appid, QObject* relativePositionItem, const int& x1, const int& y1, const int& x2, const int& y2);
101101
Q_INVOKABLE void activateWindow(uint32_t windowID);
102+
Q_INVOKABLE void saveDockElementsOrder(const QStringList &appIds);
102103

103104
Q_SIGNALS:
104105
void dataModelChanged();

panels/dock/taskmanager/taskmanagersettings.cpp

Lines changed: 37 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
4343
} else if (TASKMANAGER_WINDOWSPLIT_KEY == key) {
4444
m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool();
4545
Q_EMIT windowSplitChanged();
46-
} else if (TASKMANAGER_DOCKEDITEMS_KEY == key) {
47-
loadDockedItems();
48-
Q_EMIT dockedItemsChanged();
49-
Q_EMIT dockedElementsChanged();
5046
} else if (TASKMANAGER_DOCKEDELEMENTS_KEY == key) {
5147
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
5248
Q_EMIT dockedElementsChanged();
@@ -56,7 +52,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
5652
m_allowForceQuit = enableStr2Bool(m_taskManagerDconfig->value(TASKMANAGER_ALLOWFOCEQUIT_KEY).toString());
5753
m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool();
5854
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
59-
loadDockedItems();
55+
migrateFromDockedItems();
6056
}
6157

6258
bool TaskManagerSettings::isAllowedForceQuit()
@@ -81,34 +77,28 @@ void TaskManagerSettings::setWindowSplit(bool split)
8177
m_taskManagerDconfig->setValue(TASKMANAGER_WINDOWSPLIT_KEY, m_windowSplit);
8278
}
8379

84-
QStringList TaskManagerSettings::dockedElements()
80+
QStringList TaskManagerSettings::dockedElements() const
8581
{
8682
return m_dockedElements;
8783
}
8884

89-
void TaskManagerSettings::dockedItemsPersisted()
85+
// elementId is like "desktop/sample.app.id"
86+
bool TaskManagerSettings::isDocked(const QString &elementId) const
9087
{
91-
QStringList list;
92-
93-
for (auto dockedDesktopFile : m_dockedItems) {
94-
if (!dockedDesktopFile.isObject()) {
95-
continue;
96-
}
97-
YAML::Node node;
98-
auto dockedDesktopFileObj = dockedDesktopFile.toObject();
99-
for (auto key : dockedDesktopFileObj.keys()) {
100-
node[key.toStdString()] = dockedDesktopFileObj[key].toString().toStdString();
101-
}
102-
auto str = QString::fromStdString(YAML::Dump(node));
103-
list << str.replace("\n",",");
104-
}
105-
106-
m_taskManagerDconfig->setValue(TASKMANAGER_DOCKEDITEMS_KEY, list);
88+
return m_dockedElements.contains(elementId);
10789
}
10890

109-
void TaskManagerSettings::loadDockedItems()
91+
void TaskManagerSettings::migrateFromDockedItems()
11092
{
111-
while (!m_dockedItems.isEmpty()) m_dockedItems.removeLast();
93+
if (m_taskManagerDconfig->isDefaultValue(TASKMANAGER_DOCKEDITEMS_KEY)) {
94+
qDebug() << "Won't do migration since TASKMANAGER_DOCKEDITEMS_KEY is default value";
95+
return;
96+
} else if (!m_taskManagerDconfig->isDefaultValue(TASKMANAGER_DOCKEDELEMENTS_KEY)) {
97+
qDebug() << "Won't do migration since TASKMANAGER_DOCKEDELEMENTS_KEY is not default value";
98+
return;
99+
}
100+
101+
QJsonArray legacyDockedItems;
112102

113103
auto dcokedDesktopFilesStrList = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDITEMS_KEY).toStringList();
114104
foreach(auto dcokedDesktopFilesStr, dcokedDesktopFilesStrList) {
@@ -126,49 +116,44 @@ void TaskManagerSettings::loadDockedItems()
126116
auto value = it->second.as<std::string>();
127117
dockedItem[QString::fromStdString(key)] = QString::fromStdString(value);
128118
}
129-
m_dockedItems.append(dockedItem);
119+
legacyDockedItems.append(dockedItem);
130120
}
131121

132-
// Migrate data under the new dconfig setting entry
133-
if (!m_dockedItems.isEmpty() && m_dockedElements.isEmpty()) {
134-
for (auto dockedDesktopFile : m_dockedItems) {
135-
if (!dockedDesktopFile.isObject()) {
136-
continue;
137-
}
138-
auto dockedDesktopFileObj = dockedDesktopFile.toObject();
139-
if (dockedDesktopFileObj.contains(QStringLiteral("id")) && dockedDesktopFileObj.contains(QStringLiteral("type"))) {
140-
m_dockedElements.append(QStringLiteral("desktop/%1").arg(dockedDesktopFileObj[QStringLiteral("id")].toString()));
141-
}
122+
for (auto dockedDesktopFile : std::as_const(legacyDockedItems)) {
123+
if (!dockedDesktopFile.isObject()) {
124+
continue;
125+
}
126+
auto dockedDesktopFileObj = dockedDesktopFile.toObject();
127+
if (dockedDesktopFileObj.contains(QStringLiteral("id")) && dockedDesktopFileObj.contains(QStringLiteral("type"))) {
128+
m_dockedElements.append(QStringLiteral("desktop/%1").arg(dockedDesktopFileObj[QStringLiteral("id")].toString()));
142129
}
143130
}
144131
}
145132

146-
void TaskManagerSettings::setDockedDesktopFiles(QJsonArray items)
133+
void TaskManagerSettings::saveDockedElements()
147134
{
148-
m_dockedItems = items;
149-
dockedItemsPersisted();
135+
m_taskManagerDconfig->setValue(TASKMANAGER_DOCKEDELEMENTS_KEY, m_dockedElements);
150136
}
151137

152-
void TaskManagerSettings::appnedDockedDesktopfiles(QJsonObject item)
138+
void TaskManagerSettings::setDockedElements(const QStringList &elements)
153139
{
154-
m_dockedItems.append(item);
155-
dockedItemsPersisted();
140+
m_dockedElements = elements;
141+
Q_EMIT dockedElementsChanged();
142+
saveDockedElements();
156143
}
157144

158-
void TaskManagerSettings::removeDockedDesktopfile(QJsonObject desktopfile)
145+
void TaskManagerSettings::appendDockedElements(const QString &element)
159146
{
160-
for (int i = 0; i < m_dockedItems.count(); i++) {
161-
if (m_dockedItems.at(i) == desktopfile) {
162-
m_dockedItems.removeAt(i);
163-
break;
164-
}
165-
}
166-
dockedItemsPersisted();
147+
m_dockedElements.append(element);
148+
Q_EMIT dockedElementsChanged();
149+
saveDockedElements();
167150
}
168151

169-
QJsonArray TaskManagerSettings::dockedDesktopFiles()
152+
void TaskManagerSettings::removeDockedElements(const QString &element)
170153
{
171-
return m_dockedItems;
154+
m_dockedElements.removeAll(element);
155+
Q_EMIT dockedElementsChanged();
156+
saveDockedElements();
172157
}
173158

174159
}

panels/dock/taskmanager/taskmanagersettings.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ class TaskManagerSettings : public QObject
2929
bool isWindowSplit();
3030
void setWindowSplit(bool split);
3131

32-
void setDockedDesktopFiles(QJsonArray desktopfiles);
33-
void appnedDockedDesktopfiles(QJsonObject desktopfile);
34-
void removeDockedDesktopfile(QJsonObject desktopfile);
35-
QJsonArray dockedDesktopFiles();
36-
QStringList dockedElements();
32+
void setDockedElements(const QStringList &elements);
33+
void appendDockedElements(const QString &element);
34+
void removeDockedElements(const QString &element);
35+
QStringList dockedElements() const;
36+
bool isDocked(const QString &elementId) const;
3737

3838
private:
3939
explicit TaskManagerSettings(QObject *parent = nullptr);
40-
inline void dockedItemsPersisted();
41-
inline void loadDockedItems();
40+
inline void migrateFromDockedItems();
41+
inline void saveDockedElements();
4242

4343
Q_SIGNALS:
4444
void allowedForceQuitChanged();
@@ -51,7 +51,6 @@ class TaskManagerSettings : public QObject
5151

5252
bool m_allowForceQuit;
5353
bool m_windowSplit;
54-
QJsonArray m_dockedItems;
5554
QStringList m_dockedElements;
5655
};
5756
}

0 commit comments

Comments
 (0)