Skip to content

Commit d19a40d

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

File tree

8 files changed

+107
-99
lines changed

8 files changed

+107
-99
lines changed

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: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,17 @@ ContainmentItem {
5050
return targetIndex
5151
}
5252

53+
// Helper function to find the current index of an app by its appId in the visualModel
54+
function findAppIndex(appId) {
55+
for (let i = 0; i < visualModel.items.count; i++) {
56+
const item = visualModel.items.get(i);
57+
if (item.model.itemId === appId) {
58+
return item.itemsIndex
59+
}
60+
}
61+
return -1
62+
}
63+
5364
OverflowContainer {
5465
id: appContainer
5566
anchors.fill: parent
@@ -177,7 +188,10 @@ ContainmentItem {
177188
let dragPosition = Qt.point(drag.x, drag.y)
178189
let targetIndex = taskmanager.findTargetIndexByPosition(dragPosition)
179190
let appId = taskmanager.Applet.desktopIdToAppId(launcherDndDesktopId)
180-
taskmanager.Applet.dataModel.moveTo(appId, targetIndex)
191+
let currentIndex = taskmanager.findAppIndex(appId)
192+
if (currentIndex !== -1 && currentIndex !== targetIndex && targetIndex < visualModel.items.count) {
193+
visualModel.items.move(currentIndex, targetIndex)
194+
}
181195
}
182196

183197
onDropped: function(drop) {
@@ -186,7 +200,15 @@ ContainmentItem {
186200
let dropPosition = Qt.point(drop.x, drop.y)
187201
let targetIndex = taskmanager.findTargetIndexByPosition(dropPosition)
188202
let appId = taskmanager.Applet.desktopIdToAppId(launcherDndDesktopId)
189-
taskmanager.Applet.dataModel.moveTo(appId, targetIndex)
203+
let currentIndex = taskmanager.findAppIndex(appId)
204+
if (currentIndex !== -1 && currentIndex !== targetIndex && targetIndex < visualModel.items.count) {
205+
visualModel.items.move(currentIndex, targetIndex)
206+
}
207+
let appIds = []
208+
for (let i = 0; i < visualModel.items.count; i++) {
209+
appIds.push(visualModel.items.get(i).model.itemId)
210+
}
211+
taskmanager.Applet.saveDockElementsOrder(appIds)
190212
resetDndState()
191213
}
192214

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: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
4444
m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool();
4545
Q_EMIT windowSplitChanged();
4646
} else if (TASKMANAGER_DOCKEDITEMS_KEY == key) {
47-
loadDockedItems();
48-
Q_EMIT dockedItemsChanged();
49-
Q_EMIT dockedElementsChanged();
47+
qDebug() << "TASKMANAGER_DOCKEDITEMS_KEY is deprecated, please use TASKMANAGER_DOCKEDELEMENTS_KEY instead";
5048
} else if (TASKMANAGER_DOCKEDELEMENTS_KEY == key) {
5149
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
5250
Q_EMIT dockedElementsChanged();
@@ -56,7 +54,8 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
5654
m_allowForceQuit = enableStr2Bool(m_taskManagerDconfig->value(TASKMANAGER_ALLOWFOCEQUIT_KEY).toString());
5755
m_windowSplit = m_taskManagerDconfig->value(TASKMANAGER_WINDOWSPLIT_KEY).toBool();
5856
m_dockedElements = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDELEMENTS_KEY, {}).toStringList();
59-
loadDockedItems();
57+
migrateFromDockedItems();
58+
Q_EMIT dockedElementsChanged();
6059
}
6160

6261
bool TaskManagerSettings::isAllowedForceQuit()
@@ -81,33 +80,24 @@ void TaskManagerSettings::setWindowSplit(bool split)
8180
m_taskManagerDconfig->setValue(TASKMANAGER_WINDOWSPLIT_KEY, m_windowSplit);
8281
}
8382

