54 lines
1.9 KiB
Rust
54 lines
1.9 KiB
Rust
|
use std::rc::Rc;
|
||
|
use sycamore::prelude::*;
|
||
|
|
||
|
use super::test_assembly_chooser::TestAssemblyChooser;
|
||
|
use crate::{
|
||
|
AppState,
|
||
|
assembly::{InversiveDistanceRegulator, Point, Sphere}
|
||
|
};
|
||
|
|
||
|
#[component]
|
||
|
pub fn AddRemove() -> View {
|
||
|
view! {
|
||
|
div(id="add-remove") {
|
||
|
button(
|
||
|
on:click=|_| {
|
||
|
let state = use_context::<AppState>();
|
||
|
state.assembly.insert_element_default::<Sphere>();
|
||
|
}
|
||
|
) { "Add sphere" }
|
||
|
button(
|
||
|
on:click=|_| {
|
||
|
let state = use_context::<AppState>();
|
||
|
state.assembly.insert_element_default::<Point>();
|
||
|
}
|
||
|
) { "Add point" }
|
||
|
button(
|
||
|
class="emoji", /* KLUDGE */ // for convenience, we're using an emoji as a temporary icon for this button
|
||
|
disabled={
|
||
|
let state = use_context::<AppState>();
|
||
|
state.selection.with(|sel| sel.len() != 2)
|
||
|
},
|
||
|
on:click=|_| {
|
||
|
let state = use_context::<AppState>();
|
||
|
let subjects: [_; 2] = state.selection.with(
|
||
|
// the button is only enabled when two elements are
|
||
|
// selected, so we know the cast to a two-element array
|
||
|
// will succeed
|
||
|
|sel| sel
|
||
|
.clone()
|
||
|
.into_iter()
|
||
|
.collect::<Vec<_>>()
|
||
|
.try_into()
|
||
|
.unwrap()
|
||
|
);
|
||
|
state.assembly.insert_regulator(
|
||
|
Rc::new(InversiveDistanceRegulator::new(subjects))
|
||
|
);
|
||
|
state.selection.update(|sel| sel.clear());
|
||
|
}
|
||
|
) { "🔗" }
|
||
|
TestAssemblyChooser {}
|
||
|
}
|
||
|
}
|
||
|
}
|