dyna3/app-proto/sketch-outline/src/app.rs

70 lines
2.3 KiB
Rust
Raw Normal View History

2024-09-13 07:07:49 +00:00
use itertools::Itertools;
use nalgebra::DVector;
use sycamore::{prelude::*, web::tags::div};
2024-09-13 07:40:34 +00:00
use crate::assembly::{Assembly, Element};
2024-09-13 05:39:21 +00:00
struct AppState {
2024-09-13 07:40:34 +00:00
assembly: Assembly
}
#[component]
2024-09-13 05:39:21 +00:00
pub fn App() -> View {
let state = AppState {
2024-09-13 07:40:34 +00:00
assembly: Assembly {
elements: create_signal(vec![
Element {
id: String::from("wing_a"),
label: String::from("Wing A"),
color: [1.00_f32, 0.25_f32, 0.00_f32],
rep: DVector::<f64>::from_column_slice(&[0.5, 0.5, 0.0, 0.5, -0.25])
},
Element {
id: String::from("wing_b"),
label: String::from("Wing B"),
color: [1.00_f32, 0.25_f32, 0.00_f32],
rep: DVector::<f64>::from_column_slice(&[-0.5, -0.5, 0.0, 0.5, -0.25])
},
Element {
id: String::from("central"),
label: String::from("Central"),
color: [0.75_f32, 0.75_f32, 0.75_f32],
rep: DVector::<f64>::from_column_slice(&[0.0, 0.0, 0.0, 0.25, -1.0])
}
])
}
};
2024-09-13 07:07:49 +00:00
// sort the elements alphabetically by ID
let elements_sorted = create_memo(move ||
2024-09-13 07:40:34 +00:00
state.assembly.elements
2024-09-13 07:07:49 +00:00
.get_clone()
.into_iter()
.sorted_by_key(|elt| elt.id.clone())
.collect()
);
view! {
ul {
Keyed(
2024-09-13 07:07:49 +00:00
list=elements_sorted,
view=|elt| {
2024-09-13 05:36:54 +00:00
let label = elt.label.clone();
2024-09-13 07:43:19 +00:00
let rep_components = elt.rep.iter().map(|u| {
let u_coord = u.to_string().replace("-", "\u{2212}");
View::from(div().children(u_coord))
}).collect::<Vec<_>>();
view! {
2024-09-13 21:53:12 +00:00
/* [TO DO] switch to integer-valued parameters whenever
that becomes possible again */
li(tabindex="0") {
2024-09-13 05:36:54 +00:00
div(class="elt-label") { (label) }
div(class="elt-rep") { (rep_components) }
}
}
},
2024-09-13 05:36:54 +00:00
key=|elt| elt.id.clone()
)
}
}
}