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:
parent
96afad0c97
commit
96f8b6b5f3
5 changed files with 89 additions and 53 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue