mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-06 05:25:41 -05:00
201 lines
6.9 KiB
QML
201 lines
6.9 KiB
QML
pragma Singleton
|
|
pragma ComponentBehavior: Bound
|
|
|
|
import QtCore
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
|
|
Singleton {
|
|
id: root
|
|
|
|
readonly property int cacheConfigVersion: 1
|
|
|
|
readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true"
|
|
|
|
readonly property string _stateUrl: StandardPaths.writableLocation(StandardPaths.GenericCacheLocation)
|
|
readonly property string _stateDir: Paths.strip(_stateUrl)
|
|
|
|
property bool _loading: false
|
|
|
|
property string wallpaperLastPath: ""
|
|
property string profileLastPath: ""
|
|
|
|
property var fileBrowserSettings: ({
|
|
"wallpaper": {
|
|
"lastPath": "",
|
|
"viewMode": "grid",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
},
|
|
"profile": {
|
|
"lastPath": "",
|
|
"viewMode": "grid",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
},
|
|
"notepad_save": {
|
|
"lastPath": "",
|
|
"viewMode": "list",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
},
|
|
"notepad_load": {
|
|
"lastPath": "",
|
|
"viewMode": "list",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
},
|
|
"generic": {
|
|
"lastPath": "",
|
|
"viewMode": "list",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
},
|
|
"default": {
|
|
"lastPath": "",
|
|
"viewMode": "list",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
}
|
|
})
|
|
|
|
Component.onCompleted: {
|
|
if (!isGreeterMode) {
|
|
loadCache();
|
|
}
|
|
}
|
|
|
|
function loadCache() {
|
|
_loading = true;
|
|
parseCache(cacheFile.text());
|
|
_loading = false;
|
|
}
|
|
|
|
function parseCache(content) {
|
|
_loading = true;
|
|
try {
|
|
if (content && content.trim()) {
|
|
const cache = JSON.parse(content);
|
|
|
|
wallpaperLastPath = cache.wallpaperLastPath !== undefined ? cache.wallpaperLastPath : "";
|
|
profileLastPath = cache.profileLastPath !== undefined ? cache.profileLastPath : "";
|
|
|
|
if (cache.fileBrowserSettings !== undefined) {
|
|
fileBrowserSettings = cache.fileBrowserSettings;
|
|
} else if (cache.fileBrowserViewMode !== undefined) {
|
|
fileBrowserSettings = {
|
|
"wallpaper": {
|
|
"lastPath": cache.wallpaperLastPath || "",
|
|
"viewMode": cache.fileBrowserViewMode || "grid",
|
|
"sortBy": cache.fileBrowserSortBy || "name",
|
|
"sortAscending": cache.fileBrowserSortAscending !== undefined ? cache.fileBrowserSortAscending : true,
|
|
"iconSizeIndex": cache.fileBrowserIconSizeIndex !== undefined ? cache.fileBrowserIconSizeIndex : 1,
|
|
"showSidebar": cache.fileBrowserShowSidebar !== undefined ? cache.fileBrowserShowSidebar : true
|
|
},
|
|
"profile": {
|
|
"lastPath": cache.profileLastPath || "",
|
|
"viewMode": cache.fileBrowserViewMode || "grid",
|
|
"sortBy": cache.fileBrowserSortBy || "name",
|
|
"sortAscending": cache.fileBrowserSortAscending !== undefined ? cache.fileBrowserSortAscending : true,
|
|
"iconSizeIndex": cache.fileBrowserIconSizeIndex !== undefined ? cache.fileBrowserIconSizeIndex : 1,
|
|
"showSidebar": cache.fileBrowserShowSidebar !== undefined ? cache.fileBrowserShowSidebar : true
|
|
},
|
|
"file": {
|
|
"lastPath": "",
|
|
"viewMode": "list",
|
|
"sortBy": "name",
|
|
"sortAscending": true,
|
|
"iconSizeIndex": 1,
|
|
"showSidebar": true
|
|
}
|
|
};
|
|
}
|
|
|
|
if (cache.configVersion === undefined) {
|
|
migrateFromUndefinedToV1(cache);
|
|
cleanupUnusedKeys();
|
|
saveCache();
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.warn("CacheData: Failed to parse cache:", e.message);
|
|
} finally {
|
|
_loading = false;
|
|
}
|
|
}
|
|
|
|
function saveCache() {
|
|
if (_loading)
|
|
return;
|
|
cacheFile.setText(JSON.stringify({
|
|
"wallpaperLastPath": wallpaperLastPath,
|
|
"profileLastPath": profileLastPath,
|
|
"fileBrowserSettings": fileBrowserSettings,
|
|
"configVersion": cacheConfigVersion
|
|
}, null, 2));
|
|
}
|
|
|
|
function migrateFromUndefinedToV1(cache) {
|
|
console.info("CacheData: Migrating configuration from undefined to version 1");
|
|
}
|
|
|
|
function cleanupUnusedKeys() {
|
|
const validKeys = ["wallpaperLastPath", "profileLastPath", "fileBrowserSettings", "configVersion"];
|
|
|
|
try {
|
|
const content = cacheFile.text();
|
|
if (!content || !content.trim())
|
|
return;
|
|
const cache = JSON.parse(content);
|
|
let needsSave = false;
|
|
|
|
for (const key in cache) {
|
|
if (!validKeys.includes(key)) {
|
|
console.log("CacheData: Removing unused key:", key);
|
|
delete cache[key];
|
|
needsSave = true;
|
|
}
|
|
}
|
|
|
|
if (needsSave) {
|
|
cacheFile.setText(JSON.stringify(cache, null, 2));
|
|
}
|
|
} catch (e) {
|
|
console.warn("CacheData: Failed to cleanup unused keys:", e.message);
|
|
}
|
|
}
|
|
|
|
FileView {
|
|
id: cacheFile
|
|
|
|
path: isGreeterMode ? "" : _stateDir + "/DankMaterialShell/cache.json"
|
|
blockLoading: true
|
|
blockWrites: true
|
|
atomicWrites: true
|
|
watchChanges: !isGreeterMode
|
|
onLoaded: {
|
|
if (!isGreeterMode) {
|
|
parseCache(cacheFile.text());
|
|
}
|
|
}
|
|
onLoadFailed: error => {
|
|
if (!isGreeterMode) {
|
|
console.info("CacheData: No cache file found, starting fresh");
|
|
}
|
|
}
|
|
}
|
|
}
|