Slint cannot split the .slint compilation across crates, but a Slint LIBRARY crate exposes its generated Rust types to dependent crates (verified with a minimal proof). So: - NEW crate `qbz-ui` (lib): owns the whole .slint tree + build.rs + bundled translations; `slint::include_modules!()` + the generated types (AppWindow, MiniPlayerWindow, all globals/structs) are re-exported. Translation domain is now `qbz-ui` (the .po files renamed accordingly). - `qbz-slint` (bin) -> renamed to `qbz` (package + `[[bin]] name = "qbz"`), reclaiming the binary name from the retired Tauri app. It depends on `qbz-ui` and does `pub use qbz_ui::*;` so existing `crate::AppWindow` / `crate::*State` references resolve unchanged. This splits the single ~20 GB rustc into two crates (UI/codegen vs the 75k LOC of logic) — the foundation for lower build peak, incremental caching, and the upcoming per-feature crate extraction. Also fixed for the move: qbz-i18n bundled-.po include paths, the font/WGSL `include_bytes!`/`include_str!` paths (-> ../../qbz-ui/ui/), workspace members, dev scripts (`-p qbz`), and the CI workflows. `cargo check -p qbz` is green. cc
43 lines
1.3 KiB
Plaintext
43 lines
1.3 KiB
Plaintext
// One settings row — a label and optional description on the left, the
|
|
// control (toggle or select, passed as a child) on the right.
|
|
|
|
import { Theme } from "../foundation/semantic-colors.slint";
|
|
import { Typography } from "../foundation/typography.slint";
|
|
|
|
export component SettingRow inherits HorizontalLayout {
|
|
in property <string> label;
|
|
in property <string> description;
|
|
in property <bool> enabled: true;
|
|
// Audit marker: when true, the label renders red to flag a setting
|
|
// that is NOT wired and will NOT survive the Tauri -> Slint migration
|
|
// (a dead-end placeholder, not pending work). Default false.
|
|
in property <bool> unsupported: false;
|
|
|
|
height: root.description == "" ? 52px : 64px;
|
|
spacing: 24px;
|
|
|
|
VerticalLayout {
|
|
alignment: center;
|
|
horizontal-stretch: 1;
|
|
spacing: 3px;
|
|
opacity: root.enabled ? 1.0 : 0.45;
|
|
Text {
|
|
text: root.label;
|
|
color: root.unsupported ? #ef4444 : Theme.text-primary;
|
|
font-size: Typography.body;
|
|
font-weight: Typography.medium;
|
|
}
|
|
if root.description != "": Text {
|
|
text: root.description;
|
|
color: Theme.text-muted;
|
|
font-size: 12px;
|
|
wrap: word-wrap;
|
|
}
|
|
}
|
|
|
|
VerticalLayout {
|
|
alignment: center;
|
|
@children
|
|
}
|
|
}
|