Compare commits

..

1 Commits

Author SHA1 Message Date
Aaron Fenyes
8daef5f71e Key element outline items by assembly
Introduce an assembly serial number, which increments when we load a new
assembly. Include it in each element outline item's diff key.
2024-11-15 17:15:36 -08:00
3 changed files with 16 additions and 7 deletions

View File

@ -148,6 +148,9 @@ pub fn AddRemove() -> View {
assembly.elements_by_id.update(|elts_by_id| elts_by_id.clear());
state.selection.update(|sel| sel.clear());
// increment assembly serial number
state.assembly_serial.set_fn_silent(|serial| serial.wrapping_add(1));
// load assembly
match name.as_str() {
"general" => load_gen_assemb(assembly),

View File

@ -15,6 +15,7 @@ use outline::Outline;
#[derive(Clone)]
struct AppState {
assembly: Assembly,
assembly_serial: Signal<u32>,
selection: Signal<FxHashSet<ElementKey>>
}
@ -22,6 +23,7 @@ impl AppState {
fn new() -> AppState {
AppState {
assembly: Assembly::new(),
assembly_serial: create_signal(1),
selection: create_signal(FxHashSet::default())
}
}

View File

@ -180,11 +180,15 @@ pub fn Outline() -> View {
// list the elements alphabetically by ID
let element_list = state.assembly.elements.map(
|elts| elts
.clone()
.into_iter()
.sorted_by_key(|(_, elt)| elt.id.clone())
.collect()
move |elts| {
let asm_serial = state.assembly_serial.get_untracked();
elts
.clone()
.into_iter()
.sorted_by_key(|(_, elt)| elt.id.clone())
.map(|(key, elt)| (asm_serial, key, elt))
.collect()
}
);
view! {
@ -197,10 +201,10 @@ pub fn Outline() -> View {
) {
Keyed(
list=element_list,
view=|(key, elt)| view! {
view=|(_, key, elt)| view! {
ElementOutlineItem(key=key, element=elt)
},
key=|(key, _)| key.clone()
key=|(asm_serial, key, _)| (asm_serial.clone(), key.clone())
)
}
}