aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/modules')
-rw-r--r--desktop/modules/appearance/WallEngine.qml16
-rw-r--r--desktop/modules/appearance/WallEngineTab.qml31
2 files changed, 43 insertions, 4 deletions
diff --git a/desktop/modules/appearance/WallEngine.qml b/desktop/modules/appearance/WallEngine.qml
index 9d90245..fe45f7b 100644
--- a/desktop/modules/appearance/WallEngine.qml
+++ b/desktop/modules/appearance/WallEngine.qml
@@ -31,6 +31,18 @@ Singleton {
function list(which) { return which === "V" ? cfg.v : cfg.h; }
function listed(path, which) { return list(which).indexOf(path) >= 0; }
+ // A gallery folder by its Wallpapers.groups key, "" for the hearted list.
+ function folder(which) { return which === "V" ? cfg.folderV : cfg.folderH; }
+ function setFolder(which, key) { Prefs.setWallEngine(which === "V" ? { folderV: key } : { folderH: key }); }
+ // What a tick draws from. A folder that is no longer in the gallery
+ // gives nothing, so that screen is left alone rather than falling back
+ // to the list behind the user's back.
+ function pool(which) {
+ const key = folder(which);
+ if (key === "") return list(which).filter(present);
+ const g = Wallpapers.groups.find(g => g.key === key);
+ return g ? g.files : [];
+ }
// ponytail: present means in the gallery's last scan, so a file deleted
// since stays drawable until a rescan, and wallp then skips it.
function present(path) { return Wallpapers.files.indexOf(path) >= 0; }
@@ -64,8 +76,8 @@ Singleton {
// A screen whose list is empty, or whose pick is already up, is left out.
function tick() {
if (Wallpapers.applying) return;
- const h = Shuffle.draw(cfg.h.filter(present), bagH, Wallpapers.currentH);
- const v = Shuffle.draw(cfg.v.filter(present), bagV, Wallpapers.currentV);
+ const h = Shuffle.draw(pool("H"), bagH, Wallpapers.currentH);
+ const v = Shuffle.draw(pool("V"), bagV, Wallpapers.currentV);
const ph = h.pick !== Wallpapers.currentH ? h.pick : "";
const pv = v.pick !== Wallpapers.currentV ? v.pick : "";
if (Wallpapers.run(ph, pv, "tick")) {
diff --git a/desktop/modules/appearance/WallEngineTab.qml b/desktop/modules/appearance/WallEngineTab.qml
index 95e2df2..caa01f4 100644
--- a/desktop/modules/appearance/WallEngineTab.qml
+++ b/desktop/modules/appearance/WallEngineTab.qml
@@ -67,24 +67,51 @@ Item {
required property var modelData
readonly property var paths: WallEngine.list(modelData.which)
readonly property string home: modelData.which === "V" ? WallEngine.cfg.homeV : WallEngine.cfg.homeH
+ readonly property string folder: WallEngine.folder(modelData.which)
+ readonly property var group: Wallpapers.groups.find(g => g.key === folder) ?? null
width: col.width
spacing: 8
Text {
- text: `${screen.modelData.name}: ${screen.paths.length} hearted`
+ text: screen.modelData.name + ": "
+ + (screen.folder === "" ? `${screen.paths.length} hearted`
+ : screen.group ? `${screen.group.files.length} in ${screen.group.name}`
+ : "the folder is gone, so this screen stays as it is")
+ (WallEngine.on && screen.home !== "" ? `, home ${Wallpapers.label(screen.home)}` : "")
color: Theme.subtext
font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2 }
}
+ // Where the timer draws from: the hearts, or one gallery
+ // folder in their place.
+ Flow {
+ width: col.width
+ spacing: 6
+ Tab {
+ text: "Hearted"
+ selected: screen.folder === ""
+ onClicked: WallEngine.setFolder(screen.modelData.which, "")
+ }
+ Repeater {
+ model: Wallpapers.groups
+ Tab {
+ required property var modelData
+ text: modelData.name
+ selected: screen.folder === modelData.key
+ onClicked: WallEngine.setFolder(screen.modelData.which, modelData.key)
+ }
+ }
+ }
+
Text {
- visible: screen.paths.length === 0
+ visible: screen.folder === "" && screen.paths.length === 0
text: "Heart a wallpaper on the Wallpaper page, with this screen selected, to add it."
color: Theme.overlay
font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 4 }
}
Flow {
+ visible: screen.folder === ""
width: col.width
spacing: 8