Rename ObservableRole variants

Also rename corresponding CSS classes and add methods to check roles.
This commit is contained in:
Aaron Fenyes 2025-01-26 17:48:32 -08:00
parent 677ef47544
commit af2724f934
4 changed files with 30 additions and 16 deletions

View file

@ -127,7 +127,7 @@ details[open]:has(li) .element-switch::after {
font-style: italic; font-style: italic;
} }
.observable.invalid { .observable.invalid-constraint {
color: var(--text-invalid); color: var(--text-invalid);
} }
@ -138,7 +138,7 @@ details[open]:has(li) .element-switch::after {
border-radius: 2px; border-radius: 2px;
} }
.observable.invalid > input[type=text] { .observable.invalid-constraint > input[type=text] {
border-color: var(--border-invalid); border-color: var(--border-invalid);
} }
@ -150,11 +150,11 @@ details[open]:has(li) .element-switch::after {
font-style: normal; font-style: normal;
} }
.constrained > .status::after, details:has(.constrained):not([open]) .status::after { .valid-constraint > .status::after, details:has(.valid-constraint):not([open]) .status::after {
content: '🔗'; content: '🔗';
} }
.invalid > .status::after, details:has(.invalid):not([open]) .status::after { .invalid-constraint > .status::after, details:has(.invalid-constraint):not([open]) .status::after {
content: '⚠'; content: '⚠';
color: var(--text-invalid); color: var(--text-invalid);
} }

View file

@ -210,7 +210,7 @@ pub fn AddRemove() -> View {
} }
); );
let desired = create_signal(0.0); let desired = create_signal(0.0);
let role = create_signal(ObservableRole::Measure); let role = create_signal(ObservableRole::Measurement);
state.assembly.insert_observable(Observable { state.assembly.insert_observable(Observable {
subjects: subjects, subjects: subjects,
measured: measured, measured: measured,
@ -242,7 +242,7 @@ pub fn AddRemove() -> View {
format!("Updated constraint with subjects ({}, {})", subjects.0, subjects.1) format!("Updated constraint with subjects ({}, {})", subjects.0, subjects.1)
)); ));
desired.track(); desired.track();
if role.with(|r| matches!(r, ObservableRole::Constrain)) { if role.with(|rl| rl.is_valid_constraint()) {
state.assembly.realize(); state.assembly.realize();
} }
}); });

View file

@ -112,9 +112,17 @@ impl Element {
} }
pub enum ObservableRole { pub enum ObservableRole {
Measure, Measurement,
Constrain, Constraint(bool)
Invalid }
impl ObservableRole {
pub fn is_valid_constraint(&self) -> bool {
match self {
ObservableRole::Measurement => false,
ObservableRole::Constraint(valid) => *valid
}
}
} }
#[derive(Clone)] #[derive(Clone)]
@ -126,6 +134,12 @@ pub struct Observable {
pub role: Signal<ObservableRole> pub role: Signal<ObservableRole>
} }
impl Observable {
fn role_is_valid_constraint_untracked(&self) -> bool {
self.role.with_untracked(|role| role.is_valid_constraint())
}
}
// the velocity is expressed in uniform coordinates // the velocity is expressed in uniform coordinates
pub struct ElementMotion<'a> { pub struct ElementMotion<'a> {
pub key: ElementKey, pub key: ElementKey,
@ -236,7 +250,7 @@ impl Assembly {
let mut gram_to_be = PartialMatrix::new(); let mut gram_to_be = PartialMatrix::new();
self.observables.with_untracked(|obsls| { self.observables.with_untracked(|obsls| {
for (_, obs) in obsls { for (_, obs) in obsls {
if obs.role.with_untracked(|role| matches!(role, ObservableRole::Constrain)) { if obs.role_is_valid_constraint_untracked() {
let subjects = obs.subjects; let subjects = obs.subjects;
let row = elts[subjects.0].column_index.unwrap(); let row = elts[subjects.0].column_index.unwrap();
let col = elts[subjects.1].column_index.unwrap(); let col = elts[subjects.1].column_index.unwrap();

View file

@ -31,14 +31,14 @@ fn ObservableInput(observable: Observable) -> View {
let target: HtmlInputElement = event.target().unwrap().unchecked_into(); let target: HtmlInputElement = event.target().unwrap().unchecked_into();
let value = target.value(); let value = target.value();
if value.is_empty() { if value.is_empty() {
observable.role.set(Measure); observable.role.set(Measurement);
} else { } else {
match target.value().parse::<f64>() { match target.value().parse::<f64>() {
Ok(desired) => batch(|| { Ok(desired) => batch(|| {
observable.desired.set(desired); observable.desired.set(desired);
observable.role.set(Constrain); observable.role.set(Constraint(true));
}), }),
Err(_) => observable.role.set(Invalid) Err(_) => observable.role.set(Constraint(false))
}; };
} }
} }
@ -60,9 +60,9 @@ fn ObservableOutlineItem(observable_key: ObservableKey, element_key: ElementKey)
let other_subject_label = assembly.elements.with(|elts| elts[other_subject].label.clone()); let other_subject_label = assembly.elements.with(|elts| elts[other_subject].label.clone());
let class = observable.role.map( let class = observable.role.map(
|role| match role { |role| match role {
Measure => "observable", Measurement => "observable",
Constrain => "observable constrained", Constraint(true) => "observable valid-constraint",
Invalid => "observable invalid" Constraint(false) => "observable invalid-constraint"
} }
); );
view! { view! {