Wallpapers.qml
1 pragma Singleton 2 3 import "root:/utils/scripts/fuzzysort.js" as Fuzzy 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 currentNamePath: `${Paths.state}/wallpaper/last.txt`.slice(7) 13 readonly property string path: `${Paths.pictures}/Wallpapers`.slice(7) 14 15 readonly property list<Wallpaper> list: wallpapers.instances 16 property bool showPreview: false 17 readonly property string current: showPreview ? previewPath : actualCurrent 18 property string previewPath 19 property string actualCurrent 20 21 readonly property list<var> preppedWalls: list.map(w => ({ 22 name: Fuzzy.prepare(w.name), 23 path: Fuzzy.prepare(w.path), 24 wall: w 25 })) 26 27 function fuzzyQuery(search: string): var { 28 return Fuzzy.go(search, preppedWalls, { 29 all: true, 30 keys: ["name", "path"], 31 scoreFn: r => r[0].score * 0.9 + r[1].score * 0.1 32 }).map(r => r.obj.wall); 33 } 34 35 function setWallpaper(path: string): void { 36 actualCurrent = path; 37 setWall.path = path; 38 setWall.startDetached(); 39 } 40 41 function preview(path: string): void { 42 previewPath = path; 43 showPreview = true; 44 getPreviewColoursProc.running = true; 45 } 46 47 function stopPreview(): void { 48 showPreview = false; 49 Colours.endPreviewOnNextChange = true; 50 } 51 52 reloadableId: "wallpapers" 53 54 FileView { 55 path: root.currentNamePath 56 watchChanges: true 57 onFileChanged: reload() 58 onLoaded: root.actualCurrent = text().trim() 59 } 60 61 Process { 62 id: getPreviewColoursProc 63 64 command: ["caelestia", "scheme", "print", root.previewPath] 65 stdout: SplitParser { 66 splitMarker: "" 67 onRead: data => { 68 Colours.load(data, true); 69 Colours.showPreview = true; 70 } 71 } 72 } 73 74 Process { 75 id: setWall 76 77 property string path 78 79 command: ["caelestia", "wallpaper", "-f", path] 80 } 81 82 Process { 83 running: true 84 command: ["fd", ".", root.path, "-t", "f", "-e", "jpg", "-e", "jpeg", "-e", "png", "-e", "svg"] 85 stdout: SplitParser { 86 splitMarker: "" 87 onRead: data => wallpapers.model = data.trim().split("\n") 88 } 89 } 90 91 Variants { 92 id: wallpapers 93 94 Wallpaper {} 95 } 96 97 component Wallpaper: QtObject { 98 required property string modelData 99 readonly property string path: modelData 100 readonly property string name: path.slice(path.lastIndexOf("/") + 1, path.lastIndexOf(".")) 101 } 102 }