/ services / Wallpapers.qml
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  }