84-
QStringList TaskManagerSettings::dockedElements()
83+
QStringList TaskManagerSettings::dockedElements() const
8584
{
8685
return m_dockedElements;
8786
}
8887

89-
void TaskManagerSettings::dockedItemsPersisted()
88+
// elementId is like "desktop/sample.app.id"
89+
bool TaskManagerSettings::isDocked(const QString &elementId) const
9090
{
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);
91+
return m_dockedElements.contains(elementId);
10792
}
10893

109-
void TaskManagerSettings::loadDockedItems()
94+
void TaskManagerSettings::migrateFromDockedItems()
11095
{
96+
if (!m_dockedElements.isEmpty()) {
97+
qDebug() << "Already migrated from TASKMANAGER_DOCKEDITEMS_KEY to TASKMANAGER_DOCKEDELEMENTS_KEY";
98+
return;
99+
}
100+
111101
while (!m_dockedItems.isEmpty()) m_dockedItems.removeLast();
112102

113103
auto dcokedDesktopFilesStrList = m_taskManagerDconfig->value(TASKMANAGER_DOCKEDITEMS_KEY).toStringList();
@@ -130,45 +120,55 @@ void TaskManagerSettings::loadDockedItems()
130120
}
131121

132122
// 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-
}
123+
if (!m_dockedItems.isEmpty()) {
124+
m_dockedElements = toDockedElementsStrings(m_dockedItems);
125+
}
126+
}
127+
128+
QStringList TaskManagerSettings::toDockedElementsStrings(const QJsonArray &items) const
129+
{
130+
QStringList list;
131+
for (auto item : items) {
132+
if (!item.isObject()) {
133+
continue;
134+
}
135+
auto itemObj = item.toObject();
136+
if (itemObj.contains(QStringLiteral("id")) && itemObj.contains(QStringLiteral("type"))) {
137+
list << toDockedElementsString(itemObj);
142138
}
143139
}
140+
return list;
144141
}
145142

146-
void TaskManagerSettings::setDockedDesktopFiles(QJsonArray items)
143+
QString TaskManagerSettings::toDockedElementsString(const QJsonObject &item) const
147144
{
148-
m_dockedItems = items;
149-
dockedItemsPersisted();
145+
return QStringLiteral("desktop/%1").arg(item[QStringLiteral("id")].toString());
150146
}
151147

152-
void TaskManagerSettings::appnedDockedDesktopfiles(QJsonObject item)
148+
void TaskManagerSettings::saveDockedElements()
153149
{
154-
m_dockedItems.append(item);
155-
dockedItemsPersisted();
150+
m_taskManagerDconfig->setValue(TASKMANAGER_DOCKEDELEMENTS_KEY, m_dockedElements);
156151
}
157152

158-
void TaskManagerSettings::removeDockedDesktopfile(QJsonObject desktopfile)
153+
void TaskManagerSettings::setDockedElements(const QStringList &elements)
159154
{
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();
155+
m_dockedElements = elements;
156+
Q_EMIT dockedElementsChanged();
157+
saveDockedElements();
158+
}
159+
160+
void TaskManagerSettings::appendDockedElements(const QString &element)
161+
{
162+
m_dockedElements.append(element);
163+
Q_EMIT dockedElementsChanged();
164+
saveDockedElements();
167165
}
168166

169-
QJsonArray TaskManagerSettings::dockedDesktopFiles()
167+
void TaskManagerSettings::removeDockedElements(const QString &element)
170168
{
171-
return m_dockedItems;
169+
m_dockedElements.removeAll(element);
170+
Q_EMIT dockedElementsChanged();
171+
saveDockedElements();
172172
}
173173

174174
}

panels/dock/taskmanager/taskmanagersettings.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,18 @@ 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 QStringList toDockedElementsStrings(const QJsonArray &items) const;
42+
inline QString toDockedElementsString(const QJsonObject &item) const;
43+
inline void saveDockedElements();
4244

4345
Q_SIGNALS:
4446
void allowedForceQuitChanged();

0 commit comments

Comments
 (0)