From aee565dbb3a48a87ff10c741de7da7229bc7d88f Mon Sep 17 00:00:00 2001 From: Emilia Date: Thu, 25 May 2023 12:07:21 -0400 Subject: [PATCH] Remove NewTransferState It was bad not very good design! Use CurrentTransfer instead. --- src/components/main_window.rs | 7 ++-- src/components/plates/destination_plate.rs | 12 +++---- src/components/plates/source_plate.rs | 12 +++---- src/components/states.rs | 14 ++------ src/components/transfer_menu.rs | 40 +++++++++------------- src/components/tree.rs | 37 ++++++++++++-------- 6 files changed, 55 insertions(+), 67 deletions(-) diff --git a/src/components/main_window.rs b/src/components/main_window.rs index 58512e6..31b95ec 100644 --- a/src/components/main_window.rs +++ b/src/components/main_window.rs @@ -2,7 +2,7 @@ use yew::prelude::*; use yewdux::prelude::*; -use super::states::{MainState, NewTransferState, CurrentTransfer}; +use super::states::{MainState, CurrentTransfer}; use super::plates::plate_container::PlateContainer; use super::tree::Tree; use super::transfer_menu::TransferMenu; @@ -13,11 +13,10 @@ use crate::data::plate_instances::PlateInstance; #[function_component] pub fn MainWindow() -> Html { let (main_state, main_dispatch) = use_store::(); - let (selection_state, selection_dispatch) = use_store::(); let (ct_state, ct_dispatch) = use_store::(); let source_plate_instance: Option = main_state.source_plates.iter() - .find(|spi| {spi.get_uuid() == selection_state.source_id}) + .find(|spi| {spi.get_uuid() == main_state.selected_source_plate}) .cloned(); if let Some(spi) = source_plate_instance.clone() { ct_dispatch.reduce_mut(|state| { @@ -25,7 +24,7 @@ pub fn MainWindow() -> Html { }); } let destination_plate_instance: Option = main_state.destination_plates.iter() - .find(|dpi| {dpi.get_uuid() == selection_state.destination_id}) + .find(|dpi| {dpi.get_uuid() == main_state.selected_dest_plate}) .cloned(); if let Some(dpi) = destination_plate_instance.clone() { ct_dispatch.reduce_mut(|state| { diff --git a/src/components/plates/destination_plate.rs b/src/components/plates/destination_plate.rs index 5a4dcbe..497bc7d 100644 --- a/src/components/plates/destination_plate.rs +++ b/src/components/plates/destination_plate.rs @@ -5,7 +5,7 @@ use std::rc::Rc; use crate::data::plate_instances::PlateInstance; use crate::data::transfer_region::{TransferRegion, Region}; -use crate::components::states::{NewTransferState, CurrentTransfer}; +use crate::components::states::{CurrentTransfer}; use super::super::transfer_menu::RegionDisplay; @@ -17,7 +17,6 @@ pub struct DestinationPlateProps { #[function_component] pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { - let (state, dispatch) = use_store::(); let (ct_state, ct_dispatch) = use_store::(); let m_start_handle: UseStateHandle> = use_state_eq(|| None); let m_end_handle: UseStateHandle> = use_state_eq(|| None); @@ -26,8 +25,10 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { let m_end = m_end_handle.clone(); if !(*m_stat_handle) { - let pt1 = (state.destination_region.col_start, state.destination_region.row_start); - let pt2 = (state.destination_region.col_end, state.destination_region.row_end); + let (pt1, pt2) = match ct_state.transfer.dest_region { + Region::Point((x,y)) => ((x,y),(x,y)), + Region::Rect(c1, c2) => (c1, c2), + }; m_start_handle.set(Some(pt1)); m_end_handle.set(Some(pt2)); } @@ -67,9 +68,6 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { ct_dispatch.reduce_mut(|state| { state.transfer.dest_region = Region::from(&rd); }); - dispatch.reduce_mut(|state| { - state.destination_region = rd; - }); } } } diff --git a/src/components/plates/source_plate.rs b/src/components/plates/source_plate.rs index 78f24d9..e791a58 100644 --- a/src/components/plates/source_plate.rs +++ b/src/components/plates/source_plate.rs @@ -6,7 +6,7 @@ use std::rc::Rc; use crate::data::plate_instances::PlateInstance; use crate::data::transfer_region::{TransferRegion, Region}; -use crate::components::states::{NewTransferState, CurrentTransfer}; +use crate::components::states::{CurrentTransfer}; use super::super::transfer_menu::RegionDisplay; @@ -18,7 +18,6 @@ pub struct SourcePlateProps { #[function_component] pub fn SourcePlate(props: &SourcePlateProps) -> Html { - let (state, dispatch) = use_store::(); let (ct_state, ct_dispatch) = use_store::(); let m_start_handle: UseStateHandle> = use_state_eq(|| None); let m_end_handle: UseStateHandle> = use_state_eq(|| None); @@ -27,8 +26,10 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { let m_end = m_end_handle.clone(); if !(*m_stat_handle) { - let pt1 = (state.source_region.col_start, state.source_region.row_start); - let pt2 = (state.source_region.col_end, state.source_region.row_end); + let (pt1, pt2) = match ct_state.transfer.source_region { + Region::Point((x,y)) => ((x,y),(x,y)), + Region::Rect(c1, c2) => (c1, c2), + }; m_start_handle.set(Some(pt1)); m_end_handle.set(Some(pt2)); } @@ -69,9 +70,6 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { ct_dispatch.reduce_mut(|state| { state.transfer.source_region = Region::from(&rd); }); - dispatch.reduce_mut(|state| { - state.source_region = rd; - }); } } } diff --git a/src/components/states.rs b/src/components/states.rs index 55868c6..5fc2e79 100644 --- a/src/components/states.rs +++ b/src/components/states.rs @@ -8,17 +8,6 @@ use crate::data::transfer::Transfer; use crate::data::plate::*; use crate::data::transfer_region::TransferRegion; -#[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: i8, - pub interleave_y: i8, -} - #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, Store)] #[store(storage = "session")] pub struct CurrentTransfer { @@ -30,6 +19,9 @@ pub struct MainState { pub source_plates: Vec, pub destination_plates: Vec, pub transfers: Vec, + pub selected_source_plate: Uuid, + pub selected_dest_plate: Uuid, + pub selected_transfer: Uuid, } impl Store for MainState { diff --git a/src/components/transfer_menu.rs b/src/components/transfer_menu.rs index 4dfbc05..a1f1110 100644 --- a/src/components/transfer_menu.rs +++ b/src/components/transfer_menu.rs @@ -10,15 +10,13 @@ use lazy_static::lazy_static; use crate::data::transfer_region::Region; -use super::states::{NewTransferState, CurrentTransfer}; +use super::states::{CurrentTransfer}; #[function_component] pub fn TransferMenu() -> Html { - let (state, dispatch) = use_store::(); let (ct_state, ct_dispatch) = use_store::(); let on_src_region_change = { - let dispatch = dispatch.clone(); let ct_dispatch = ct_dispatch.clone(); Callback::from(move |e: Event| { @@ -29,9 +27,6 @@ pub fn TransferMenu() -> Html { ct_dispatch.reduce_mut(|state| { state.transfer.source_region = Region::from(&rd); }); - dispatch.reduce_mut(|state| { - state.source_region = rd; - }); input.set_custom_validity(""); } else { input.set_custom_validity("Invalid region.") @@ -40,7 +35,6 @@ pub fn TransferMenu() -> Html { }) }; let on_dest_region_change = { - let dispatch = dispatch.clone(); let ct_dispatch = ct_dispatch.clone(); Callback::from(move |e: Event| { @@ -51,9 +45,6 @@ pub fn TransferMenu() -> Html { ct_dispatch.reduce_mut(|state| { state.transfer.dest_region = Region::from(&rd); }); - dispatch.reduce_mut(|state| { - state.destination_region = rd; - }); input.set_custom_validity(""); } else { input.set_custom_validity("Invalid region.") @@ -63,8 +54,6 @@ pub fn TransferMenu() -> Html { }; let on_dest_interleave_x_change = { - let dispatch = dispatch.clone(); - let ct_state = ct_state.clone(); let ct_dispatch = ct_dispatch.clone(); Callback::from(move |e: Event| { @@ -72,9 +61,6 @@ pub fn TransferMenu() -> Html { let input = target.and_then(|t| t.dyn_into::().ok()); if let Some(input) = input { if let Ok(num) = input.value().parse::() { - dispatch.reduce_mut(|state| { - state.interleave_x = num; - }); ct_dispatch.reduce_mut(|state| { state.transfer.interleave_dest = (num, state.transfer.interleave_dest.1); }); @@ -83,8 +69,6 @@ pub fn TransferMenu() -> Html { }) }; let on_dest_interleave_y_change = { - let dispatch = dispatch.clone(); - let ct_state = ct_state.clone(); let ct_dispatch = ct_dispatch.clone(); Callback::from(move |e: Event| { @@ -92,9 +76,6 @@ pub fn TransferMenu() -> Html { let input = target.and_then(|t| t.dyn_into::().ok()); if let Some(input) = input { if let Ok(num) = input.value().parse::() { - dispatch.reduce_mut(|state| { - state.interleave_y = num; - }); ct_dispatch.reduce_mut(|state| { state.transfer.interleave_dest = (state.transfer.interleave_dest.0, num); }); @@ -109,21 +90,23 @@ pub fn TransferMenu() -> Html {
+ onchange={on_src_region_change} + value={RegionDisplay::from(&ct_state.transfer.source_region).text}/>
+ onchange={on_dest_region_change} + value={RegionDisplay::from(&ct_state.transfer.dest_region).text}/>
{"Destination Interleave "} + onchange={on_dest_interleave_x_change} value={ct_state.transfer.interleave_dest.0.to_string()}/> + onchange={on_dest_interleave_y_change} value={ct_state.transfer.interleave_dest.1.to_string()}/>
@@ -167,6 +150,15 @@ impl TryFrom for RegionDisplay { } } +impl From<&Region> for RegionDisplay { + fn from(value: &Region) -> Self { + match *value { + Region::Point((col, row)) => RegionDisplay::try_from((col,row,col,row)).ok().unwrap(), + Region::Rect(c1, c2) => + RegionDisplay::try_from((c1.0,c1.1,c2.0,c2.1)).ok().unwrap() + } + } +} impl From<&RegionDisplay> for Region { fn from(value: &RegionDisplay) -> Self { if value.col_start == value.col_end && value.row_start == value.row_end { diff --git a/src/components/tree.rs b/src/components/tree.rs index ff56477..c54c653 100644 --- a/src/components/tree.rs +++ b/src/components/tree.rs @@ -6,8 +6,9 @@ use web_sys::{EventTarget, HtmlElement, HtmlDialogElement}; use yew::prelude::*; use yewdux::prelude::*; -use crate::components::states::{MainState, NewTransferState, CurrentTransfer}; +use crate::components::states::{MainState, CurrentTransfer}; use crate::components::transfer_menu::RegionDisplay; +use crate::data::transfer_region::Region; #[derive(PartialEq, Properties)] pub struct TreeProps { @@ -17,7 +18,7 @@ pub struct TreeProps { #[function_component] pub fn Tree(props: &TreeProps) -> Html { let (main_state, main_dispatch) = use_store::(); - let (selection_state, selection_dispatch) = use_store::(); + let (ct_state, ct_dispatch) = use_store::(); let plate_modal_id: UseStateHandle> = use_state(|| {None}); let open_plate_info_callback = { @@ -50,31 +51,39 @@ pub fn Tree(props: &TreeProps) -> Html { }) }; let source_plate_select_callback = { - let dispatch = selection_dispatch.clone(); + let main_dispatch = main_dispatch.clone(); + let ct_dispatch = ct_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_region = RegionDisplay::default(); - state.source_id = Uuid::from_u128(id); - }) + ct_dispatch.reduce_mut(|state| { + state.transfer.source_region = Region::default(); + }); + main_dispatch.reduce_mut(|state| { + state.selected_source_plate = Uuid::from_u128(id); + }); } } }) }; let destination_plate_select_callback = { - let dispatch = selection_dispatch.clone(); + let main_dispatch = main_dispatch.clone(); + let ct_dispatch = ct_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_region = RegionDisplay::default(); - state.destination_id = Uuid::from_u128(id); - }) + ct_dispatch.reduce_mut(|state| { + state.transfer.dest_region = Region::default(); + }); + main_dispatch.reduce_mut(|state| { + state.selected_dest_plate = Uuid::from_u128(id); + }); } } }) @@ -86,7 +95,7 @@ pub fn Tree(props: &TreeProps) -> Html { 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")} + Some(if spi.get_uuid() == main_state.selected_source_plate {Some("selected")} else {None}) )}> {String::from(spi)} @@ -98,7 +107,7 @@ pub fn Tree(props: &TreeProps) -> Html { ondblclick={open_plate_info_callback.clone()} onclick={destination_plate_select_callback.clone()} class={classes!( - Some(if dpi.get_uuid() == selection_state.destination_id {Some("selected")} + Some(if dpi.get_uuid() == main_state.selected_dest_plate {Some("selected")} else {None}) )}> {String::from(dpi)} } }).collect::();