// Shared UI state — structs and globals the Rust controllers populate. // // The Rust side builds these models on a worker thread, then sets them // on the global from the Slint event loop (see src/home.rs, src/main.rs). export struct AlbumCardItem { id: string, title: string, artist: string, genre: string, // shown in the hover overlay year: string, // shown in the hover overlay quality-tier: string, // "hires" | "cd" | "" — drives the badge icon quality-label: string, // "Hi-Res: 24-bit / 96 kHz" — badge hover tooltip ribbon: string, ribbon-kind: string, // "press" | "qobuzissime" | "albumOfTheWeek" | "" artwork-url: string, artwork: image, // empty until the artwork pipeline resolves it } export struct DiscoverSection { title: string, albums: [AlbumCardItem], } // Compact "slim" card item — a small thumbnail with a title/subtitle, // optionally rank-numbered (Popular albums, Recently Played). export struct SlimItem { id: string, title: string, subtitle: string, rank: string, // "" = no rank artwork-url: string, artwork: image, } // Discover / Home screen state. export global HomeState { in property <[DiscoverSection]> sections: []; in property <[SlimItem]> popular: []; in property loading: false; } export struct AlbumTrackItem { number: string, title: string, artist: string, duration: string, quality-tier: string, explicit: bool, } // Album detail screen state. export global AlbumState { in property title; in property artist; in property artist-id; in property info-line; in property quality-tier; in property artwork; in property <[AlbumTrackItem]> tracks: []; in property loading: false; } // Which content view the shell shows. export enum ContentView { home, album, artist, settings } // Settings screen state. Audio and Playback preferences are loaded from // the persistence stores by the Rust settings controller and pushed here; // changes flow back through the settings-bool / settings-select callbacks. export global SettingsState { // Sub-section: 0 = Audio, 1 = Playback. in-out property section: 0; in property loading: true; // Audio — dropdowns. Each list is paired with a selected index; the // Rust controller owns the index -> value mapping. in-out property <[string]> backends: []; in-out property backend-index: 0; in-out property <[string]> devices: []; in-out property device-index: 0; in-out property <[string]> sample-rates: []; in-out property sample-rate-index: 0; // Audio — toggles. in-out property exclusive-mode: false; in-out property dac-passthrough: false; in-out property pw-force-bitperfect: false; in-out property gapless: true; in-out property normalization: false; in-out property allow-quality-fallback: false; // Playback. in-out property <[string]> autoplay-modes: []; in-out property autoplay-index: 0; in-out property show-context-icon: false; in-out property persist-session: false; in-out property resume-position: false; } export global NavState { in-out property view: ContentView.home; } // Artist detail screen state. export global ArtistState { in property name; in property bio; in property artwork; in property <[AlbumTrackItem]> top-tracks: []; in property <[AlbumCardItem]> releases: []; in property loading: false; } // Authenticated user, for the header user element. export global SessionState { in property user-name: ""; }