Skip to content

Commit b8a81b1

Browse files
committed
fix: migrate default dock folders
Migrate existing default dock folder entries to the new model. Preserve user-visible folder behavior after the fashion mode changes.
1 parent 4a7af23 commit b8a81b1

5 files changed

Lines changed: 169 additions & 8 deletions

File tree

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@
9696
"description": "The items which is docked when dock is started.",
9797
"permissions": "readwrite",
9898
"visibility": "private"
99+
},
100+
"defaultDockFoldersMigrationVersion": {
101+
"value": 0,
102+
"serial": 0,
103+
"flags": [],
104+
"name": "defaultDockFoldersMigrationVersion",
105+
"name[zh_CN]": "默认驻留文件夹迁移版本",
106+
"description": "Internal version used to migrate the default dock folders once.",
107+
"permissions": "readwrite",
108+
"visibility": "private"
99109
}
100110
}
101111
}

panels/dock/taskmanager/globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS = "cg
2727
static inline const QString TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES = "cgroupsBasedGroupingSkipCategories";
2828
static inline const QString TASKMANAGER_DOCKEDITEMS_KEY = "Docked_Items";
2929
constexpr auto TASKMANAGER_DOCKEDELEMENTS_KEY = "dockedElements";
30+
constexpr auto TASKMANAGER_DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION_KEY = "defaultDockFoldersMigrationVersion";
3031

3132
// model roleNames
3233
constexpr auto MODEL_WINID = "winId";

panels/dock/taskmanager/taskmanager.cpp

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,48 @@ Q_LOGGING_CATEGORY(taskManagerLog, "org.deepin.dde.shell.dock.taskmanager", QtDe
6363

6464
namespace dock {
6565

66+
static QStringList mergedDockedElementsOrder(const QStringList &currentDockedElements, const QStringList &orderedDockElements)
67+
{
68+
QStringList mergedDockedElements;
69+
for (const QString &dockElement : orderedDockElements) {
70+
if (currentDockedElements.contains(dockElement) && !mergedDockedElements.contains(dockElement)) {
71+
mergedDockedElements.append(dockElement);
72+
}
73+
}
74+
75+
for (int i = 0; i < currentDockedElements.size(); ++i) {
76+
const QString &dockElement = currentDockedElements.at(i);
77+
if (mergedDockedElements.contains(dockElement)) {
78+
continue;
79+
}
80+
81+
int insertIndex = mergedDockedElements.size();
82+
for (int j = i - 1; j >= 0; --j) {
83+
const QString &previousElement = currentDockedElements.at(j);
84+
const int previousIndex = mergedDockedElements.indexOf(previousElement);
85+
if (previousIndex >= 0) {
86+
insertIndex = previousIndex + 1;
87+
break;
88+
}
89+
}
90+
91+
if (insertIndex == mergedDockedElements.size()) {
92+
for (int j = i + 1; j < currentDockedElements.size(); ++j) {
93+
const QString &nextElement = currentDockedElements.at(j);
94+
const int nextIndex = mergedDockedElements.indexOf(nextElement);
95+
if (nextIndex >= 0) {
96+
insertIndex = nextIndex;
97+
break;
98+
}
99+
}
100+
}
101+
102+
mergedDockedElements.insert(insertIndex, dockElement);
103+
}
104+
105+
return mergedDockedElements;
106+
}
107+
66108
// 通过AM(Application Manager)匹配应用程序的辅助函数
67109
static QString getDesktopIdByPid(const QStringList &identifies)
68110
{
@@ -1643,12 +1685,7 @@ void TaskManager::activateWindow(uint32_t windowID)
16431685
void TaskManager::saveDockElementsOrder(const QStringList &dockElements)
16441686
{
16451687
const QStringList &dockedElements = TaskManagerSettings::instance()->dockedElements();
1646-
QStringList newDockedElements;
1647-
for (const auto &dockElement : dockElements) {
1648-
if (dockedElements.contains(dockElement) && !newDockedElements.contains(dockElement)) {
1649-
newDockedElements.append(dockElement);
1650-
}
1651-
}
1688+
const QStringList newDockedElements = mergedDockedElementsOrder(dockedElements, dockElements);
16521689
TaskManagerSettings::instance()->setDockedElements(newDockedElements);
16531690
}
16541691

panels/dock/taskmanager/taskmanagersettings.cpp

Lines changed: 114 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
#include "taskmanagersettings.h"
77

88
#include <QDir>
9-
#include <QStandardPaths>
10-
#include <QJsonObject>
119
#include <QJsonDocument>
10+
#include <QJsonObject>
11+
#include <QSet>
12+
#include <QStandardPaths>
1213

1314
#include <string>
1415

@@ -17,6 +18,24 @@
1718
namespace dock {
1819
namespace {
1920
static const QString DOWNLOADS_PLACEHOLDER = QStringLiteral("folder/$DOWNLOADS");
21+
static const QString APPLICATIONS_FOLDER_DOCK_ELEMENT = QStringLiteral("folder//usr/share/applications");
22+
static constexpr int DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION = 1;
23+
24+
static QStringList stockDesktopDockedElements()
25+
{
26+
return {
27+
QStringLiteral("desktop/dde-file-manager"),
28+
QStringLiteral("desktop/deepin-app-store"),
29+
QStringLiteral("desktop/org.deepin.browser"),
30+
QStringLiteral("desktop/deepin-mail"),
31+
QStringLiteral("desktop/deepin-terminal"),
32+
QStringLiteral("desktop/dde-calendar"),
33+
QStringLiteral("desktop/deepin-music"),
34+
QStringLiteral("desktop/deepin-editor"),
35+
QStringLiteral("desktop/deepin-calculator"),
36+
QStringLiteral("desktop/org.deepin.dde.control-center"),
37+
};
38+
}
2039

2140
static QString resolveDockedElement(const QString &element)
2241
{
@@ -47,6 +66,76 @@ static QStringList resolveDockedElements(const QStringList &elements)
4766

4867
return resolvedElements;
4968
}
69+
70+
static QSet<QString> asSet(const QStringList &elements)
71+
{
72+
QSet<QString> elementSet;
73+
for (const QString &element : elements) {
74+
elementSet.insert(element);
75+
}
76+
77+
return elementSet;
78+
}
79+
80+
static QStringList defaultFolderDockedElements()
81+
{
82+
return resolveDockedElements({DOWNLOADS_PLACEHOLDER, APPLICATIONS_FOLDER_DOCK_ELEMENT});
83+
}
84+
85+
static bool matchesLegacyDefaultDockedLayout(const QStringList &elements)
86+
{
87+
const QSet<QString> expectedDesktopElements = asSet(stockDesktopDockedElements());
88+
const QSet<QString> expectedFolderElements = asSet(defaultFolderDockedElements());
89+
90+
QSet<QString> desktopElements;
91+
QSet<QString> folderElements;
92+
for (const QString &element : elements) {
93+
if (element.startsWith(QStringLiteral("desktop/"))) {
94+
desktopElements.insert(element);
95+
continue;
96+
}
97+
98+
if (element.startsWith(QStringLiteral("folder/"))) {
99+
folderElements.insert(element);
100+
continue;
101+
}
102+
103+
return false;
104+
}
105+
106+
if (desktopElements != expectedDesktopElements) {
107+
return false;
108+
}
109+
110+
for (const QString &folderElement : folderElements) {
111+
if (!expectedFolderElements.contains(folderElement)) {
112+
return false;
113+
}
114+
}
115+
116+
return true;
117+
}
118+
119+
static QStringList mergedWithDefaultDockFolders(const QStringList &elements)
120+
{
121+
QStringList mergedElements = elements;
122+
int insertIndex = mergedElements.indexOf(QStringLiteral("desktop/dde-file-manager"));
123+
if (insertIndex < 0) {
124+
insertIndex = -1;
125+
}
126+
127+
for (const QString &folderElement : defaultFolderDockedElements()) {
128+
const int existingIndex = mergedElements.indexOf(folderElement);
129+
if (existingIndex >= 0) {
130+
insertIndex = existingIndex;
131+
continue;
132+
}
133+
134+
mergedElements.insert(++insertIndex, folderElement);
135+
}
136+
137+
return resolveDockedElements(mergedElements);
138+
}
50139
}
51140

52141
static inline QString bool2EnableStr(bool enable)
@@ -96,6 +185,7 @@ TaskManagerSettings::TaskManagerSettings(QObject *parent)
96185
m_cgroupsBasedGroupingSkipAppIds = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_APPIDS, {"deepin-terminal"}).toStringList();
97186
m_cgroupsBasedGroupingSkipCategories = m_taskManagerDconfig->value(TASKMANAGER_CGROUPS_BASED_GROUPING_SKIP_CATEGORIES, {"TerminalEmulator"}).toStringList();
98187
migrateFromDockedItems();
188+
migrateDefaultDockFolders();
99189
}
100190

101191
bool TaskManagerSettings::isAllowedForceQuit()
@@ -207,6 +297,28 @@ void TaskManagerSettings::migrateFromDockedItems()
207297
}
208298
}
209299

