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

96 lines
3.9 KiB
Rust
Raw Normal View History

2024-09-13 00:07:49 -07:00
use itertools::Itertools;
use sycamore::{prelude::*, web::tags::div};
2024-09-19 17:53:07 -07:00
use web_sys::{KeyboardEvent, MouseEvent};
use crate::AppState;
#[component]
pub fn Outline() -> View {
2024-09-13 00:07:49 -07:00
// sort the elements alphabetically by ID
let elements_sorted = create_memo(|| {
let state = use_context::<AppState>();
2024-09-13 00:40:34 -07:00
state.assembly.elements
2024-09-13 00:07:49 -07:00
.get_clone()
.into_iter()
.sorted_by_key(|(_, elt)| elt.id.clone())
2024-09-13 00:07:49 -07:00
.collect()
});
2024-09-13 00:07:49 -07:00
view! {
2024-09-19 17:53:07 -07:00
ul(
on:click={
let state = use_context::<AppState>();
move |_| state.selection.update(|sel| sel.clear())
}
) {
Keyed(
2024-09-13 00:07:49 -07:00
list=elements_sorted,
view=|(key, elt)| {
let state = use_context::<AppState>();
let class = create_memo({
move || {
if state.selection.with(|sel| sel.contains(&key)) {
"selected"
} else {
""
}
}
});
2024-09-12 22:36:54 -07:00
let label = elt.label.clone();
2024-09-13 00:43:19 -07: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 14:53:12 -07:00
/* [TO DO] switch to integer-valued parameters whenever
that becomes possible again */
2024-09-16 11:29:44 -07:00
li(
class=class.get(),
tabindex="0",
on:click={
2024-09-19 17:53:07 -07:00
move |event: MouseEvent| {
if event.shift_key() {
state.selection.update(|sel| {
if !sel.remove(&key) {
sel.insert(key);
2024-09-19 17:53:07 -07:00
}
});
} else {
state.selection.update(|sel| {
sel.clear();
sel.insert(key);
2024-09-19 17:53:07 -07:00
});
}
event.stop_propagation();
}
2024-09-16 11:29:44 -07:00
},
on:keydown={
move |event: KeyboardEvent| {
if event.key() == "Enter" {
2024-09-19 17:53:07 -07:00
if event.shift_key() {
state.selection.update(|sel| {
if !sel.remove(&key) {
sel.insert(key);
2024-09-19 17:53:07 -07:00
}
});
} else {
state.selection.update(|sel| {
sel.clear();
sel.insert(key);
2024-09-19 17:53:07 -07:00
});
}
event.prevent_default();
}
2024-09-16 11:29:44 -07:00
}
}
) {
2024-09-12 22:36:54 -07:00
div(class="elt-label") { (label) }
div(class="elt-rep") { (rep_components) }
}
}
},
key=|(key, _)| key.clone()
)
}
}
}