feat(slint): library/sidebar UX overhaul + theme switching + fixes
Shell & navigation: - Three-state sidebar (open/mini/closed); collapse cycles via header button. - Section nav as right-flyouts (sidebar) + compact header nav (closed) + full header tabs (nav-in-sidebar off), via a shared HeaderMenuOverlay. - Collapsed-folder right-flyout popup (max 4 + scrollbar), Rust-populated. - Thin auto-hiding sidebar scrollbar pinned to the edge (Flickable, drag-safe). - Slack-style bezel: rounded inset content panel over surface-card chrome. - Header restructure: nav buttons, window-centered search, app menu. Themes & components: - Live theme switching: Dark / OLED Black / Tokyo Night / System (std-widgets). - SegmentedTabBar (Discovery-style) with count badges for Library + Local Library. - MP3 quality-badge tier (format-first classification) across badges. - QbzSelect (Group/Sort) trimmed 20px. Behavior fixes: - Artist + Local Library Folder cover art now reach the rendered (visible/ grouped) models, not just the source set. - Favorites Playlists/Labels random buttons. - Playlist track click plays from the clicked track in visible order. - Dropdown idle-close pauses while the cursor rests on the menu. cc
This commit is contained in:
27 files changed
+1495
-619
No files matched your search
@@ -11,9 +11,10 @@
|
||||
// flags Tauri gates on (System theme, title-bar mode, etc.).
|
||||
|
||||
import { Theme } from "../foundation/semantic-colors.slint";
|
||||
import { ThemeState } from "../foundation/theme-state.slint";
|
||||
import { Typography } from "../foundation/typography.slint";
|
||||
import { Radius } from "../foundation/radius.slint";
|
||||
import { AppearanceState, SidebarState } from "../state.slint";
|
||||
import { AppearanceState, SidebarState, ShellState } from "../state.slint";
|
||||
import { QbzToggle } from "../primitives/QbzToggle.slint";
|
||||
import { QbzSelect } from "../primitives/QbzSelect.slint";
|
||||
import { QbzIcon } from "../primitives/QbzIcon.slint";
|
||||
@@ -128,7 +129,6 @@ export component AppearanceSettings inherits VerticalLayout {
|
||||
GroupHeader { text: @tr("THEME"); }
|
||||
|
||||
SettingRow {
|
||||
unsupported: true;
|
||||
label: @tr("Theme");
|
||||
HorizontalLayout {
|
||||
spacing: 8px;
|
||||
@@ -164,6 +164,10 @@ export component AppearanceSettings inherits VerticalLayout {
|
||||
current-index: AppearanceState.theme-index;
|
||||
selected(i) => {
|
||||
AppearanceState.theme-index = i;
|
||||
// The themes list is trimmed to the ported set, so the
|
||||
// dropdown index maps 1:1 to the mode (0 Dark, 1 OLED,
|
||||
// 2 Tokyo Night, 3 System).
|
||||
ThemeState.mode = i;
|
||||
AppearanceState.appearance-select("theme", i);
|
||||
}
|
||||
}
|
||||
@@ -284,6 +288,16 @@ export component AppearanceSettings inherits VerticalLayout {
|
||||
// ===================================================================
|
||||
GroupHeader { text: @tr("LIBRARY & VISUALS"); }
|
||||
|
||||
SettingRow {
|
||||
label: @tr("Show navigation in sidebar");
|
||||
description: @tr("Move the Discover, Library, Local Library and My QBZ sections out of the header and into the sidebar.");
|
||||
QbzToggle {
|
||||
checked: ShellState.nav-in-sidebar;
|
||||
toggled(v) => {
|
||||
ShellState.nav-in-sidebar = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
SettingRow {
|
||||
label: @tr("Show playlist cover collages in sidebar");
|
||||
description: @tr("Render a 2×2 thumbnail of track covers next to each playlist. Disable on low-end machines to skip the extra images.");
|
||||
@@ -632,6 +646,16 @@ export component AppearanceSettings inherits VerticalLayout {
|
||||
// ===================================================================
|
||||
GroupHeader { text: @tr("PLAYER VIEWS"); }
|
||||
|
||||
SettingRow {
|
||||
label: @tr("Show volume +/- buttons");
|
||||
description: @tr("Add discrete plus and minus buttons next to the volume slider in the player bar.");
|
||||
QbzToggle {
|
||||
checked: AppearanceState.show-volume-steppers;
|
||||
toggled(v) => {
|
||||
AppearanceState.show-volume-steppers = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
SettingRow {
|
||||
unsupported: true;
|
||||
label: @tr("Mini player default view");
|
||||
|
||||
Reference in new issue
Block a user