From 5be70675eec340a466f42840cac5dc278acd7731 Mon Sep 17 00:00:00 2001 From: Emilia Date: Wed, 24 May 2023 11:20:12 -0400 Subject: [PATCH] Allow selection of plates in tree --- assets/css/global.css | 3 + src/components/plates/destination_plate.rs | 2 + src/components/plates/plate_container.rs | 7 ++- src/components/plates/source_plate.rs | 2 + src/components/states.rs | 2 + src/components/transfer_menu.rs | 4 ++ src/components/tree.rs | 65 +++++++++++++++++----- src/data/transfer.rs | 4 +- 8 files changed, 72 insertions(+), 17 deletions(-) diff --git a/assets/css/global.css b/assets/css/global.css index 5081583..1709ef5 100644 --- a/assets/css/global.css +++ b/assets/css/global.css @@ -34,6 +34,9 @@ div.tree { div.tree li { user-select: none; } +div.tree li.selected { + background: rgba(0,0,150,0.2); +} div.transfer_menu { grid-column: left / left; diff --git a/src/components/plates/destination_plate.rs b/src/components/plates/destination_plate.rs index 28e428a..cde6ac8 100644 --- a/src/components/plates/destination_plate.rs +++ b/src/components/plates/destination_plate.rs @@ -70,6 +70,8 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { if let Some(br) = *m_end_handle { if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { dispatch.set(NewTransferState { + source_id: current.source_id, + destination_id: current.destination_id, source_region: current.source_region.clone(), destination_region: rd, interleave_x: current.interleave_x, diff --git a/src/components/plates/plate_container.rs b/src/components/plates/plate_container.rs index 9e5910f..bb9186d 100644 --- a/src/components/plates/plate_container.rs +++ b/src/components/plates/plate_container.rs @@ -1,6 +1,9 @@ #![allow(non_snake_case)] use yew::prelude::*; - use super::source_plate::SourcePlate; +use yewdux::prelude::*; +use super::super::states::MainState; + +use super::source_plate::SourcePlate; use super::destination_plate::DestinationPlate; #[derive(Properties, PartialEq)] @@ -11,6 +14,8 @@ pub struct PlateContainerProps { #[function_component] pub fn PlateContainer(props: &PlateContainerProps) -> Html { + let (state, dispatch) = use_store::(); + html! {
diff --git a/src/components/plates/source_plate.rs b/src/components/plates/source_plate.rs index 011670e..74638c4 100644 --- a/src/components/plates/source_plate.rs +++ b/src/components/plates/source_plate.rs @@ -70,6 +70,8 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { if let Some(br) = *m_end_handle { if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { dispatch.set(NewTransferState { + source_id: current.source_id, + destination_id: current.destination_id, source_region: rd, destination_region: current.destination_region.clone(), interleave_x: current.interleave_x, diff --git a/src/components/states.rs b/src/components/states.rs index a929a42..6dd5984 100644 --- a/src/components/states.rs +++ b/src/components/states.rs @@ -10,6 +10,8 @@ use crate::data::plate::*; #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, Store)] #[store(storage = "session")] pub struct NewTransferState { + pub source_id: Uuid, + pub destination_id: Uuid, pub source_region: RegionDisplay, pub destination_region: RegionDisplay, pub interleave_x: u8, diff --git a/src/components/transfer_menu.rs b/src/components/transfer_menu.rs index 20447ed..91c3610 100644 --- a/src/components/transfer_menu.rs +++ b/src/components/transfer_menu.rs @@ -25,6 +25,8 @@ pub fn TransferMenu() -> Html { if let Some(input) = input { if let Ok(rd) = RegionDisplay::try_from(input.value()) { dispatch.set( NewTransferState { + source_id: state.source_id, + destination_id: state.destination_id, source_region: rd, destination_region: state.destination_region.clone(), interleave_x: state.interleave_x, @@ -48,6 +50,8 @@ pub fn TransferMenu() -> Html { if let Some(input) = input { if let Ok(rd) = RegionDisplay::try_from(input.value()) { dispatch.set( NewTransferState { + source_id: state.source_id, + destination_id: state.destination_id, source_region: state.source_region.clone(), destination_region: rd, interleave_x: state.interleave_x, diff --git a/src/components/tree.rs b/src/components/tree.rs index 375e148..3fd0a3b 100644 --- a/src/components/tree.rs +++ b/src/components/tree.rs @@ -8,7 +8,7 @@ use yewdux::prelude::*; use crate::data::{plate_instances::PlateInstance, transfer::Transfer}; use crate::data::plate::*; -use crate::components::states::MainState; +use crate::components::states::{MainState, NewTransferState}; #[derive(PartialEq, Properties)] pub struct TreeProps { @@ -17,11 +17,12 @@ pub struct TreeProps { #[function_component] pub fn Tree(props: &TreeProps) -> Html { - let (state, dispatch) = use_store::(); - let plate_menu_id: UseStateHandle> = use_state(|| {None}); + let (main_state, main_dispatch) = use_store::(); + let (selection_state, selection_dispatch) = use_store::(); + let plate_modal_id: UseStateHandle> = use_state(|| {None}); let open_plate_info_callback = { - let plate_menu_id =plate_menu_id.clone(); + let plate_menu_id =plate_modal_id.clone(); Callback::from(move |e: MouseEvent| { let target: Option = e.target(); let li = target.and_then(|t| t.dyn_into::().ok()); @@ -33,14 +34,14 @@ pub fn Tree(props: &TreeProps) -> Html { }) }; let plate_info_close_callback = { - let plate_menu_id =plate_menu_id.clone(); + let plate_menu_id =plate_modal_id.clone(); Callback::from(move |_| { plate_menu_id.set(None); }) }; let plate_info_delete_callback = { - let dispatch = dispatch.clone(); - let plate_menu_id =plate_menu_id.clone(); + let dispatch = main_dispatch.clone(); + let plate_menu_id = plate_modal_id.clone(); Callback::from(move |_| { if let Some(id) = *plate_menu_id { dispatch.reduce_mut(|state| { @@ -49,16 +50,52 @@ pub fn Tree(props: &TreeProps) -> Html { } }) }; + let source_plate_select_callback = { + let dispatch = selection_dispatch.clone(); + Callback::from(move |e: MouseEvent| { + let target: Option = e.target(); + let li = target.and_then(|t| t.dyn_into::().ok()); + if let Some(li) = li { + if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) { + dispatch.reduce_mut(|state| state.source_id = Uuid::from_u128(id)) + } + } + }) + }; + let destination_plate_select_callback = { + let dispatch = selection_dispatch.clone(); + Callback::from(move |e: MouseEvent| { + let target: Option = e.target(); + let li = target.and_then(|t| t.dyn_into::().ok()); + if let Some(li) = li { + if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) { + dispatch.reduce_mut(|state| state.destination_id = Uuid::from_u128(id)) + } + } + }) + }; - let source_plates = state.source_plates.iter() + let source_plates = main_state.source_plates.iter() .map(|spi| { html!{
  • {String::from(spi)}
  • } + ondblclick={open_plate_info_callback.clone()} + onclick={source_plate_select_callback.clone()} + class={classes!( + Some(if spi.get_uuid() == selection_state.source_id {Some("selected")} + else {None}) + )}> + {String::from(spi)} + } }).collect::(); - let dest_plates = state.destination_plates.iter() - .map(|spi| { - html!{
  • {String::from(spi)}
  • } + let dest_plates = main_state.destination_plates.iter() + .map(|dpi| { + html!{
  • {String::from(dpi)}
  • } }).collect::(); @@ -81,7 +118,7 @@ pub fn Tree(props: &TreeProps) -> Html {
    - if let Some(id) = *plate_menu_id { + if let Some(id) = *plate_modal_id { } diff --git a/src/data/transfer.rs b/src/data/transfer.rs index ce45e48..ddf0639 100644 --- a/src/data/transfer.rs +++ b/src/data/transfer.rs @@ -8,7 +8,7 @@ use super::plate_instances::*; pub struct Transfer { pub source_id: Uuid, pub dest_id: Uuid, - pub transfer: TransferRegion, + pub transfer_region: TransferRegion, } impl Transfer { @@ -16,7 +16,7 @@ impl Transfer { Self { source_id: source.get_uuid(), dest_id: dest.get_uuid(), - transfer: tr + transfer_region: tr } } }