Shell chrome (steps 1-3):
- Left sidebar is collapsible — a toggle in the nav cluster (left of the
[<] [>] pair) and a draggable right edge that resizes 200-420px and
collapses below 160px. ShellState global drives it.
- Queue and Lyrics right sidebars: 320px panels rendered as layout
siblings, so opening one pushes the content area narrower rather than
overlaying it. The header captions/queue buttons toggle them
(mutually exclusive) and light up when active.
- The four nav tabs (Discover/Library/Local Library/My QBZ) open
dropdown menus listing their sub-sections; Discover -> Home is wired.
Detail views (steps 4-5):
- Track rows: the even-row tint is now clearly fainter than the hover
tint so the two states no longer look identical.
- The favorite and offline-cache glyphs in album track rows are real
buttons (hover state, emit media-action).
- Album header artist link uses the metadata text color, bold, instead
of the accent blue.
- Album description and artist biography span the full content width
below the header block.
cc
NowPlayingBar (start of the playback-bar work):
- height raised to 110px
- SeekBar component: three-line track (total / cached / progress), a
hover thumb, elapsed/remaining times, and a hover time bubble with a
downward caret marking the seek position
- song card: background and border dropped, gains the extra height,
album/artist links and the context icon kept (context icon now
always shown)
- transport + secondary buttons copied from Tauri (shuffle, prev,
play, next, repeat, add, favorite; cast, picture-in-picture,
fullscreen, normalization; volume cluster). Queue/Lyrics stay in the
header — and the header now orders them lyrics-then-queue.
Settings constraints (1:1 with Tauri):
- Exclusive Mode enabled only on ALSA; DAC Passthrough only on
PipeWire; Lock Output Device disabled while DAC Passthrough is on;
Gapless disabled while Streaming Only is on
- backend change cascades: forces off DAC passthrough / force-bit-
perfect / exclusive / gapless as appropriate; DAC-passthrough and
streaming-only cascades; initial-buffer slider right-aligned
Discover fixes:
- navigation [<] [>] pair homologated to the same top/left margin
across every view
- album/artist description moved back into the metadata column (it now
fills the width there) with uniform secondary text color
- genre filter button hugs its label instead of stretching
- Recently Played Albums and Tracks modules always render, with a
placeholder until the play history has data
- wider spacing between Discover rows; the Discover gear is no longer
a Settings shortcut (it is the per-tab sort/show-hide control)
cc
Move the album description and the artist biography out of the metadata
column to span the full content width below the header block, so the
text is no longer cramped into the narrow column beside the artwork.
cc
Add a navigation history so pages can be walked back and forward.
- nav.rs: a back/forward stack of NavEntry (home, album, artist,
settings); record() on fresh navigation, go_back/go_forward to walk it
- NavButtons: a [<] [>] pair styled like the Discover tab group; inline
beside the Discover tabs and in place of the per-page Back button on
album, artist and settings views
- All navigation routes through Rust (open-album/-artist record entries;
the gear and header menu use NavState.request-settings) so the history
stays accurate; back/forward re-apply entries, re-loading entity pages
- AppShell listens for the mouse back/forward buttons
- can-back / can-forward drive the buttons' enabled state
Also in this round:
- Album header description: render a pre-truncated short string so it
wraps to a couple of lines instead of overflowing the header; the full
text stays in the Read-more modal
- Header queue button uses an ordered-list icon (the previous one read
as a playlist)
cc
Four album-view corrections from review:
- Explicit badge: the title row now uses `alignment: start`, so the E
badge sits right after the track name instead of being stretched out
to a fake column position.
- Label/awards sidebar: dropped `alignment: start` on the track/sidebar
row — it had defeated the track list's stretch and left the sidebar
floating mid-row with dead space. The list now stretches and the
254px sidebar is flush right; it rides the content region inward when
a main sidebar opens.
- Track search: now a real client-side filter — a TextInput drives the
AlbumActions.search global callback; album.rs keeps the unfiltered
list and filter_tracks() matches title/artist case-insensitively.
- Description modal: the Flickable is vertical-stretch bounded so long
text scrolls, and strip_html keeps paragraph breaks as newlines.
cc
Bring the album view closer to 1:1 with the Tauri original.
- Track list: favorite and offline-cache columns, and the context-menu
button now always shows in the muted column color (it brightens on
hover) instead of being hidden until hover
- Toolbar above the track list: a QualityBadgeFull port of the Tauri
QualityBadgeStatic (icon + tier + exact bit-depth/sample-rate), plus
a track search box
- Editorial album description, truncated, with a Read more link that
opens the full text in a modal
- Label/awards sidebar: drop the resting card background; awards use
the Tauri laurels SVG
- Control buttons on both album and artist views are ghost circles
(translucent fill, faint ring) instead of solid fills
cc
Bring the album and artist pages closer to the Tauri originals.
Shared:
- Artwork-tinted gradient header — header_tint() derives an average,
darkened color from the decoded cover; the page header renders a
linear-gradient from it. Both pages scroll on a Flickable (no
scrollbar gutter).
Album view:
- Full header action row: play, shuffle, favorite, radio, credits,
booklet, mixtape, multi-select, more (visual where playback/feature
wiring is pending; play and favorite emit media-action)
- Right sidebar with the record label and editorial awards, each a
round-avatar card; AlbumData now carries id, label and awards
Artist view:
- Gradient header, fuller action row, and an "ARTIST" eyebrow
- Discography split into titled release sections (Albums, EPs &
Singles, Live Albums, Compilations, ...) instead of one flat list
- Artist track rows gained the more-button context menu
cc
The ellipsis faded on the row's hover state alone; moving onto the
button stole has-hover from the row and hid the button under the
cursor. It now stays visible while the row OR the button is hovered,
and is a proper 32px square hit area with a hover background.
cc
Add a first cut of context menus, opened from the "more" (ellipsis)
button on Discover album cards and on album track rows.
- ContextMenu / ContextMenuItem primitives (PopupWindow-hosted panel)
- AlbumCard: the overlay action buttons are now interactive (they gate
their pointer handling so non-hovered cards still open on click); the
more button opens a menu — Open album, Play, Add to queue, Add to
favorites
- TrackRow: a hover-revealed more button opens a menu — Play, Add to
queue, Add to favorites; AlbumTrackItem and TrackData carry the
track id
- Menu actions bubble up as a single media-action(kind, id, action)
callback through the shell; main.rs logs it for now — playback and
favorites wiring lands with the playback session
- user and list-plus icons
cc
Clicking an artist (from the album page's artist line) opens the
artist detail view: a circular portrait, name, biography, action
buttons, a Popular Tracks list, and a Discography carousel.
- artist.rs: fetches the artist page via QbzCore::get_artist_page and
maps name, biography (HTML-stripped), portrait URL, top tracks and
releases; the portrait loads through the shared image cache.
- ArtistPageView.slint reuses AlbumCard for the discography (through
the Carousel) and AlbumTrackItem for the track list.
- NavState becomes a three-way ContentView (home / album / artist) and
AppShell routes the content region accordingly. The album page's
artist line and the artist page's release cards are navigable.
cc
- Replace every Unicode glyph placeholder with Lucide icons via QbzIcon
(player transport, carousel nav, album-card overlay, album-page
actions, gear, search, checkbox, sidebar).
- Header: the search field is centered to the window width and gets a
search icon; the header and player bar now use the elevated surface,
so all chrome (header, sidebar, player bar) shares one color over the
darker content area.
- The sidebar user card moves to the header as a user element (name +
QBZ logo) that opens a dropdown — Settings, Keyboard Shortcuts,
Documentation, Report an Issue, About, plus Log Out and Close. Log Out
clears the session and returns to login; Close quits the app.
- Content ScrollViews disable the horizontal scrollbar — no view scrolls
horizontally, so the phantom reserved lane is gone.
cc
Clicking an album card opens the album detail view: a back button,
the album header (224px artwork, title, artist, and info line — year,
label, genre, track count, duration — plus play / shuffle / favorite /
more action buttons), and the track list with a column header (#,
title, artist, duration, quality).
- album.rs: fetches the album via QbzCore::get_album, maps it (info
line, per-track quality tier, durations) onto the AlbumState global,
and loads the header artwork through the shared image cache.
- AlbumPageView.slint, with NavState driving the shell content region
between Home and the album page.
- Album clicks bubble AlbumCard -> Carousel -> HomeView -> AppShell ->
AppWindow -> main; the back button returns to Home.
cc