Remove NewTransferState

It was bad not very good design!
Use CurrentTransfer instead.
This commit is contained in:
Emilia Allison 2023-05-25 12:07:21 -04:00
parent a1a0430ec3
commit aee565dbb3
Signed by: emilia
GPG Key ID: 7A3F8997BFE894E0
6 changed files with 55 additions and 67 deletions

View File

@ -2,7 +2,7 @@
use yew::prelude::*; use yew::prelude::*;
use yewdux::prelude::*; use yewdux::prelude::*;
use super::states::{MainState, NewTransferState, CurrentTransfer}; use super::states::{MainState, CurrentTransfer};
use super::plates::plate_container::PlateContainer; use super::plates::plate_container::PlateContainer;
use super::tree::Tree; use super::tree::Tree;
use super::transfer_menu::TransferMenu; use super::transfer_menu::TransferMenu;
@ -13,11 +13,10 @@ use crate::data::plate_instances::PlateInstance;
#[function_component] #[function_component]
pub fn MainWindow() -> Html { pub fn MainWindow() -> Html {
let (main_state, main_dispatch) = use_store::<MainState>(); let (main_state, main_dispatch) = use_store::<MainState>();
let (selection_state, selection_dispatch) = use_store::<NewTransferState>();
let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>(); let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
let source_plate_instance: Option<PlateInstance> = main_state.source_plates.iter() let source_plate_instance: Option<PlateInstance> = 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(); .cloned();
if let Some(spi) = source_plate_instance.clone() { if let Some(spi) = source_plate_instance.clone() {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
@ -25,7 +24,7 @@ pub fn MainWindow() -> Html {
}); });
} }
let destination_plate_instance: Option<PlateInstance> = main_state.destination_plates.iter() let destination_plate_instance: Option<PlateInstance> = 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(); .cloned();
if let Some(dpi) = destination_plate_instance.clone() { if let Some(dpi) = destination_plate_instance.clone() {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {

View File

@ -5,7 +5,7 @@ use std::rc::Rc;
use crate::data::plate_instances::PlateInstance; use crate::data::plate_instances::PlateInstance;
use crate::data::transfer_region::{TransferRegion, Region}; use crate::data::transfer_region::{TransferRegion, Region};
use crate::components::states::{NewTransferState, CurrentTransfer}; use crate::components::states::{CurrentTransfer};
use super::super::transfer_menu::RegionDisplay; use super::super::transfer_menu::RegionDisplay;
@ -17,7 +17,6 @@ pub struct DestinationPlateProps {
#[function_component] #[function_component]
pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
let (state, dispatch) = use_store::<NewTransferState>();
let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>(); let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
let m_start_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None); let m_start_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None);
let m_end_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None); let m_end_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None);
@ -26,8 +25,10 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
let m_end = m_end_handle.clone(); let m_end = m_end_handle.clone();
if !(*m_stat_handle) { if !(*m_stat_handle) {
let pt1 = (state.destination_region.col_start, state.destination_region.row_start); let (pt1, pt2) = match ct_state.transfer.dest_region {
let pt2 = (state.destination_region.col_end, state.destination_region.row_end); Region::Point((x,y)) => ((x,y),(x,y)),
Region::Rect(c1, c2) => (c1, c2),
};
m_start_handle.set(Some(pt1)); m_start_handle.set(Some(pt1));
m_end_handle.set(Some(pt2)); m_end_handle.set(Some(pt2));
} }
@ -67,9 +68,6 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.dest_region = Region::from(&rd); state.transfer.dest_region = Region::from(&rd);
}); });
dispatch.reduce_mut(|state| {
state.destination_region = rd;
});
} }
} }
} }

View File

