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
45 lines
1.8 KiB
Plaintext
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(); }
|
|
}
|
|
}
|