App: store assembly elements in slab

This commit is contained in:
Aaron Fenyes 2024-09-22 02:21:45 -07:00
parent 78f8ef8215
commit d121385c18
5 changed files with 45 additions and 40 deletions

View file

@ -12,8 +12,8 @@ pub fn Outline() -> View {
state.assembly.elements
.get_clone()
.into_iter()
.sorted_by_key(|(id, _)| id.clone())
.map(|(_, elt)| elt)
.sorted_by_key(|elt| elt.id.clone())
.collect()
});
@ -29,9 +29,8 @@ pub fn Outline() -> View {
view=|elt| {
let state = use_context::<AppState>();
let class = create_memo({
let id = elt.id.clone();
move || {
if state.selection.with(|sel| sel.contains(&id)) {
if state.selection.with(|sel| sel.contains(&elt.key)) {
"selected"
} else {
""
@ -50,37 +49,35 @@ pub fn Outline() -> View {
class=class.get(),
tabindex="0",
on:click={
let id = elt.id.clone();
move |event: MouseEvent| {
if event.shift_key() {
state.selection.update(|sel| {
if !sel.remove(&id) {
sel.insert(id.clone());
if !sel.remove(&elt.key) {
sel.insert(elt.key);
}
});
} else {
state.selection.update(|sel| {
sel.clear();
sel.insert(id.clone());
sel.insert(elt.key);
});
}
event.stop_propagation();
}
},
on:keydown={
let id = elt.id.clone();
move |event: KeyboardEvent| {
if event.key() == "Enter" {
if event.shift_key() {
state.selection.update(|sel| {
if !sel.remove(&id) {
sel.insert(id.clone());
if !sel.remove(&elt.key) {
sel.insert(elt.key);
}
});
} else {
state.selection.update(|sel| {
sel.clear();
sel.insert(id.clone());
sel.insert(elt.key);
});
}
event.prevent_default();
@ -93,7 +90,7 @@ pub fn Outline() -> View {
}
}
},
key=|elt| elt.id.clone()
key=|elt| elt.key
)
}
}