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")),