From 338a7b98c724a037e67705f6931ced454b1d8874 Mon Sep 17 00:00:00 2001 From: Emilia Date: Sat, 10 Feb 2024 21:57:30 -0500 Subject: [PATCH] the refactor i've wanted most SourcePlate and DestinationPlate are now the same why did i not do this originally omg --- src/components/plates/destination_plate.rs | 216 ------------------ src/components/plates/mod.rs | 5 +- .../plates/{source_plate.rs => plate.rs} | 125 +++++----- src/components/plates/plate_callbacks.rs | 50 ++++ src/components/plates/plate_container.rs | 14 +- src/components/plates/plate_data.rs | 23 ++ 6 files changed, 142 insertions(+), 291 deletions(-) delete mode 100644 src/components/plates/destination_plate.rs rename src/components/plates/{source_plate.rs => plate.rs} (70%) create mode 100644 src/components/plates/plate_callbacks.rs create mode 100644 src/components/plates/plate_data.rs diff --git a/src/components/plates/destination_plate.rs b/src/components/plates/destination_plate.rs deleted file mode 100644 index e059648..0000000 --- a/src/components/plates/destination_plate.rs +++ /dev/null @@ -1,216 +0,0 @@ -#![allow(non_snake_case)] - -use std::collections::HashMap; -use yew::prelude::*; -use yewdux::prelude::*; - -use crate::components::states::{CurrentTransfer, MainState}; -use crate::data::plate_instances::PlateInstance; -use crate::data::transfer::Transfer; -use crate::data::transfer_region::Region; - -// Color Palette for the Source Plates, can be changed here -use crate::components::plates::util::Palettes; -const PALETTE: super::util::ColorPalette = Palettes::RAINBOW; - -use super::super::transfer_menu::{num_to_letters, RegionDisplay}; - -#[derive(Properties, PartialEq)] -pub struct DestinationPlateProps { - pub source_plate: PlateInstance, - pub destination_plate: PlateInstance, - pub cell_height: f64, -} - -#[function_component] -pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { - let (main_state, _) = 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); - let m_stat_handle: UseStateHandle = use_state_eq(|| false); - - if !(*m_stat_handle) { - let (pt1, pt2) = match ct_state.transfer.transfer_region.dest_region { - Region::Point((x, y)) => ((x, y), (x, y)), - Region::Rect(c1, c2) => (c1, c2), - Region::Custom(_) => ((0,0), (0,0)), - }; - m_start_handle.set(Some(pt1)); - m_end_handle.set(Some(pt2)); - } - let destination_wells = ct_state.transfer.transfer_region.get_destination_wells(); - - let ordered_ids: Vec = { - let mut ids: Vec = main_state.transfers.clone().iter() - .map(|x| x.id) - .collect(); - ids.sort_unstable(); - ids - }; - - let mouse_callback = { - let m_start_handle = m_start_handle.clone(); - let m_end_handle = m_end_handle.clone(); - let m_stat_handle = m_stat_handle.clone(); - - Callback::from(move |(i, j, t)| match t { - MouseEventType::Mousedown => { - m_start_handle.set(Some((i, j))); - m_end_handle.set(Some((i, j))); - m_stat_handle.set(true); - } - MouseEventType::Mouseenter => { - if *m_stat_handle { - m_end_handle.set(Some((i, j))); - } - } - }) - }; - - let transfer_map = { - let ts = main_state - .transfers - .iter() - .filter(|t| t.dest_id == props.destination_plate.get_uuid()); - let mut tooltip_map: HashMap<(u8, u8), Vec<&Transfer>> = HashMap::new(); - for t in ts { - let dws = t.transfer_region.get_destination_wells(); - for dw in dws { - if let Some(val) = tooltip_map.get_mut(&dw) { - val.push(t); - } else { - tooltip_map.insert(dw, vec![t]); - } - } - } - tooltip_map - }; - - let mouseup_callback = { - let m_start_handle = m_start_handle.clone(); - let m_end_handle = m_end_handle.clone(); - - Callback::from(move |_: MouseEvent| { - m_stat_handle.set(false); - if let Some(ul) = *m_start_handle { - if let Some(br) = *m_end_handle { - if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { - ct_dispatch.reduce_mut(|state| { - state.transfer.transfer_region.dest_region = Region::from(&rd); - }); - } - } - } - }) - }; - - let mouseleave_callback = Callback::clone(&mouseup_callback); - - - let screenshot_callback = Callback::from(|_| { - let _ = js_sys::eval("copy_screenshot_dest()"); - }); - - let column_header = { - let headers = (1..=props.destination_plate.plate.size().1) - .map(|j| { - html! {{format!("{:0>2}", j)}} - }) - .collect::(); - html! {{ headers }} - }; - let rows = (1..=props.destination_plate.plate.size().0) - .map(|i| { - let row_header = html! {{num_to_letters(i)}}; - let row = (1..=props.destination_plate.plate.size().1).map(|j| { - html! { - >().join(", ")))} - /> - } - }).collect::(); - html! { - - { row_header }{ row } - - } - }) - .collect::(); - - html! { -
- - { column_header }{ rows } -
-
- } -} - -#[derive(Debug)] -pub enum MouseEventType { - Mousedown, - Mouseenter, -} - -#[derive(Properties, PartialEq)] -pub struct DestPlateCellProps { - pub i: u8, - pub j: u8, - pub selected: bool, - pub mouse: Callback<(u8, u8, MouseEventType)>, - pub in_transfer: Option, - color: Option<[f64; 3]>, - cell_height: f64, - title: Option, -} - -#[function_component] -fn DestPlateCell(props: &DestPlateCellProps) -> Html { - let selected_class = match props.selected { - true => Some("current_select"), - false => None, - }; - let in_transfer_class = match props.in_transfer { - Some(true) => Some("in_transfer"), - _ => None, - }; - let color = props.color.unwrap_or([255.0, 255.0, 255.0]); - let mouse = Callback::clone(&props.mouse); - let mouse2 = Callback::clone(&props.mouse); - let (i, j) = (props.i, props.j); - - html! { - -
- - } -} diff --git a/src/components/plates/mod.rs b/src/components/plates/mod.rs index fe8968e..0b506d5 100644 --- a/src/components/plates/mod.rs +++ b/src/components/plates/mod.rs @@ -1,4 +1,5 @@ -pub mod destination_plate; pub mod plate_container; -pub mod source_plate; mod util; +mod plate_callbacks; +mod plate_data; +mod plate; diff --git a/src/components/plates/source_plate.rs b/src/components/plates/plate.rs similarity index 70% rename from src/components/plates/source_plate.rs rename to src/components/plates/plate.rs index 8faac98..80b72d8 100644 --- a/src/components/plates/source_plate.rs +++ b/src/components/plates/plate.rs @@ -5,7 +5,7 @@ use yew::prelude::*; use yewdux::prelude::*; use crate::components::states::{CurrentTransfer, MainState}; -use crate::data::plate_instances::PlateInstance; +use crate::data::plate::PlateType; use crate::data::transfer::Transfer; use crate::data::transfer_region::Region; @@ -15,56 +15,60 @@ const PALETTE: super::util::ColorPalette = Palettes::RAINBOW; use super::super::transfer_menu::{num_to_letters, RegionDisplay}; -#[derive(PartialEq, Properties)] -pub struct SourcePlateProps { - pub source_plate: PlateInstance, - pub destination_plate: PlateInstance, - pub cell_height: f64, -} +use super::plate_data::*; +use super::plate_callbacks; #[function_component] -pub fn SourcePlate(props: &SourcePlateProps) -> Html { +pub fn Plate(props: &PlateProps) -> Html { let (main_state, _) = 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); - let m_stat_handle: UseStateHandle = use_state_eq(|| false); + let m_start_handle: MStartHandle = use_state_eq(|| None); + let m_end_handle: MEndHandle = use_state_eq(|| None); + let m_stat_handle: MStatHandle = use_state_eq(|| false); if !(*m_stat_handle) { - let (pt1, pt2) = match ct_state.transfer.transfer_region.source_region { + let region = match props.ptype { + PlateType::Source => ct_state.transfer.transfer_region.source_region.clone(), + PlateType::Destination => ct_state.transfer.transfer_region.dest_region.clone(), + }; + let (pt1, pt2) = match region { Region::Point((x, y)) => ((x, y), (x, y)), Region::Rect(c1, c2) => (c1, c2), - Region::Custom(_) => ((0,0), (0,0)), + Region::Custom(_) => ((0, 0), (0, 0)), }; m_start_handle.set(Some(pt1)); m_end_handle.set(Some(pt2)); } let transfer_map = { - let ts = main_state - .transfers - .iter() - .filter(|t| t.source_id == props.source_plate.get_uuid()); + let transfers = main_state.transfers.iter().filter(|t| match props.ptype { + PlateType::Source => t.source_id == props.source_plate.get_uuid(), + PlateType::Destination => t.dest_id == props.destination_plate.get_uuid(), + }); let mut tooltip_map: HashMap<(u8, u8), Vec<&Transfer>> = HashMap::new(); - for t in ts { - let sws = t.transfer_region.get_source_wells(); - for sw in sws { - if let Some(val) = tooltip_map.get_mut(&sw) { - val.push(t); + for transfer in transfers { + let wells = match props.ptype { + PlateType::Source => transfer.transfer_region.get_source_wells(), + PlateType::Destination => transfer.transfer_region.get_destination_wells(), + }; + for well in wells { + if let Some(val) = tooltip_map.get_mut(&well) { + val.push(transfer); } else { - tooltip_map.insert(sw, vec![t]); + tooltip_map.insert(well, vec![transfer]); } } } tooltip_map }; - let source_wells = ct_state.transfer.transfer_region.get_source_wells(); + let wells = match props.ptype { + PlateType::Source => ct_state.transfer.transfer_region.get_source_wells(), + PlateType::Destination => ct_state.transfer.transfer_region.get_destination_wells(), + }; let ordered_ids: Vec = { - let mut ids: Vec = main_state.transfers.clone().iter() - .map(|x| x.id) - .collect(); + let mut ids: Vec = main_state.transfers.clone().iter().map(|x| x.id).collect(); ids.sort_unstable(); ids }; @@ -73,37 +77,13 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { let m_start_handle = m_start_handle.clone(); let m_end_handle = m_end_handle.clone(); let m_stat_handle = m_stat_handle.clone(); - - Callback::from(move |(i, j, t)| match t { - MouseEventType::Mousedown => { - m_start_handle.set(Some((i, j))); - m_end_handle.set(Some((i, j))); - m_stat_handle.set(true); - } - MouseEventType::Mouseenter => { - if *m_stat_handle { - m_end_handle.set(Some((i, j))); - } - } - }) + plate_callbacks::mouse_callback(m_start_handle, m_end_handle, m_stat_handle) }; let mouseup_callback = { let m_start_handle = m_start_handle.clone(); let m_end_handle = m_end_handle.clone(); - - Callback::from(move |_: MouseEvent| { - m_stat_handle.set(false); - if let Some(ul) = *m_start_handle { - if let Some(br) = *m_end_handle { - if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { - ct_dispatch.reduce_mut(|state| { - state.transfer.transfer_region.source_region = Region::from(&rd); - }); - } - } - } - }) + plate_callbacks::mouseup_callback(m_start_handle, m_end_handle, m_stat_handle, ct_dispatch) }; let mouseleave_callback = Callback::clone(&mouseup_callback); @@ -112,8 +92,20 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { let _ = js_sys::eval("copy_screenshot_src()"); }); + let width = match props.ptype { + PlateType::Source => props.source_plate.plate.size().1, + PlateType::Destination => props.destination_plate.plate.size().1, + }; + let height = match props.ptype { + PlateType::Source => props.source_plate.plate.size().0, + PlateType::Destination => props.destination_plate.plate.size().0, + }; + let pformat = match props.ptype { + PlateType::Source => props.source_plate.plate.plate_format, + PlateType::Destination => props.destination_plate.plate.plate_format, + }; let column_header = { - let headers = (1..=props.source_plate.plate.size().1) + let headers = (1..=width) .map(|j| { html! { {format!("{:0>2}", j)} @@ -122,16 +114,17 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html { .collect::(); html! {{ headers }} }; - let rows = (1..=props.source_plate.plate.size().0) + let rows = + (1..=height) .map(|i| { let row_header = html! {{num_to_letters(i)}}; - let row = (1..=props.source_plate.plate.size().1) + let row = (1..=width) .map(|j| { html! { - Html { html! {
+ class={classes!{match props.ptype { + PlateType::Source => "source_plate", + PlateType::Destination => "dest_plate", + }, + "W".to_owned()+&pformat.to_string()}}> Html { } #[derive(PartialEq, Properties)] -pub struct SourcePlateCellProps { +pub struct PlateCellProps { i: u8, j: u8, selected: bool, @@ -180,14 +176,9 @@ pub struct SourcePlateCellProps { cell_height: f64, title: Option, } -#[derive(Debug)] -pub enum MouseEventType { - Mousedown, - Mouseenter, -} #[function_component] -fn SourcePlateCell(props: &SourcePlateCellProps) -> Html { +fn PlateCell(props: &PlateCellProps) -> Html { let selected_class = match props.selected { true => Some("current_select"), false => None, diff --git a/src/components/plates/plate_callbacks.rs b/src/components/plates/plate_callbacks.rs new file mode 100644 index 0000000..692403d --- /dev/null +++ b/src/components/plates/plate_callbacks.rs @@ -0,0 +1,50 @@ +use yew::prelude::*; +use yewdux::prelude::*; + +use crate::components::states::CurrentTransfer; +use crate::data::transfer_region::Region; + +// Color Palette for the Source Plates, can be changed here + +use super::super::transfer_menu::RegionDisplay; + +use super::plate_data::*; + +pub fn mouse_callback( + m_start_handle: MStartHandle, + m_end_handle: MEndHandle, + m_stat_handle: MStatHandle, +) -> Callback<(u8, u8, MouseEventType)> { + Callback::from(move |(i, j, t)| match t { + MouseEventType::Mousedown => { + m_start_handle.set(Some((i, j))); + m_end_handle.set(Some((i, j))); + m_stat_handle.set(true); + } + MouseEventType::Mouseenter => { + if *m_stat_handle { + m_end_handle.set(Some((i, j))); + } + } + }) +} + +pub fn mouseup_callback( + m_start_handle: MStartHandle, + m_end_handle: MEndHandle, + m_stat_handle: MStatHandle, + ct_dispatch: Dispatch, +) -> Callback { + Callback::from(move |_: MouseEvent| { + m_stat_handle.set(false); + if let Some(ul) = *m_start_handle { + if let Some(br) = *m_end_handle { + if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { + ct_dispatch.reduce_mut(|state| { + state.transfer.transfer_region.source_region = Region::from(&rd); + }); + } + } + } + }) +} diff --git a/src/components/plates/plate_container.rs b/src/components/plates/plate_container.rs index e07ca16..8746e81 100644 --- a/src/components/plates/plate_container.rs +++ b/src/components/plates/plate_container.rs @@ -3,10 +3,12 @@ use wasm_bindgen::prelude::Closure; use wasm_bindgen::JsCast; use yew::prelude::*; +use crate::data::plate::PlateType; use crate::data::plate_instances::PlateInstance; -use super::destination_plate::DestinationPlate; -use super::source_plate::SourcePlate; +// use super::destination_plate::DestinationPlate; +// use super::source_plate::SourcePlate; +use super::plate::Plate; #[derive(Properties, PartialEq)] pub struct PlateContainerProps { @@ -53,13 +55,13 @@ pub fn PlateContainer(props: &PlateContainerProps) -> Html { if let Some(dpi) = props.destination_dims.clone() {

{spi.name.clone()}

- +

{dpi.name.clone()}

- +
} else {

{"No Destination Plate Selected"}

diff --git a/src/components/plates/plate_data.rs b/src/components/plates/plate_data.rs new file mode 100644 index 0000000..16774fd --- /dev/null +++ b/src/components/plates/plate_data.rs @@ -0,0 +1,23 @@ +use serde::{Serialize, Deserialize}; +use yew::prelude::*; + +use crate::data::plate_instances::PlateInstance; +use crate::data::plate::PlateType; + +#[derive(PartialEq, Properties)] +pub struct PlateProps { + pub source_plate: PlateInstance, + pub destination_plate: PlateInstance, + pub cell_height: f64, + pub ptype: PlateType, +} + +pub type MStartHandle = UseStateHandle>; +pub type MEndHandle = UseStateHandle>; +pub type MStatHandle = UseStateHandle; + +#[derive(Debug)] +pub enum MouseEventType { + Mousedown, + Mouseenter, +}