@ -6,7 +6,7 @@ use std::rc::Rc;
use crate::data::plate_instances::PlateInstance; use crate::data::plate_instances::PlateInstance;
use crate::data::transfer_region::{TransferRegion, Region}; use crate::data::transfer_region::{TransferRegion, Region};
use crate::components::states::{NewTransferState, CurrentTransfer}; use crate::components::states::{CurrentTransfer};
use super::super::transfer_menu::RegionDisplay; use super::super::transfer_menu::RegionDisplay;
@ -18,7 +18,6 @@ pub struct SourcePlateProps {
#[function_component] #[function_component]
pub fn SourcePlate(props: &SourcePlateProps) -> Html { pub fn SourcePlate(props: &SourcePlateProps) -> Html {
let (state, dispatch) = use_store::<NewTransferState>();
let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>(); let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
let m_start_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None); let m_start_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None);
let m_end_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None); let m_end_handle: UseStateHandle<Option<(u8,u8)>> = use_state_eq(|| None);
@ -27,8 +26,10 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
let m_end = m_end_handle.clone(); let m_end = m_end_handle.clone();
if !(*m_stat_handle) { if !(*m_stat_handle) {
let pt1 = (state.source_region.col_start, state.source_region.row_start); let (pt1, pt2) = match ct_state.transfer.source_region {
let pt2 = (state.source_region.col_end, state.source_region.row_end); Region::Point((x,y)) => ((x,y),(x,y)),
Region::Rect(c1, c2) => (c1, c2),
};
m_start_handle.set(Some(pt1)); m_start_handle.set(Some(pt1));
m_end_handle.set(Some(pt2)); m_end_handle.set(Some(pt2));
} }
@ -69,9 +70,6 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.source_region = Region::from(&rd); state.transfer.source_region = Region::from(&rd);
}); });
dispatch.reduce_mut(|state| {
state.source_region = rd;
});
} }
} }
} }

View File

