From e8351e57ba37a3d4a406b802e68ac412333b3e68 Mon Sep 17 00:00:00 2001
From: vicrodh <103399283+vicrodh@users.noreply.github.com>
Date: Sun, 13 Sep 2026 10:26:34 -0600
Subject: [PATCH] feat(qt): Settings sub-nav regrouped under an Advanced fold,
with new glyphs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Audio, Playback, Appearance, Navigation, Local Library, Offline,
Integrations and Updates stay in the column; Blacklist, Storage,
Import / Export, Developer (and Orbit while enabled) move under an ADVANCED
disclosure row with a chevron. The fold is not persisted: it opens itself
whenever the current section lives inside it, and reads as active while
closed over the selected page. Appearance takes lucide's
paintbrush-vertical, Integrations unplug and Storage database — baked into
every tint and registered as masters. The kiosk selector follows the same
order, flattened. "Share logs" stays pinned at the bottom.
cc
---
.../translations/de/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/en/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/es/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/fr/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/ja/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/nl/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/pt/LC_MESSAGES/qbz-ui.po | 4 +
.../translations/ru/LC_MESSAGES/qbz-ui.po | 4 +
.../qml/assets/icons/accent/database.svg | 15 ++
.../icons/accent/paintbrush-vertical.svg | 16 ++
.../qbz-qt/qml/assets/icons/accent/unplug.svg | 18 ++
.../qml/assets/icons/black/database.svg | 15 ++
.../icons/black/paintbrush-vertical.svg | 16 ++
.../qbz-qt/qml/assets/icons/black/unplug.svg | 18 ++
.../qml/assets/icons/muted/database.svg | 15 ++
.../icons/muted/paintbrush-vertical.svg | 16 ++
.../qbz-qt/qml/assets/icons/muted/unplug.svg | 18 ++
.../qml/assets/icons/primary/database.svg | 15 ++
.../icons/primary/paintbrush-vertical.svg | 16 ++
.../qml/assets/icons/primary/unplug.svg | 18 ++
.../qml/assets/icons/secondary/database.svg | 15 ++
.../icons/secondary/paintbrush-vertical.svg | 16 ++
.../qml/assets/icons/secondary/unplug.svg | 18 ++
.../qml/assets/icons/warning/database.svg | 15 ++
.../icons/warning/paintbrush-vertical.svg | 16 ++
.../qml/assets/icons/warning/unplug.svg | 18 ++
crates/qbz-qt/qml/settings/SettingsView.qml | 157 ++++++++++++------
crates/qbz-qt/src/icon_tint_qt.rs | 3 +
28 files changed, 438 insertions(+), 48 deletions(-)
create mode 100644 crates/qbz-qt/qml/assets/icons/accent/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/accent/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/accent/unplug.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/black/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/black/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/black/unplug.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/muted/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/muted/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/muted/unplug.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/primary/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/primary/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/primary/unplug.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/secondary/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/secondary/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/secondary/unplug.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/warning/database.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/warning/paintbrush-vertical.svg
create mode 100644 crates/qbz-qt/qml/assets/icons/warning/unplug.svg
diff --git a/crates/qbz-i18n/translations/de/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/de/LC_MESSAGES/qbz-ui.po
index 65829c51c..4f4b2e56e 100644
--- a/crates/qbz-i18n/translations/de/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/de/LC_MESSAGES/qbz-ui.po
@@ -7571,3 +7571,7 @@ msgstr "Offline-Cache leeren?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Entfernt alles, was zum Offline-Hören gespeichert ist: {} mit {}. Gekaufte Downloads in deinem Musikordner bleiben erhalten; Entferntes muss zum Offline-Hören erneut heruntergeladen werden."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Erweitert"
diff --git a/crates/qbz-i18n/translations/en/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/en/LC_MESSAGES/qbz-ui.po
index 0b46c9c96..828ce79bd 100644
--- a/crates/qbz-i18n/translations/en/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/en/LC_MESSAGES/qbz-ui.po
@@ -3197,3 +3197,7 @@ msgstr "Clear the offline cache?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Advanced"
diff --git a/crates/qbz-i18n/translations/es/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/es/LC_MESSAGES/qbz-ui.po
index 1d0540a5d..fd2694fa7 100644
--- a/crates/qbz-i18n/translations/es/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/es/LC_MESSAGES/qbz-ui.po
@@ -7577,3 +7577,7 @@ msgstr "¿Vaciar el caché offline?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Elimina todo lo guardado para escuchar sin conexión: {} que ocupan {}. Las compras descargadas en tu carpeta de música se conservan; lo que se elimine tendrá que descargarse de nuevo para escucharse sin conexión."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Avanzado"
diff --git a/crates/qbz-i18n/translations/fr/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/fr/LC_MESSAGES/qbz-ui.po
index 9a16695a4..c0e832e0c 100644
--- a/crates/qbz-i18n/translations/fr/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/fr/LC_MESSAGES/qbz-ui.po
@@ -7569,3 +7569,7 @@ msgstr "Vider le cache hors ligne ?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Supprime tout ce qui est enregistré pour l'écoute hors ligne : {} occupant {}. Les achats téléchargés dans votre dossier musique sont conservés ; ce qui est supprimé devra être retéléchargé pour être écouté hors ligne."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Avancé"
diff --git a/crates/qbz-i18n/translations/ja/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/ja/LC_MESSAGES/qbz-ui.po
index c65f89521..d41440285 100644
--- a/crates/qbz-i18n/translations/ja/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/ja/LC_MESSAGES/qbz-ui.po
@@ -7552,3 +7552,7 @@ msgstr "オフラインキャッシュを削除しますか?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "オフライン再生用に保存したものをすべて削除します({}、{})。ミュージックフォルダー内の購入済みダウンロードは残ります。削除したものをオフラインで再生するには、再度ダウンロードが必要です。"
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "詳細"
diff --git a/crates/qbz-i18n/translations/nl/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/nl/LC_MESSAGES/qbz-ui.po
index a94489149..d408b3209 100644
--- a/crates/qbz-i18n/translations/nl/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/nl/LC_MESSAGES/qbz-ui.po
@@ -7559,3 +7559,7 @@ msgstr "Offline cache wissen?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Verwijdert alles wat voor offline luisteren is opgeslagen: {} met {}. Gekochte downloads in je muziekmap blijven staan; wat je wist moet opnieuw worden gedownload om offline af te spelen."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Geavanceerd"
diff --git a/crates/qbz-i18n/translations/pt/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/pt/LC_MESSAGES/qbz-ui.po
index 882357205..d3d25dd00 100644
--- a/crates/qbz-i18n/translations/pt/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/pt/LC_MESSAGES/qbz-ui.po
@@ -7569,3 +7569,7 @@ msgstr "Limpar o cache offline?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Remove tudo o que está salvo para ouvir offline: {} ocupando {}. As compras baixadas na sua pasta de música são mantidas; o que for removido precisará ser baixado de novo para tocar offline."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Avançado"
diff --git a/crates/qbz-i18n/translations/ru/LC_MESSAGES/qbz-ui.po b/crates/qbz-i18n/translations/ru/LC_MESSAGES/qbz-ui.po
index c7801f490..384d6fe54 100644
--- a/crates/qbz-i18n/translations/ru/LC_MESSAGES/qbz-ui.po
+++ b/crates/qbz-i18n/translations/ru/LC_MESSAGES/qbz-ui.po
@@ -7590,3 +7590,7 @@ msgstr "Очистить офлайн-кэш?"
#: qbz-qt/qml/views/OfflineManagerView.qml
msgid "Removes everything saved for offline listening: {} using {}. Purchased downloads in your music folder are kept; anything cleared has to be downloaded again to play offline."
msgstr "Удаляет всё, что сохранено для прослушивания офлайн: {} объёмом {}. Купленные загрузки в папке с музыкой остаются; удалённое придётся скачать заново, чтобы слушать офлайн."
+
+#: qbz-qt/qml/settings/SettingsView.qml
+msgid "Advanced"
+msgstr "Дополнительно"
diff --git a/crates/qbz-qt/qml/assets/icons/accent/database.svg b/crates/qbz-qt/qml/assets/icons/accent/database.svg
new file mode 100644
index 000000000..e5ff4a218
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/accent/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/accent/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/accent/paintbrush-vertical.svg
new file mode 100644
index 000000000..60c1563e2
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/accent/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/accent/unplug.svg b/crates/qbz-qt/qml/assets/icons/accent/unplug.svg
new file mode 100644
index 000000000..d3dd5793e
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/accent/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/black/database.svg b/crates/qbz-qt/qml/assets/icons/black/database.svg
new file mode 100644
index 000000000..464d13ddb
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/black/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/black/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/black/paintbrush-vertical.svg
new file mode 100644
index 000000000..268ae7719
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/black/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/black/unplug.svg b/crates/qbz-qt/qml/assets/icons/black/unplug.svg
new file mode 100644
index 000000000..f82dc0c40
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/black/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/muted/database.svg b/crates/qbz-qt/qml/assets/icons/muted/database.svg
new file mode 100644
index 000000000..f0ec8db35
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/muted/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/muted/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/muted/paintbrush-vertical.svg
new file mode 100644
index 000000000..4ee940e5b
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/muted/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/muted/unplug.svg b/crates/qbz-qt/qml/assets/icons/muted/unplug.svg
new file mode 100644
index 000000000..071393c36
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/muted/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/primary/database.svg b/crates/qbz-qt/qml/assets/icons/primary/database.svg
new file mode 100644
index 000000000..d26027369
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/primary/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/primary/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/primary/paintbrush-vertical.svg
new file mode 100644
index 000000000..a9006fb77
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/primary/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/primary/unplug.svg b/crates/qbz-qt/qml/assets/icons/primary/unplug.svg
new file mode 100644
index 000000000..f923b3612
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/primary/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/secondary/database.svg b/crates/qbz-qt/qml/assets/icons/secondary/database.svg
new file mode 100644
index 000000000..f68524c4f
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/secondary/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/secondary/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/secondary/paintbrush-vertical.svg
new file mode 100644
index 000000000..1bf1699cb
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/secondary/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/secondary/unplug.svg b/crates/qbz-qt/qml/assets/icons/secondary/unplug.svg
new file mode 100644
index 000000000..7040653c3
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/secondary/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/warning/database.svg b/crates/qbz-qt/qml/assets/icons/warning/database.svg
new file mode 100644
index 000000000..7e8d922da
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/warning/database.svg
@@ -0,0 +1,15 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/warning/paintbrush-vertical.svg b/crates/qbz-qt/qml/assets/icons/warning/paintbrush-vertical.svg
new file mode 100644
index 000000000..5fc93c676
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/warning/paintbrush-vertical.svg
@@ -0,0 +1,16 @@
+
diff --git a/crates/qbz-qt/qml/assets/icons/warning/unplug.svg b/crates/qbz-qt/qml/assets/icons/warning/unplug.svg
new file mode 100644
index 000000000..bd3a90f85
--- /dev/null
+++ b/crates/qbz-qt/qml/assets/icons/warning/unplug.svg
@@ -0,0 +1,18 @@
+
diff --git a/crates/qbz-qt/qml/settings/SettingsView.qml b/crates/qbz-qt/qml/settings/SettingsView.qml
index 6a0767938..bf5a66f7d 100644
--- a/crates/qbz-qt/qml/settings/SettingsView.qml
+++ b/crates/qbz-qt/qml/settings/SettingsView.qml
@@ -9,17 +9,22 @@
// 1 Playback -> PlaybackSettings.qml
// 2 Appearance -> AppearanceSettings.qml
// 3 Offline -> OfflineSettings.qml
-// 13 Storage -> StorageSettings.qml (artwork, lyrics and Plex
-// caches; shown right after Offline)
+// 13 Storage -> StorageSettings.qml (artwork, lyrics and Plex caches)
// 4 Local Library -> LocalLibrarySettings.qml (+ PlexSettings.qml)
// 5 Blacklist -> BlacklistSettings.qml
// 6 Integrations -> IntegrationsSettings.qml
// 7 Developer -> DeveloperSettings.qml
// 8 Flatpak/Snap -> SandboxSettings.qml (only on a sandboxed install)
-// 9 Import/Export -> ImportExportSettings.qml (shown between
-// Integrations and Developer; index 9 keeps the
+// 9 Import/Export -> ImportExportSettings.qml (index 9 keeps the
// persisted section numbers of 0-8 stable)
//
+// The sub-nav ORDER (2026-09-13) is not the index order: Audio, Playback,
+// Appearance, Navigation, Local Library, Offline, Integrations, Updates,
+// [Flatpak/Snap], then an ADVANCED fold (`advancedOpen`) holding Blacklist,
+// Storage, Import / Export, Developer and Orbit. The fold opens itself when
+// the current section lives inside it; "Share logs" stays pinned at the
+// bottom of the column.
+//
// All state is ONE JSON document (QbzBridge.settingsJson, settings_qt.rs
// SettingsDoc). Controls never keep local truth: they call the
// settingsBool/Select/Slider/String invokables, Rust persists + applies +
@@ -68,22 +73,36 @@ Item {
// assignment destroys the binding it lands on, so a single surviving
// `root.section = n` would work once and then re-introduce the bug one
// navigation later, in a way that looks fixed under casual testing.
+ // Same order as the desktop column; the fold is flattened here because
+ // the kiosk selector is one list.
readonly property var kioskSections: [
{ label: QbzSession.tr("Audio", QbzSession.trRev), section: 0 },
{ label: QbzSession.tr("Playback", QbzSession.trRev), section: 1 },
{ label: QbzSession.tr("Appearance", QbzSession.trRev), section: 2 },
{ label: QbzSession.tr("Navigation", QbzSession.trRev), section: 10 },
- { label: QbzSession.tr("Offline", QbzSession.trRev), section: 3 },
- { label: QbzSession.tr("Storage", QbzSession.trRev), section: 13 },
{ label: QbzSession.tr("Local Library", QbzSession.trRev), section: 4 },
- { label: QbzSession.tr("Blacklist", QbzSession.trRev), section: 5 },
+ { label: QbzSession.tr("Offline", QbzSession.trRev), section: 3 },
{ label: QbzSession.tr("Integrations", QbzSession.trRev), section: 6 },
- { label: QbzSession.tr("Import / Export", QbzSession.trRev), section: 9 },
{ label: QbzSession.tr("Updates", QbzSession.trRev), section: 12 },
+ { label: QbzSession.tr("Blacklist", QbzSession.trRev), section: 5 },
+ { label: QbzSession.tr("Storage", QbzSession.trRev), section: 13 },
+ { label: QbzSession.tr("Import / Export", QbzSession.trRev), section: 9 },
{ label: QbzSession.tr("Developer", QbzSession.trRev), section: 7 }
].concat(QbzOrbit.enabled ? [{ label: "Orbit", section: 11 }] : []).concat(root.sandboxed ? [{ label: (doc.dev || ({})).installMethod === "snap"
? QbzSession.tr("Snap", QbzSession.trRev) : QbzSession.tr("Flatpak", QbzSession.trRev), section: 8 }] : [])
readonly property int section: QbzBridge.settingsSection === 11 && !QbzOrbit.enabled ? 0 : QbzBridge.settingsSection
+ /// The ADVANCED fold of the desktop sub-nav (Blacklist, Storage,
+ /// Import / Export, Developer, Orbit). Not persisted on purpose: it opens
+ /// itself whenever the current section lives inside it, so a restored or
+ /// programmatic selection is never hidden behind a closed fold, and it
+ /// stays open once opened until the next launch.
+ readonly property var advancedSections: [5, 13, 9, 7, 11]
+ property bool advancedOpen: false
+ function revealAdvanced() {
+ if (root.advancedSections.indexOf(root.section) >= 0)
+ root.advancedOpen = true
+ }
+ onSectionChanged: revealAdvanced()
readonly property bool migrationRunning:
(doc.importExport || ({})).migrationRunning === true
@@ -99,7 +118,10 @@ Item {
root.doc = ({})
}
}
- Component.onCompleted: reload()
+ Component.onCompleted: {
+ reload()
+ revealAdvanced()
+ }
Connections {
target: QbzBridge
function onSettingsJsonChanged() { root.reload() }
@@ -164,6 +186,10 @@ Item {
property string name: ""
property string label: ""
property bool active: false
+ /// Extra left inset for the rows inside the ADVANCED fold.
+ property int indent: 0
+ /// Optional right-aligned glyph — the fold's chevron.
+ property string trailing: ""
signal clicked()
width: parent ? parent.width : 0
@@ -189,8 +215,8 @@ Item {
}
Row {
anchors.fill: parent
- anchors.leftMargin: 12
- anchors.rightMargin: 12
+ anchors.leftMargin: 12 + parent.indent
+ anchors.rightMargin: parent.trailing !== "" ? 36 : 12
spacing: 10
QbzIcon {
name: parent.parent.name
@@ -212,6 +238,21 @@ Item {
verticalAlignment: Text.AlignVCenter
}
}
+ Loader {
+ active: parent.trailing !== ""
+ anchors.right: parent.right
+ anchors.rightMargin: 12
+ anchors.verticalCenter: parent.verticalCenter
+ width: 16
+ height: 16
+ sourceComponent: QbzIcon {
+ name: snTrailingHost.trailing
+ width: 16
+ height: 16
+ tintName: "secondary"
+ }
+ readonly property Item snTrailingHost: parent
+ }
MouseArea {
id: snArea
anchors.fill: parent
@@ -244,7 +285,7 @@ Item {
onClicked: QbzBridge.settingsSetSection(1)
}
SubNavItem {
- name: "layers"
+ name: "paintbrush-vertical"
label: QbzSession.tr("Appearance", QbzSession.trRev)
active: root.section === 2
onClicked: QbzBridge.settingsSetSection(2)
@@ -255,18 +296,6 @@ Item {
active: root.section === 10
onClicked: QbzBridge.settingsSetSection(10)
}
- SubNavItem {
- name: "cloud-download"
- label: QbzSession.tr("Offline", QbzSession.trRev)
- active: root.section === 3
- onClicked: QbzBridge.settingsSetSection(3)
- }
- SubNavItem {
- name: "folder"
- label: QbzSession.tr("Storage", QbzSession.trRev)
- active: root.section === 13
- onClicked: QbzBridge.settingsSetSection(13)
- }
SubNavItem {
name: "hard-drive"
label: QbzSession.tr("Local Library", QbzSession.trRev)
@@ -274,42 +303,23 @@ Item {
onClicked: QbzBridge.settingsSetSection(4)
}
SubNavItem {
- name: "blind-eye"
- label: QbzSession.tr("Blacklist", QbzSession.trRev)
- active: root.section === 5
- onClicked: QbzBridge.settingsSetSection(5)
+ name: "cloud-download"
+ label: QbzSession.tr("Offline", QbzSession.trRev)
+ active: root.section === 3
+ onClicked: QbzBridge.settingsSetSection(3)
}
SubNavItem {
- name: "refresh-cw"
+ name: "unplug"
label: QbzSession.tr("Integrations", QbzSession.trRev)
active: root.section === 6
onClicked: QbzBridge.settingsSetSection(6)
}
- SubNavItem {
- name: "import"
- label: QbzSession.tr("Import / Export", QbzSession.trRev)
- active: root.section === 9
- onClicked: QbzBridge.settingsSetSection(9)
- }
SubNavItem {
name: "refresh-cw"
label: QbzSession.tr("Updates", QbzSession.trRev)
active: root.section === 12
onClicked: QbzBridge.settingsSetSection(12)
}
- SubNavItem {
- name: "bug"
- label: QbzSession.tr("Developer", QbzSession.trRev)
- active: root.section === 7
- onClicked: QbzBridge.settingsSetSection(7)
- }
- SubNavItem {
- visible: QbzOrbit.enabled
- name: "compass"
- label: "Orbit"
- active: root.section === 11
- onClicked: QbzBridge.settingsSetSection(11)
- }
// Sandboxed installs only (Flatpak / Snap permissions).
SubNavItem {
visible: root.sandboxed
@@ -320,6 +330,57 @@ Item {
active: root.section === 8
onClicked: QbzBridge.settingsSetSection(8)
}
+
+ // The ADVANCED fold: a disclosure row, not a section. It
+ // reads as active while it is closed over the selected
+ // page, so the column never shows nothing selected.
+ SubNavItem {
+ name: "sliders-horizontal"
+ trailing: root.advancedOpen ? "chevron-down" : "chevron-right"
+ label: QbzSession.tr("Advanced", QbzSession.trRev)
+ active: !root.advancedOpen && root.advancedSections.indexOf(root.section) >= 0
+ onClicked: root.advancedOpen = !root.advancedOpen
+ }
+ SubNavItem {
+ visible: root.advancedOpen
+ indent: 16
+ name: "blind-eye"
+ label: QbzSession.tr("Blacklist", QbzSession.trRev)
+ active: root.section === 5
+ onClicked: QbzBridge.settingsSetSection(5)
+ }
+ SubNavItem {
+ visible: root.advancedOpen
+ indent: 16
+ name: "database"
+ label: QbzSession.tr("Storage", QbzSession.trRev)
+ active: root.section === 13
+ onClicked: QbzBridge.settingsSetSection(13)
+ }
+ SubNavItem {
+ visible: root.advancedOpen
+ indent: 16
+ name: "import"
+ label: QbzSession.tr("Import / Export", QbzSession.trRev)
+ active: root.section === 9
+ onClicked: QbzBridge.settingsSetSection(9)
+ }
+ SubNavItem {
+ visible: root.advancedOpen
+ indent: 16
+ name: "bug"
+ label: QbzSession.tr("Developer", QbzSession.trRev)
+ active: root.section === 7
+ onClicked: QbzBridge.settingsSetSection(7)
+ }
+ SubNavItem {
+ visible: root.advancedOpen && QbzOrbit.enabled
+ indent: 16
+ name: "compass"
+ label: "Orbit"
+ active: root.section === 11
+ onClicked: QbzBridge.settingsSetSection(11)
+ }
}
// Always-visible log affordance, pinned to the bottom of the
diff --git a/crates/qbz-qt/src/icon_tint_qt.rs b/crates/qbz-qt/src/icon_tint_qt.rs
index c7447fc7c..6afc8f9d5 100644
--- a/crates/qbz-qt/src/icon_tint_qt.rs
+++ b/crates/qbz-qt/src/icon_tint_qt.rs
@@ -183,6 +183,7 @@ const MASTERS: &[(&str, &str)] = &[
("cloud-upload", include_str!("../qml/assets/icons/primary/cloud-upload.svg")),
("compass", include_str!("../qml/assets/icons/primary/compass.svg")),
("copy", include_str!("../qml/assets/icons/primary/copy.svg")),
+ ("database", include_str!("../qml/assets/icons/primary/database.svg")),
("disc-3", include_str!("../qml/assets/icons/primary/disc-3.svg")),
("disc", include_str!("../qml/assets/icons/primary/disc.svg")),
("disc-folder", include_str!("../qml/assets/icons/primary/disc-folder.svg")),
@@ -252,6 +253,7 @@ const MASTERS: &[(&str, &str)] = &[
("music-note-slider", include_str!("../qml/assets/icons/primary/music-note-slider.svg")),
("music", include_str!("../qml/assets/icons/primary/music.svg")),
("network", include_str!("../qml/assets/icons/primary/network.svg")),
+ ("paintbrush-vertical", include_str!("../qml/assets/icons/primary/paintbrush-vertical.svg")),
("panel-left", include_str!("../qml/assets/icons/primary/panel-left.svg")),
("panel-right-close", include_str!("../qml/assets/icons/primary/panel-right-close.svg")),
("panel-right-open", include_str!("../qml/assets/icons/primary/panel-right-open.svg")),
@@ -308,6 +310,7 @@ const MASTERS: &[(&str, &str)] = &[
("trash-list", include_str!("../qml/assets/icons/primary/trash-list.svg")),
("triangle-alert", include_str!("../qml/assets/icons/primary/triangle-alert.svg")),
("turntable", include_str!("../qml/assets/icons/primary/turntable.svg")),
+ ("unplug", include_str!("../qml/assets/icons/primary/unplug.svg")),
("user-plus", include_str!("../qml/assets/icons/primary/user-plus.svg")),
("user", include_str!("../qml/assets/icons/primary/user.svg")),
("volume-2", include_str!("../qml/assets/icons/primary/volume-2.svg")),