Files
qbz/crates/qbz-slint/ui/primitives/SelectionCheckbox.slint
T
vicrodh ea517326b7 fix(myqbz): visual round 2 — local art, checkbox-filter, circular checkboxes, quality skeleton, album header
Per the user's 2nd visual review:
- Local/Plex album art now renders in the detail rows: resolve_items backfills
  empty-art rows from the first resolved track (source-aware dispatch ->
  spawn_local_or_plex_loads with live Plex creds); to_item re-hydrates from cache.
- Type/source FILTER homologated: a LABELED filter button (FavGenreButton idiom,
  accent-fill active) + a checkbox popup; the "Select" toggle is now ICON-ONLY
  (square-check-big, no text) matching Favorites/LocalLibrary.
- New primitives/SelectionCheckbox.slint (the canonical CIRCULAR 13px selection
  checkbox, accent fill, check / minus for indeterminate). Replaced all 5 square
  MyQBZ checkboxes (detail list+grid, filter popup, builder per-row + tri-state
  select-all). KindRadio dots stay round radios (single-select, correct).
- Quality column shows a LoadingDots skeleton while resolving (not empty).
- Album view header buttons: deleted AlbumPageView's private divergent CircleAction
  copy -> the shared primitive, so it matches every other view's thickness.

CollectionsView kind-filter stays QbzSelect (single-select group-by = the app's
group-by idiom). Backend crates untouched. cargo check -p qbz-slint green.

cc
2026-06-09 13:31:31 -06:00

45 lines
1.8 KiB
Plaintext

// App-wide CIRCULAR selection checkbox — the canonical multi-select / select-all
// idiom shared by TrackRow (single) and LocalLibraryView's TreeRow (tri-state).
// 13px, fully rounded (border-radius 6.5px), accent fill when on/partial, an 8px
// white check.svg (on) or minus.svg (partial/indeterminate). NOT the square
// `QbzCheckbox` (4px radius — that is for Settings/Login only). Centralizes the
// spec verbatim so every multi-select row matches (homologation; the prior
// MyQBZ square copies were the divergence).
import { Theme } from "../foundation/semantic-colors.slint";
import { QbzIcon } from "QbzIcon.slint";
export component SelectionCheckbox inherits Rectangle {
// Checked (fully selected).
in property <bool> checked: false;
// Indeterminate / partial (folder with some-but-not-all selected). When set
// the box fills accent and renders minus.svg instead of a check.
in property <bool> partial: false;
callback toggled();
width: 13px;
height: 13px;
border-radius: 6.5px;
background: (root.checked || root.partial) ? Theme.accent : transparent;
border-width: (root.checked || root.partial) ? 0px : 1.5px;
border-color: cb-ta.has-hover ? Theme.text-primary : Theme.text-muted;
animate background { duration: 120ms; }
QbzIcon {
source: root.partial
? @image-url("../assets/icons/minus.svg")
: @image-url("../assets/icons/check.svg");
visible: root.checked || root.partial;
width: 8px;
height: 8px;
x: Math.round((parent.width - self.width) / 2 / 1px) * 1px;
y: Math.round((parent.height - self.height) / 2 / 1px) * 1px;
tint: #ffffff;
}
cb-ta := TouchArea {
mouse-cursor: pointer;
clicked => { root.toggled(); }
}
}