WallpaperPanel: add sort by random

This commit is contained in:
Lin Xianyi
2026-02-02 22:43:47 +08:00
parent a8d74633f6
commit 8e8d819521
3 changed files with 29 additions and 13 deletions
+1 -1
View File
@@ -374,7 +374,7 @@ Singleton {
property string wallhavenResolutionWidth: ""
property string wallhavenResolutionHeight: ""
property string sortOrder: "name" // "name", "name_desc", "date", "date_desc"
property string sortOrder: "name" // "name", "name_desc", "date", "date_desc", "random"
}
// applauncher
+7 -1
View File
@@ -761,6 +761,8 @@ SmartPanel {
return "history";
if (sortOrder === "name_desc")
return "sort-descending";
if (sortOrder === "random")
return "arrows-shuffle";
return "sort-ascending";
}
tooltipText: {
@@ -770,6 +772,8 @@ SmartPanel {
return "Sort: Oldest First";
if (sortOrder === "name_desc")
return "Sort: Name (Z-A)";
if (sortOrder === "random")
return "Sort: Random";
return "Sort: Name (A-Z)";
}
baseSize: Style.baseWidgetSize * 0.8
@@ -779,7 +783,7 @@ SmartPanel {
next = "date_desc";
else if (sortOrder === "date_desc")
next = "name"; // Toggle simpler: Name -> Newest -> Name
// Expanded cycle: Name -> Newest -> Oldest -> Z-A -> Name
// Expanded cycle: Name -> Newest -> Oldest -> Z-A -> Random -> Name
// User just asked for "newest first", so let's make it easy to reach.
// Let's do: Name (A-Z) -> Newest -> Oldest -> Name (Z-A) -> ...
@@ -789,6 +793,8 @@ SmartPanel {
next = "date_asc";
else if (sortOrder === "date_asc")
next = "name_desc";
else if (sortOrder === "name_desc")
next = "random";
else
next = "name";
+21 -11
View File
@@ -767,17 +767,27 @@ Singleton {
// Sort files based on settings
var sortOrder = Settings.data.wallpaper.sortOrder || "name";
parsedFiles.sort(function (a, b) {
if (sortOrder === "date_desc") { // Newest first
return b.time - a.time;
} else if (sortOrder === "date_asc") { // Oldest first
return a.time - b.time;
} else if (sortOrder === "name_desc") {
return b.name.localeCompare(a.name);
} else { // name (asc)
return a.name.localeCompare(b.name);
}
});
// Fischer-Yates shuffle
if (sortOrder === "random") {
for (let i = parsedFiles.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
const temp = parsedFiles[i];
parsedFiles[i] = parsedFiles[j];
parsedFiles[j] = temp;
}
} else {
parsedFiles.sort(function (a, b) {
if (sortOrder === "date_desc") { // Newest first
return b.time - a.time;
} else if (sortOrder === "date_asc") { // Oldest first
return a.time - b.time;
} else if (sortOrder === "name_desc") {
return b.name.localeCompare(a.name);
} else { // name (asc)
return a.name.localeCompare(b.name);
}
});
}
// Map back to string array
files = parsedFiles.map(f => f.path);