Clean up the outline view #19

Merged
glen merged 23 commits from outline-cleanup_on_main into main 2024-11-15 03:32:48 +00:00
3 changed files with 28 additions and 25 deletions
Showing only changes of commit ce9b114dd6 - Show all commits

View File

@ -12,7 +12,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Castor"), label: String::from("Castor"),
color: [1.00_f32, 0.25_f32, 0.00_f32], color: [1.00_f32, 0.25_f32, 0.00_f32],
representation: engine::sphere(0.5, 0.5, 0.0, 1.0), representation: engine::sphere(0.5, 0.5, 0.0, 1.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -22,7 +22,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Pollux"), label: String::from("Pollux"),
color: [0.00_f32, 0.25_f32, 1.00_f32], color: [0.00_f32, 0.25_f32, 1.00_f32],
representation: engine::sphere(-0.5, -0.5, 0.0, 1.0), representation: engine::sphere(-0.5, -0.5, 0.0, 1.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -32,7 +32,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Ursa major"), label: String::from("Ursa major"),
color: [0.25_f32, 0.00_f32, 1.00_f32], color: [0.25_f32, 0.00_f32, 1.00_f32],
representation: engine::sphere(-0.5, 0.5, 0.0, 0.75), representation: engine::sphere(-0.5, 0.5, 0.0, 0.75),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -42,7 +42,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Ursa minor"), label: String::from("Ursa minor"),
color: [0.25_f32, 1.00_f32, 0.00_f32], color: [0.25_f32, 1.00_f32, 0.00_f32],
representation: engine::sphere(0.5, -0.5, 0.0, 0.5), representation: engine::sphere(0.5, -0.5, 0.0, 0.5),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -52,7 +52,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Deimos"), label: String::from("Deimos"),
color: [0.75_f32, 0.75_f32, 0.00_f32], color: [0.75_f32, 0.75_f32, 0.00_f32],
representation: engine::sphere(0.0, 0.15, 1.0, 0.25), representation: engine::sphere(0.0, 0.15, 1.0, 0.25),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -62,7 +62,7 @@ fn load_gen_assemb(assembly: &Assembly) {
label: String::from("Phobos"), label: String::from("Phobos"),
color: [0.00_f32, 0.75_f32, 0.50_f32], color: [0.00_f32, 0.75_f32, 0.50_f32],
representation: engine::sphere(0.0, -0.15, -1.0, 0.25), representation: engine::sphere(0.0, -0.15, -1.0, 0.25),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -77,7 +77,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Central".to_string(), label: "Central".to_string(),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: engine::sphere(0.0, 0.0, 0.0, 1.0), representation: engine::sphere(0.0, 0.0, 0.0, 1.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -87,7 +87,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Assembly plane".to_string(), label: "Assembly plane".to_string(),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: engine::sphere_with_offset(0.0, 0.0, 1.0, 0.0, 0.0), representation: engine::sphere_with_offset(0.0, 0.0, 1.0, 0.0, 0.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -97,7 +97,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Side 1".to_string(), label: "Side 1".to_string(),
color: [1.00_f32, 0.00_f32, 0.25_f32], color: [1.00_f32, 0.00_f32, 0.25_f32],
representation: engine::sphere_with_offset(1.0, 0.0, 0.0, 1.0, 0.0), representation: engine::sphere_with_offset(1.0, 0.0, 0.0, 1.0, 0.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -107,7 +107,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Side 2".to_string(), label: "Side 2".to_string(),
color: [0.25_f32, 1.00_f32, 0.00_f32], color: [0.25_f32, 1.00_f32, 0.00_f32],
representation: engine::sphere_with_offset(-0.5, a, 0.0, 1.0, 0.0), representation: engine::sphere_with_offset(-0.5, a, 0.0, 1.0, 0.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -117,7 +117,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Side 3".to_string(), label: "Side 3".to_string(),
color: [0.00_f32, 0.25_f32, 1.00_f32], color: [0.00_f32, 0.25_f32, 1.00_f32],
representation: engine::sphere_with_offset(-0.5, -a, 0.0, 1.0, 0.0), representation: engine::sphere_with_offset(-0.5, -a, 0.0, 1.0, 0.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -127,7 +127,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Corner 1".to_string(), label: "Corner 1".to_string(),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: engine::sphere(-4.0/3.0, 0.0, 0.0, 1.0/3.0), representation: engine::sphere(-4.0/3.0, 0.0, 0.0, 1.0/3.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -137,7 +137,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: "Corner 2".to_string(), label: "Corner 2".to_string(),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: engine::sphere(2.0/3.0, -4.0/3.0 * a, 0.0, 1.0/3.0), representation: engine::sphere(2.0/3.0, -4.0/3.0 * a, 0.0, 1.0/3.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -147,7 +147,7 @@ fn load_low_curv_assemb(assembly: &Assembly) {
label: String::from("Corner 3"), label: String::from("Corner 3"),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: engine::sphere(2.0/3.0, 4.0/3.0 * a, 0.0, 1.0/3.0), representation: engine::sphere(2.0/3.0, 4.0/3.0 * a, 0.0, 1.0/3.0),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );

View File

@ -19,7 +19,7 @@ pub struct Element {
pub label: String, pub label: String,
pub color: ElementColor, pub color: ElementColor,
pub representation: DVector<f64>, pub representation: DVector<f64>,
pub constraints: BTreeSet<ConstraintKey>, pub constraints: Signal<BTreeSet<ConstraintKey>>,
// the configuration matrix column index that was assigned to this element // the configuration matrix column index that was assigned to this element
// last time the assembly was realized // last time the assembly was realized
@ -97,7 +97,7 @@ impl Assembly {
label: format!("Sphere {}", id_num), label: format!("Sphere {}", id_num),
color: [0.75_f32, 0.75_f32, 0.75_f32], color: [0.75_f32, 0.75_f32, 0.75_f32],
representation: DVector::<f64>::from_column_slice(&[0.0, 0.0, 0.0, 0.5, -0.5]), representation: DVector::<f64>::from_column_slice(&[0.0, 0.0, 0.0, 0.5, -0.5]),
constraints: BTreeSet::default(), constraints: create_signal(BTreeSet::default()),
index: 0 index: 0
} }
); );
@ -106,10 +106,11 @@ impl Assembly {
pub fn insert_constraint(&self, constraint: Constraint) { pub fn insert_constraint(&self, constraint: Constraint) {
let subjects = constraint.subjects; let subjects = constraint.subjects;
let key = self.constraints.update(|csts| csts.insert(constraint)); let key = self.constraints.update(|csts| csts.insert(constraint));
self.elements.update(|elts| { let subject_constraints = self.elements.with(
elts[subjects.0].constraints.insert(key); |elts| (elts[subjects.0].constraints, elts[subjects.1].constraints)
elts[subjects.1].constraints.insert(key); );
}); subject_constraints.0.update(|csts| csts.insert(key));
subject_constraints.1.update(|csts| csts.insert(key));
} }
// --- realization --- // --- realization ---

View File

@ -76,7 +76,10 @@ fn ElementOutlineItem(key: ElementKey, element: assembly::Element) -> View {
let u_coord = format!("{:.3}", u).replace("-", "\u{2212}"); let u_coord = format!("{:.3}", u).replace("-", "\u{2212}");
View::from(div().children(u_coord)) View::from(div().children(u_coord))
}).collect::<Vec<_>>(); }).collect::<Vec<_>>();
let constrained = element.constraints.len() > 0; let constrained = element.constraints.map(|csts| csts.len() > 0);
let constraint_list = element.constraints.map(
|csts| csts.clone().into_iter().collect()
);
let details_node = create_node_ref(); let details_node = create_node_ref();
view! { view! {
glen marked this conversation as resolved
Review

What's the "native" form of event.key()? Seems a pity to convert it to a str just to match it against three options. Can't constants of the actual values of the three options (before str conversion), perhaps defined above if need be, be used in place?

What's the "native" form of event.key()? Seems a pity to convert it to a str just to match it against three options. Can't constants of the actual values of the three options (before str conversion), perhaps defined above if need be, be used in place?
Review

The key method returns a String (a heap-allocated, variable-length string object). Each of the string literals we're matching with is a &str (a reference to a "string slice," which seems to be a pointer to a fixed-length string of bytes). An explicit conversion is required, and as_str seems to be the standard way to do it.

The [`key`](https://docs.rs/web-sys/latest/web_sys/struct.KeyboardEvent.html#method.key) method returns a [`String`](https://doc.rust-lang.org/nightly/alloc/string/struct.String.html) (a heap-allocated, variable-length string object). Each of the string literals we're matching with is a [`&str`](https://doc.rust-lang.org/nightly/core/primitive.str.html) (a reference to a "string slice," which seems to be a pointer to a fixed-length string of bytes). An explicit conversion is required, and [`as_str`](https://doc.rust-lang.org/nightly/alloc/string/struct.String.html#method.as_str) seems to be the [standard way](https://stackoverflow.com/questions/25383488/how-to-match-a-string-against-string-literals?rq=3) to do it.
Review

Oh, gotcha. A Rustism I was not yet used to. Hope you can see why it looked odd.

Oh, gotcha. A Rustism I was not yet used to. Hope you can see why it looked odd.
Review

Yup. Stuff like "hello".to_string() looked even weirder to me at first, but the Rust book authors seem to consider it the most idiomatic way of going in the other direction...

Yup. Stuff like `"hello".to_string()` looked even weirder to me at first, but the Rust book authors seem to consider it the most idiomatic way of going in the other direction...
Review

Well yes in fact that looks so weird that I believe that in husht we will implement a labeled-literal syntax like s"hello" for exactly this. Note that room has been left in the Rust syntax for such a thing, it's just not part of the language (yet, anyway).

Well yes in fact that looks so weird that I believe that in husht we will implement a labeled-literal syntax like `s"hello"` for exactly this. Note that room has been left in the Rust syntax for such a thing, it's just not part of the language (yet, anyway).
li { li {
@ -101,7 +104,7 @@ fn ElementOutlineItem(key: ElementKey, element: assembly::Element) -> View {
} }
event.prevent_default(); event.prevent_default();
}, },
"ArrowRight" if constrained => { "ArrowRight" if constrained.get() => {
let _ = details_node let _ = details_node
.get() .get()
.unchecked_into::<web_sys::Element>() .unchecked_into::<web_sys::Element>()
@ -150,7 +153,7 @@ fn ElementOutlineItem(key: ElementKey, element: assembly::Element) -> View {
} }
ul(class="constraints") { ul(class="constraints") {
Keyed( Keyed(
list=element.constraints.into_iter().collect::<Vec<_>>(), list=constraint_list,
view=move |cst_key| view! { view=move |cst_key| view! {
ConstraintOutlineItem( ConstraintOutlineItem(
constraint_key=cst_key, constraint_key=cst_key,
@ -200,8 +203,7 @@ pub fn Outline() -> View {
key.clone(), key.clone(),
elt.id.clone(), elt.id.clone(),
elt.label.clone(), elt.label.clone(),
elt.rep.into_iter().map(|u| u.to_bits()).collect::<Vec<_>>(), elt.representation.into_iter().map(|u| u.to_bits()).collect::<Vec<_>>()
elt.constraints.clone()
) )
) )
} }