@ -8,17 +8,6 @@ use crate::data::transfer::Transfer;
use crate::data::plate::*; use crate::data::plate::*;
use crate::data::transfer_region::TransferRegion; 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)] #[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize, Store)]
#[store(storage = "session")] #[store(storage = "session")]
pub struct CurrentTransfer { pub struct CurrentTransfer {
@ -30,6 +19,9 @@ pub struct MainState {
pub source_plates: Vec<PlateInstance>, pub source_plates: Vec<PlateInstance>,
pub destination_plates: Vec<PlateInstance>, pub destination_plates: Vec<PlateInstance>,
pub transfers: Vec<Transfer>, pub transfers: Vec<Transfer>,
pub selected_source_plate: Uuid,
pub selected_dest_plate: Uuid,
pub selected_transfer: Uuid,
} }
impl Store for MainState { impl Store for MainState {

View File

@ -10,15 +10,13 @@ use lazy_static::lazy_static;
use crate::data::transfer_region::Region; use crate::data::transfer_region::Region;
use super::states::{NewTransferState, CurrentTransfer}; use super::states::{CurrentTransfer};
#[function_component] #[function_component]
pub fn TransferMenu() -> Html { pub fn TransferMenu() -> Html {
let (state, dispatch) = use_store::<NewTransferState>();
let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>(); let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
let on_src_region_change = { let on_src_region_change = {
let dispatch = dispatch.clone();
let ct_dispatch = ct_dispatch.clone(); let ct_dispatch = ct_dispatch.clone();
Callback::from(move |e: Event| { Callback::from(move |e: Event| {
@ -29,9 +27,6 @@ pub fn TransferMenu() -> Html {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.source_region = Region::from(&rd); state.transfer.source_region = Region::from(&rd);
}); });
dispatch.reduce_mut(|state| {
state.source_region = rd;
});
input.set_custom_validity(""); input.set_custom_validity("");
} else { } else {
input.set_custom_validity("Invalid region.") input.set_custom_validity("Invalid region.")
@ -40,7 +35,6 @@ pub fn TransferMenu() -> Html {
}) })
}; };
let on_dest_region_change = { let on_dest_region_change = {
let dispatch = dispatch.clone();
let ct_dispatch = ct_dispatch.clone(); let ct_dispatch = ct_dispatch.clone();
Callback::from(move |e: Event| { Callback::from(move |e: Event| {
@ -51,9 +45,6 @@ pub fn TransferMenu() -> Html {
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.dest_region = Region::from(&rd); state.transfer.dest_region = Region::from(&rd);
}); });
dispatch.reduce_mut(|state| {
state.destination_region = rd;
});
input.set_custom_validity(""); input.set_custom_validity("");
} else { } else {
input.set_custom_validity("Invalid region.") input.set_custom_validity("Invalid region.")
@ -63,8 +54,6 @@ pub fn TransferMenu() -> Html {
}; };
let on_dest_interleave_x_change = { let on_dest_interleave_x_change = {
let dispatch = dispatch.clone();
let ct_state = ct_state.clone();
let ct_dispatch = ct_dispatch.clone(); let ct_dispatch = ct_dispatch.clone();
Callback::from(move |e: Event| { Callback::from(move |e: Event| {
@ -72,9 +61,6 @@ pub fn TransferMenu() -> Html {
let input = target.and_then(|t| t.dyn_into::<HtmlInputElement>().ok()); let input = target.and_then(|t| t.dyn_into::<HtmlInputElement>().ok());
if let Some(input) = input { if let Some(input) = input {
if let Ok(num) = input.value().parse::<i8>() { if let Ok(num) = input.value().parse::<i8>() {
dispatch.reduce_mut(|state| {
state.interleave_x = num;
});
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.interleave_dest = (num, state.transfer.interleave_dest.1); 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 on_dest_interleave_y_change = {
let dispatch = dispatch.clone();
let ct_state = ct_state.clone();
let ct_dispatch = ct_dispatch.clone(); let ct_dispatch = ct_dispatch.clone();
Callback::from(move |e: Event| { Callback::from(move |e: Event| {
@ -92,9 +76,6 @@ pub fn TransferMenu() -> Html {
let input = target.and_then(|t| t.dyn_into::<HtmlInputElement>().ok()); let input = target.and_then(|t| t.dyn_into::<HtmlInputElement>().ok());
if let Some(input) = input { if let Some(input) = input {
if let Ok(num) = input.value().parse::<i8>() { if let Ok(num) = input.value().parse::<i8>() {
dispatch.reduce_mut(|state| {
state.interleave_y = num;
});
ct_dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.transfer.interleave_dest = (state.transfer.interleave_dest.0, num); state.transfer.interleave_dest = (state.transfer.interleave_dest.0, num);
}); });
@ -109,21 +90,23 @@ pub fn TransferMenu() -> Html {
<div> <div>
<label for="src_region">{"Source Region:"}</label> <label for="src_region">{"Source Region:"}</label>
<input type="text" name="src_region" <input type="text" name="src_region"
onchange={on_src_region_change} value={state.source_region.text.clone()}/> onchange={on_src_region_change}
value={RegionDisplay::from(&ct_state.transfer.source_region).text}/>
</div> </div>
<div> <div>
<label for="dest_region">{"Destination Region:"}</label> <label for="dest_region">{"Destination Region:"}</label>
<input type="text" name="dest_region" <input type="text" name="dest_region"
onchange={on_dest_region_change} value={state.destination_region.text.clone()}/> onchange={on_dest_region_change}
value={RegionDisplay::from(&ct_state.transfer.dest_region).text}/>
</div> </div>
<div> <div>
{"Destination Interleave "} {"Destination Interleave "}
<label for="dest_interleave_x">{"X:"}</label> <label for="dest_interleave_x">{"X:"}</label>
<input type="number" name="dest_interleave_x" <input type="number" name="dest_interleave_x"
onchange={on_dest_interleave_x_change} value={state.interleave_x.to_string()}/> onchange={on_dest_interleave_x_change} value={ct_state.transfer.interleave_dest.0.to_string()}/>
<label for="dest_interleave_y">{"Y:"}</label> <label for="dest_interleave_y">{"Y:"}</label>
<input type="number" name="dest_interleave_y" <input type="number" name="dest_interleave_y"
onchange={on_dest_interleave_y_change} value={state.interleave_y.to_string()}/> onchange={on_dest_interleave_y_change} value={ct_state.transfer.interleave_dest.1.to_string()}/>
</div> </div>
<input type="button" name="create_transfer" value={"Create"} /> <input type="button" name="create_transfer" value={"Create"} />
</form> </form>
@ -167,6 +150,15 @@ impl TryFrom<String> 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 { impl From<&RegionDisplay> for Region {
fn from(value: &RegionDisplay) -> Self { fn from(value: &RegionDisplay) -> Self {
if value.col_start == value.col_end && value.row_start == value.row_end { if value.col_start == value.col_end && value.row_start == value.row_end {

View File

@ -6,8 +6,9 @@ use web_sys::{EventTarget, HtmlElement, HtmlDialogElement};
use yew::prelude::*; use yew::prelude::*;
use yewdux::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::components::transfer_menu::RegionDisplay;
use crate::data::transfer_region::Region;
#[derive(PartialEq, Properties)] #[derive(PartialEq, Properties)]
pub struct TreeProps { pub struct TreeProps {
@ -17,7 +18,7 @@ pub struct TreeProps {
#[function_component] #[function_component]
pub fn Tree(props: &TreeProps) -> Html { pub fn Tree(props: &TreeProps) -> Html {
let (main_state, main_dispatch) = use_store::<MainState>(); let (main_state, main_dispatch) = use_store::<MainState>();
let (selection_state, selection_dispatch) = use_store::<NewTransferState>(); let (ct_state, ct_dispatch) = use_store::<CurrentTransfer>();
let plate_modal_id: UseStateHandle<Option<Uuid>> = use_state(|| {None}); let plate_modal_id: UseStateHandle<Option<Uuid>> = use_state(|| {None});
let open_plate_info_callback = { let open_plate_info_callback = {
@ -50,31 +51,39 @@ pub fn Tree(props: &TreeProps) -> Html {
}) })
}; };
let source_plate_select_callback = { 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| { Callback::from(move |e: MouseEvent| {
let target: Option<EventTarget> = e.target(); let target: Option<EventTarget> = e.target();
let li = target.and_then(|t| t.dyn_into::<HtmlElement>().ok()); let li = target.and_then(|t| t.dyn_into::<HtmlElement>().ok());
if let Some(li) = li { if let Some(li) = li {
if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) { if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) {
dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.source_region = RegionDisplay::default(); state.transfer.source_region = Region::default();
state.source_id = Uuid::from_u128(id); });
}) main_dispatch.reduce_mut(|state| {
state.selected_source_plate = Uuid::from_u128(id);
});
} }
} }
}) })
}; };
let destination_plate_select_callback = { 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| { Callback::from(move |e: MouseEvent| {
let target: Option<EventTarget> = e.target(); let target: Option<EventTarget> = e.target();
let li = target.and_then(|t| t.dyn_into::<HtmlElement>().ok()); let li = target.and_then(|t| t.dyn_into::<HtmlElement>().ok());
if let Some(li) = li { if let Some(li) = li {
if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) { if let Ok(id) = u128::from_str_radix(li.id().as_str(), 10) {
dispatch.reduce_mut(|state| { ct_dispatch.reduce_mut(|state| {
state.destination_region = RegionDisplay::default(); state.transfer.dest_region = Region::default();
state.destination_id = Uuid::from_u128(id); });
}) 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()} ondblclick={open_plate_info_callback.clone()}
onclick={source_plate_select_callback.clone()} onclick={source_plate_select_callback.clone()}
class={classes!( 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}) else {None})
)}> )}>
{String::from(spi)} {String::from(spi)}
@ -98,7 +107,7 @@ pub fn Tree(props: &TreeProps) -> Html {
ondblclick={open_plate_info_callback.clone()} ondblclick={open_plate_info_callback.clone()}
onclick={destination_plate_select_callback.clone()} onclick={destination_plate_select_callback.clone()}
class={classes!( 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}) else {None})
)}> {String::from(dpi)} </li> } )}> {String::from(dpi)} </li> }
}).collect::<Html>(); }).collect::<Html>();