App: store selection in hash map

Switch `Assembly.elements` to a hash map too, since that's probably
closer to what we'll want in the future.
This commit is contained in:
Aaron Fenyes 2024-09-19 16:08:55 -07:00
parent 96afad0c97
commit 96f8b6b5f3
5 changed files with 89 additions and 53 deletions

View file

@ -6,25 +6,33 @@ use crate::AppState;
#[component]
pub fn Outline() -> View {
let state = use_context::<AppState>();
// sort the elements alphabetically by ID
let elements_sorted = create_memo(move ||
let elements_sorted = create_memo(|| {
let state = use_context::<AppState>();
state.assembly.elements
.get_clone()
.into_iter()
.sorted_by_key(|elt| elt.id.clone())
.sorted_by_key(|(id, _)| id.clone())
.map(|(_, elt)| elt)
.collect()
);
});
view! {
ul {
Keyed(
list=elements_sorted,
view=|elt| {
let class = create_memo(move ||
if elt.selected.get() { "selected" } else { "" }
);
let state = use_context::<AppState>();
let class = create_memo({
let id = elt.id.clone();
move || {
if state.selection.with(|sel| sel.contains(&id)) {
"selected"
} else {
""
}
}
});
let label = elt.label.clone();
let rep_components = elt.rep.iter().map(|u| {
let u_coord = u.to_string().replace("-", "\u{2212}");
@ -36,13 +44,27 @@ pub fn Outline() -> View {
li(
class=class.get(),
tabindex="0",
on:click=move |_| {
elt.selected.set_fn(|sel| !sel);
on:click={
let id = elt.id.clone();
move |_| {
state.selection.update(|sel| {
if !sel.remove(&id) {
sel.insert(id.clone());
}
});
}
},
on:keydown=move |event: KeyboardEvent| {
if event.key() == "Enter" {
elt.selected.set_fn(|sel| !sel);
event.prevent_default();
on:keydown={
let id = elt.id.clone();
move |event: KeyboardEvent| {
if event.key() == "Enter" {
state.selection.update(|sel| {
if !sel.remove(&id) {
sel.insert(id.clone());
}
});
event.prevent_default();
}
}
}
) {