Thumbnailer.qml
1 pragma Singleton 2 pragma ComponentBehavior: Bound 3 4 import "root:/utils" 5 import Quickshell 6 import Quickshell.Io 7 import QtQuick 8 9 Singleton { 10 id: root 11 12 readonly property string thumbDir: `${Paths.cache}/thumbnails`.slice(7) 13 14 function go(obj: var): var { 15 return thumbComp.createObject(obj, { 16 originalPath: obj.path, 17 width: obj.width, 18 height: obj.height, 19 loadOriginal: obj.loadOriginal 20 }); 21 } 22 23 component Thumbnail: QtObject { 24 id: obj 25 26 required property string originalPath 27 required property int width 28 required property int height 29 required property bool loadOriginal 30 31 property string path 32 33 readonly property Process proc: Process { 34 running: true 35 command: ["fish", "-c", ` 36 set -l path "${root.thumbDir}/$(sha1sum ${obj.originalPath} | cut -d ' ' -f 1)@${obj.width}x${obj.height}-exact.png" 37 if test -f $path 38 echo $path 39 else 40 echo 'start' 41 set -l size (identify -ping -format '%w\n%h' ${obj.originalPath}) 42 if test $size[1] -gt ${obj.width} -o $size[2] -gt ${obj.height} 43 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 44 else 45 cp ${obj.originalPath} $path 46 end 47 echo $path 48 end`] 49 stdout: SplitParser { 50 onRead: data => { 51 if (data === "start") { 52 if (obj.loadOriginal) 53 obj.path = obj.originalPath; 54 } else { 55 obj.path = data; 56 } 57 } 58 } 59 } 60 61 function reload(): void { 62 proc.signal(9); 63 proc.running = true; 64 } 65 } 66 67 Component { 68 id: thumbComp 69 70 Thumbnail {} 71 } 72 }