internal: better caching impl
WARNING: causes blocking when caching image on first load
This commit is contained in:
parent
ca9c06b689
commit
5da1b64da0
5 changed files with 61 additions and 86 deletions
|
|
@ -8,7 +8,7 @@ import QtQuick
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property url source: Wallpapers.current ? `file://${Wallpapers.current}` : ""
|
property string source: Wallpapers.current
|
||||||
property Image current: one
|
property Image current: one
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
@ -32,20 +32,14 @@ Item {
|
||||||
id: img
|
id: img
|
||||||
|
|
||||||
function update(): void {
|
function update(): void {
|
||||||
const srcPath = `${root.source}`.slice(7);
|
if (path === root.source)
|
||||||
if (thumbnail.originalPath === srcPath) {
|
|
||||||
root.current = this;
|
root.current = this;
|
||||||
} else
|
else
|
||||||
path = srcPath;
|
path = root.source;
|
||||||
}
|
}
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
loadOriginal: true
|
|
||||||
asynchronous: true
|
|
||||||
cache: false
|
|
||||||
fillMode: Image.PreserveAspectCrop
|
|
||||||
|
|
||||||
opacity: 0
|
opacity: 0
|
||||||
scale: Wallpapers.showPreview ? 1 : 0.8
|
scale: Wallpapers.showPreview ? 1 : 0.8
|
||||||
|
|
||||||
|
|
|
||||||
3
run.fish
3
run.fish
|
|
@ -4,5 +4,6 @@ set -l dbus 'quickshell.dbus.properties.warning = false;quickshell.dbus.dbusmenu
|
||||||
set -l notifs 'quickshell.service.notifications.warning = false' # Notification server warnings on reload
|
set -l notifs 'quickshell.service.notifications.warning = false' # Notification server warnings on reload
|
||||||
set -l sni 'quickshell.service.sni.host.warning = false' # StatusNotifierItem warnings on reload
|
set -l sni 'quickshell.service.sni.host.warning = false' # StatusNotifierItem warnings on reload
|
||||||
set -l process 'QProcess: Destroyed while process' # Long running processes on reload
|
set -l process 'QProcess: Destroyed while process' # Long running processes on reload
|
||||||
|
set -l cache "Cannot open: file://$XDG_CACHE_HOME/caelestia/imagecache/"
|
||||||
|
|
||||||
qs -p (dirname (status filename)) --log-rules "$dbus;$notifs;$sni" | grep -vE -e $process
|
qs -p (dirname (status filename)) --log-rules "$dbus;$notifs;$sni" | grep -vF -e $process -e $cache
|
||||||
|
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
pragma Singleton
|
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import "root:/utils"
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Io
|
|
||||||
import QtQuick
|
|
||||||
|
|
||||||
Singleton {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
readonly property string thumbDir: `${Paths.cache}/thumbnails`.slice(7)
|
|
||||||
|
|
||||||
function go(obj: var): var {
|
|
||||||
return thumbComp.createObject(obj, {
|
|
||||||
originalPath: obj.path,
|
|
||||||
width: obj.width,
|
|
||||||
height: obj.height,
|
|
||||||
loadOriginal: obj.loadOriginal
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
component Thumbnail: QtObject {
|
|
||||||
id: obj
|
|
||||||
|
|
||||||
required property string originalPath
|
|
||||||
required property int width
|
|
||||||
required property int height
|
|
||||||
required property bool loadOriginal
|
|
||||||
|
|
||||||
property string path
|
|
||||||
|
|
||||||
readonly property Process proc: Process {
|
|
||||||
running: true
|
|
||||||
command: ["fish", "-c", `
|
|
||||||
set -l path "${root.thumbDir}/$(sha1sum ${obj.originalPath} | cut -d ' ' -f 1)@${obj.width}x${obj.height}-exact.png"
|
|
||||||
if test -f $path
|
|
||||||
echo $path
|
|
||||||
else
|
|
||||||
echo 'start'
|
|
||||||
set -l size (identify -ping -format '%w\n%h' ${obj.originalPath})
|
|
||||||
if test $size[1] -gt ${obj.width} -o $size[2] -gt ${obj.height}
|
|
||||||
magick ${obj.originalPath} -${obj.width > 1024 || obj.height > 1024 ? "resize" : "thumbnail"} ${obj.width}x${obj.height}^ -background none -gravity center -extent ${obj.width}x${obj.height} -unsharp 0x.5 $path
|
|
||||||
else
|
|
||||||
cp ${obj.originalPath} $path
|
|
||||||
end
|
|
||||||
echo $path
|
|
||||||
end`]
|
|
||||||
stdout: SplitParser {
|
|
||||||
onRead: data => {
|
|
||||||
if (data === "start") {
|
|
||||||
if (obj.loadOriginal)
|
|
||||||
obj.path = obj.originalPath;
|
|
||||||
} else {
|
|
||||||
obj.path = data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reload(): void {
|
|
||||||
proc.signal(9);
|
|
||||||
proc.running = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: thumbComp
|
|
||||||
|
|
||||||
Thumbnail {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
pragma Singleton
|
pragma Singleton
|
||||||
|
|
||||||
import Quickshell
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
import Qt.labs.platform
|
import Qt.labs.platform
|
||||||
|
|
||||||
Singleton {
|
Singleton {
|
||||||
|
|
@ -12,4 +13,19 @@ Singleton {
|
||||||
readonly property url data: `${StandardPaths.standardLocations(StandardPaths.GenericDataLocation)[0]}/caelestia`
|
readonly property url data: `${StandardPaths.standardLocations(StandardPaths.GenericDataLocation)[0]}/caelestia`
|
||||||
readonly property url state: `${StandardPaths.standardLocations(StandardPaths.GenericStateLocation)[0]}/caelestia`
|
readonly property url state: `${StandardPaths.standardLocations(StandardPaths.GenericStateLocation)[0]}/caelestia`
|
||||||
readonly property url cache: `${StandardPaths.standardLocations(StandardPaths.GenericCacheLocation)[0]}/caelestia`
|
readonly property url cache: `${StandardPaths.standardLocations(StandardPaths.GenericCacheLocation)[0]}/caelestia`
|
||||||
|
|
||||||
|
readonly property url imagecache: `${cache}/imagecache`
|
||||||
|
|
||||||
|
function mkdir(path: url): void {
|
||||||
|
mkdirProc.path = path.toString().replace("file://", "");
|
||||||
|
mkdirProc.startDetached();
|
||||||
|
}
|
||||||
|
|
||||||
|
Process {
|
||||||
|
id: mkdirProc
|
||||||
|
|
||||||
|
property string path
|
||||||
|
|
||||||
|
command: ["mkdir", "-p", path]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,50 @@
|
||||||
import "root:/services"
|
import "root:/services"
|
||||||
|
import "root:/utils"
|
||||||
|
import Quickshell.Io
|
||||||
import QtQuick
|
import QtQuick
|
||||||
|
|
||||||
Image {
|
Image {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property string path
|
property string path
|
||||||
property bool loadOriginal
|
property string hash
|
||||||
readonly property Thumbnailer.Thumbnail thumbnail: Thumbnailer.go(this)
|
readonly property string cachePath: `${Paths.imagecache}/${hash}@${width}x${height}.png`.slice(7)
|
||||||
|
|
||||||
source: thumbnail.path ? `file://${thumbnail.path}` : ""
|
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
cache: false
|
||||||
fillMode: Image.PreserveAspectCrop
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
sourceSize.width: width
|
||||||
|
sourceSize.height: height
|
||||||
|
|
||||||
|
onPathChanged: {
|
||||||
|
shaProc.signal(9);
|
||||||
|
shaProc.path = path.replace("file://", "");
|
||||||
|
shaProc.running = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
onCachePathChanged: {
|
||||||
|
if (hash)
|
||||||
|
source = cachePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
onStatusChanged: {
|
||||||
|
if (source == cachePath && status === Image.Error)
|
||||||
|
source = path;
|
||||||
|
else if (source == path && status === Image.Ready) {
|
||||||
|
Paths.mkdir(Paths.imagecache);
|
||||||
|
const grabPath = cachePath;
|
||||||
|
grabToImage(res => res.saveToFile(grabPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process {
|
||||||
|
id: shaProc
|
||||||
|
|
||||||
|
property string path
|
||||||
|
|
||||||
|
command: ["sha256sum", path]
|
||||||
|
stdout: SplitParser {
|
||||||
|
onRead: data => root.hash = data.split(" ")[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue