feat(slint): cast picker modal + cast teardown on logout/exit (Phase 4)

- CastPicker.slint: real modal (scrim + 400px card) replacing the static
  PlayerBar/PlayerBarSmall cast-menu PopupWindow stubs. Two rectangular tabs
  (Chromecast/DLNA, no pills, plain count) + per-tab device list from
  CastState.devices, connect-on-click (DLNA rows gate on can-play), connected
  banner with Disconnect + delivered-quality line (D3), scanning/empty states,
  error line. Mounted last in AppShell (on top).
- PlayerBar + PlayerBarSmall cast buttons now open the modal
  (CastState.picker-open = true; CastActions.open()) instead of the dead popup.
- Cast teardown wired: shutdown() on logout (fixes the Tauri connection + poll
  leak #33) and best-effort on app exit (renderer Stop + media server, #32).

cargo check -p qbz-slint: clean (only the 6 pre-existing warnings).

cc
This commit is contained in:
vicrodh committed 2026-06-18 10:04:59 -06:00
1 parent 3e1101ff64
commit 6429273d77
6 files changed
+346 -179

No files matched your search

+7
View File
@@ -36,6 +36,7 @@ import { TrackInfoModal } from "../album/TrackInfoModal.slint";
import { AlbumCreditsModal } from "../album/AlbumCreditsModal.slint";
import { ImmersiveView } from "../immersive/ImmersiveView.slint";
import { QconnectDevModal } from "QconnectDevModal.slint";
import { CastPicker } from "CastPicker.slint";
import { DiscoverConfigModal } from "../discover/DiscoverConfigModal.slint";
import { DragGhost } from "../primitives/DragGhost.slint";
import { Toast } from "../primitives/Toast.slint";
@@ -522,6 +523,12 @@ export component AppShell inherits Rectangle {
height: 100%;
}
// Cast (Chromecast / DLNA) device picker.
CastPicker {
width: 100%;
height: 100%;
}
// Floating track-drag ghost (follows the cursor, on top of all).
DragGhost { }