mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-02 03:28:28 -04:00
fix(imageCache): improve cache management & file handling
This commit is contained in:
@@ -7,17 +7,62 @@ import qs.Common
|
|||||||
Singleton {
|
Singleton {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
|
// Filenames present on disk, so CachingImage never points an Image at a
|
||||||
|
// missing cache file (Qt logs that as a "Cannot open" warning).
|
||||||
|
property var cachedFiles: ({})
|
||||||
|
|
||||||
|
Component.onCompleted: scan()
|
||||||
|
|
||||||
|
function scan() {
|
||||||
|
Proc.runCommand("imagecache_scan", ["ls", "-1", Paths.stringify(Paths.imagecache)], function (output, exitCode) {
|
||||||
|
const map = {};
|
||||||
|
if (exitCode === 0 && output) {
|
||||||
|
const lines = output.split("\n");
|
||||||
|
for (var i = 0; i < lines.length; i++) {
|
||||||
|
const name = lines[i].trim();
|
||||||
|
if (name)
|
||||||
|
map[name] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root.cachedFiles = map;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasCachedFile(name) {
|
||||||
|
return name ? root.cachedFiles[name] === true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function recordCachedFile(name) {
|
||||||
|
if (name)
|
||||||
|
root.cachedFiles[name] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function forgetCachedFile(name) {
|
||||||
|
if (name && root.cachedFiles[name] !== undefined)
|
||||||
|
delete root.cachedFiles[name];
|
||||||
|
}
|
||||||
|
|
||||||
function clearImageCache() {
|
function clearImageCache() {
|
||||||
Quickshell.execDetached(["rm", "-rf", Paths.stringify(Paths.imagecache)]);
|
Quickshell.execDetached(["rm", "-rf", Paths.stringify(Paths.imagecache)]);
|
||||||
Paths.mkdir(Paths.imagecache);
|
Paths.mkdir(Paths.imagecache);
|
||||||
|
root.cachedFiles = ({});
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearOldCache(ageInMinutes) {
|
function clearOldCache(ageInMinutes) {
|
||||||
Quickshell.execDetached(["find", Paths.stringify(Paths.imagecache), "-name", "*.png", "-mmin", `+${ageInMinutes}`, "-delete"]);
|
// Rescan on delete completion since we can't know which files matched.
|
||||||
|
Proc.runCommand("imagecache_prune", ["find", Paths.stringify(Paths.imagecache), "-name", "*.png", "-mmin", `+${ageInMinutes}`, "-delete"], function (output, exitCode) {
|
||||||
|
root.scan();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function clearCacheForSize(size) {
|
function clearCacheForSize(size) {
|
||||||
Quickshell.execDetached(["find", Paths.stringify(Paths.imagecache), "-name", `*@${size}x${size}.png`, "-delete"]);
|
Quickshell.execDetached(["find", Paths.stringify(Paths.imagecache), "-name", `*@${size}x${size}.png`, "-delete"]);
|
||||||
|
const suffix = `@${size}x${size}.png`;
|
||||||
|
const map = {};
|
||||||
|
for (const key in root.cachedFiles)
|
||||||
|
if (!key.endsWith(suffix))
|
||||||
|
map[key] = true;
|
||||||
|
root.cachedFiles = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCacheSize(callback) {
|
function getCacheSize(callback) {
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
readonly property string imageHash: normalizedPath ? djb2Hash(normalizedPath) : ""
|
readonly property string imageHash: normalizedPath ? djb2Hash(normalizedPath) : ""
|
||||||
readonly property string cachePath: imageHash && !isRemoteUrl && !isAnimated ? `${Paths.stringify(Paths.imagecache)}/${imageHash}@${maxCacheSize}x${maxCacheSize}.png` : ""
|
readonly property string cacheFileName: imageHash && !isRemoteUrl && !isAnimated ? `${imageHash}@${maxCacheSize}x${maxCacheSize}.png` : ""
|
||||||
|
readonly property string cachePath: cacheFileName ? `${Paths.stringify(Paths.imagecache)}/${cacheFileName}` : ""
|
||||||
readonly property string encodedImagePath: {
|
readonly property string encodedImagePath: {
|
||||||
if (!normalizedPath)
|
if (!normalizedPath)
|
||||||
return "";
|
return "";
|
||||||
@@ -74,6 +75,7 @@ Item {
|
|||||||
if (!root._fromCache)
|
if (!root._fromCache)
|
||||||
return;
|
return;
|
||||||
root._fromCache = false;
|
root._fromCache = false;
|
||||||
|
CacheUtils.forgetCachedFile(root.cacheFileName);
|
||||||
source = root.encodedImagePath;
|
source = root.encodedImagePath;
|
||||||
return;
|
return;
|
||||||
case Image.Ready:
|
case Image.Ready:
|
||||||
@@ -83,7 +85,11 @@ Item {
|
|||||||
return;
|
return;
|
||||||
Paths.mkdir(Paths.imagecache);
|
Paths.mkdir(Paths.imagecache);
|
||||||
const grabPath = root.cachePath;
|
const grabPath = root.cachePath;
|
||||||
grabToImage(res => res.saveToFile(grabPath));
|
const grabName = root.cacheFileName;
|
||||||
|
grabToImage(res => {
|
||||||
|
if (res.saveToFile(grabPath))
|
||||||
|
CacheUtils.recordCachedFile(grabName);
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +114,13 @@ Item {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Paths.mkdir(Paths.imagecache);
|
Paths.mkdir(Paths.imagecache);
|
||||||
_fromCache = true;
|
// Read cache only when present; else load source and cache it on Ready
|
||||||
staticImg.source = cachePath;
|
if (CacheUtils.hasCachedFile(cacheFileName)) {
|
||||||
|
_fromCache = true;
|
||||||
|
staticImg.source = cachePath;
|
||||||
|
} else {
|
||||||
|
_fromCache = false;
|
||||||
|
staticImg.source = encodedImagePath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user