feat(qbz-slint): album detail page

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
This commit is contained in:
vicrodh committed 2026-05-18 14:38:45 -06:00
1 parent 2a7147a008
commit 6b772b41b0
10 files changed
+628 -15

No files matched your search

+11 -6
View File
@@ -1,16 +1,16 @@
// QBZ Slint POC — UI entry point.
// QBZ Slint MVP — UI entry point.
//
// Stays thin: imports the feature screens and exports the single
// top-level window. No raw visual constants or domain logic here
// (POC ADR, sections 13 and 21).
// (MVP ADR, sections 13 and 21).
import { Theme } from "foundation/semantic-colors.slint";
import { SplashScreen } from "splash/SplashScreen.slint";
import { LoginScreen } from "login/LoginScreen.slint";
import { AppShell } from "shell/AppShell.slint";
// Re-export the HomeState global so the Rust layer can populate it.
export { HomeState } from "state.slint";
// Re-export the state globals so the Rust layer can populate them.
export { HomeState, AlbumState, NavState } from "state.slint";
// Which top-level screen is shown. The app starts on `splash` while it
// restores a saved session, then resolves to `shell` or `login`.
@@ -26,11 +26,12 @@ export component AppWindow inherits Window {
in-out property <AppScreen> screen: AppScreen.splash;
// Forwarded to the Rust layer, which maps them to typed AppCommands.
// Forwarded to the Rust layer.
callback sign-in-via-browser();
callback use-system-browser();
callback start-offline();
callback open-tos();
callback open-album(string);
if root.screen == AppScreen.splash: SplashScreen { }
@@ -49,5 +50,9 @@ export component AppWindow inherits Window {
}
}
if root.screen == AppScreen.shell: AppShell { }
if root.screen == AppScreen.shell: AppShell {
open-album(id) => {
root.open-album(id);
}
}
}