300+
void TaskManagerSettings::migrateDefaultDockFolders()
301+
{
302+
const int migrationVersion = m_taskManagerDconfig->value(TASKMANAGER_DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION_KEY, 0).toInt();
303+
if (migrationVersion >= DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION) {
304+
return;
305+
}
306+
307+
QStringList migratedDockedElements = m_dockedElements;
308+
if (matchesLegacyDefaultDockedLayout(migratedDockedElements)) {
309+
migratedDockedElements = mergedWithDefaultDockFolders(migratedDockedElements);
310+
}
311+
312+
const bool dockedElementsChanged = migratedDockedElements != m_dockedElements;
313+
if (dockedElementsChanged) {
314+
m_dockedElements = migratedDockedElements;
315+
saveDockedElements();
316+
}
317+
318+
m_taskManagerDconfig->setValue(TASKMANAGER_DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION_KEY,
319+
DEFAULT_DOCK_FOLDERS_MIGRATION_VERSION);
320+
}
321+
210322
void TaskManagerSettings::saveDockedElements()
211323
{
212324
m_taskManagerDconfig->setValue(TASKMANAGER_DOCKEDELEMENTS_KEY, m_dockedElements);

panels/dock/taskmanager/taskmanagersettings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class TaskManagerSettings : public QObject
4545
private:
4646
explicit TaskManagerSettings(QObject *parent = nullptr);
4747
inline void migrateFromDockedItems();
48+
inline void migrateDefaultDockFolders();
4849
inline void saveDockedElements();
4950

5051
Q_SIGNALS:

0 commit comments

Comments
 (0)