// 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 // (MVP ADR, sections 13 and 21). // Bundles + registers the Inter 18pt faces (compile-time embed) so the // app can render with Inter — see the FONT_TEST_INTER toggle in main.rs. import "assets/fonts/Inter_18pt-Regular.ttf"; import "assets/fonts/Inter_18pt-Medium.ttf"; import "assets/fonts/Inter_18pt-SemiBold.ttf"; import "assets/fonts/Inter_18pt-Bold.ttf"; 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 state globals so the Rust layer can populate them. export { HomeState, HomeActions, ForYouState, MixState, GenreFilterState, GenreFilterActions, AlbumState, ArtistState, NavState, SessionState, SettingsState, AlbumActions, ArtistActions, ArtworkActions, NowPlayingState, QueueState, SearchState, SearchActions, NetworkSidebarState, NetworkSidebarActions, MusicianState, MusicianActions, LabelState, LabelActions, LocationViewState, LocationViewActions, FavoritesState, FavoritesActions, PlaylistPickerState, PlaylistPickerActions, PlaylistState } 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`. export enum AppScreen { splash, login, shell } export component AppWindow inherits Window { title: "QBZ"; preferred-width: 1180px; preferred-height: 760px; min-width: 940px; min-height: 600px; background: Theme.surface-main; // Resolved by the Rust layer from the desktop environment (e.g. the // KDE Plasma general font). Empty falls back to the Slint default. in property system-font: ""; default-font-family: root.system-font; in-out property screen: AppScreen.splash; // Forwarded to the Rust layer. callback sign-in-via-browser(); callback use-system-browser(); callback start-offline(); callback open-tos(); callback open-album(string); callback open-artist(string); callback media-action(string, string, string); callback header-menu-navigate(string); callback settings-bool(string, bool); callback settings-select(string, int); callback settings-slider(string, int); callback settings-reset(); callback logout(); callback close-app(); if root.screen == AppScreen.splash: SplashScreen { } if root.screen == AppScreen.login: LoginScreen { sign-in-via-browser => { root.sign-in-via-browser(); } use-system-browser => { root.use-system-browser(); } start-offline => { root.start-offline(); } open-tos => { root.open-tos(); } } if root.screen == AppScreen.shell: AppShell { open-album(id) => { root.open-album(id); } open-artist(id) => { root.open-artist(id); } media-action(kind, id, action) => { root.media-action(kind, id, action); } header-menu-navigate(route) => { root.header-menu-navigate(route); } settings-bool(k, v) => { root.settings-bool(k, v); } settings-select(k, i) => { root.settings-select(k, i); } settings-slider(k, v) => { root.settings-slider(k, v); } settings-reset => { root.settings-reset(); } logout => { root.logout(); } close-app => { root.close-app(); } } }