Use UUID to calculate colors

Ensures that a transfer will always be represented
by the same color.
This commit is contained in:
Emilia Allison 2023-06-13 19:32:39 -04:00
parent 43391850e0
commit cf7860c5c5
Signed by: emilia
GPG Key ID: 7A3F8997BFE894E0
3 changed files with 33 additions and 52 deletions

View File

@ -6,6 +6,7 @@ use yewdux::prelude::*;
use crate::components::states::{CurrentTransfer, MainState}; use crate::components::states::{CurrentTransfer, MainState};
use crate::data::plate_instances::PlateInstance; use crate::data::plate_instances::PlateInstance;
use crate::data::transfer::Transfer;
use crate::data::transfer_region::Region; use crate::data::transfer_region::Region;
// Color Palette for the Source Plates, can be changed here // Color Palette for the Source Plates, can be changed here
@ -58,36 +59,19 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
}) })
}; };
let mut color_counter: u8 = 0; let transfer_map = {
let color_map = {
let ts = main_state let ts = main_state
.transfers .transfers
.iter() .iter()
.filter(|t| t.dest_id == props.destination_plate.get_uuid()); .filter(|t| t.dest_id == props.destination_plate.get_uuid());
let mut color_map: HashMap<(u8, u8), u8> = HashMap::new(); let mut tooltip_map: HashMap<(u8,u8), Vec<&Transfer>> = HashMap::new();
for t in ts {
color_counter += 1;
let dws = t.transfer_region.get_destination_wells();
for dw in dws {
color_map.insert(dw, color_counter);
}
}
color_map
};
let tooltip_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<String>> = HashMap::new();
for t in ts { for t in ts {
let dws = t.transfer_region.get_destination_wells(); let dws = t.transfer_region.get_destination_wells();
for dw in dws { for dw in dws {
if let Some(val) = tooltip_map.get_mut(&dw) { if let Some(val) = tooltip_map.get_mut(&dw) {
val.push(t.name.clone()); val.push(t);
} else { } else {
tooltip_map.insert(dw, vec![t.name.clone()]); tooltip_map.insert(dw, vec![t]);
} }
} }
} }
@ -131,10 +115,14 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
selected={super::source_plate::in_rect(*m_start_handle.clone(), *m_end_handle.clone(), (i,j))} selected={super::source_plate::in_rect(*m_start_handle.clone(), *m_end_handle.clone(), (i,j))}
mouse={mouse_callback.clone()} mouse={mouse_callback.clone()}
in_transfer={destination_wells.contains(&(i,j))} in_transfer={destination_wells.contains(&(i,j))}
color={color_map.get(&(i,j)).copied()} color={transfer_map.get(&(i,j))
.and_then(|t| t.last())
.map(|t| PALETTE.get_uuid(t.get_uuid()))
}
cell_height={props.cell_height} cell_height={props.cell_height}
title={if let Some(names) = tooltip_map.get(&(i,j)) { title={if let Some(transfers) = transfer_map.get(&(i,j)) {
Some(format!("Used by: {}", names.join(", "))) Some(format!("Used by: {}", transfers.iter().map(|t| t.name.clone())
.collect::<Vec<_>>().join(", ")))
} else { None }} } else { None }}
/> />
} }
@ -176,7 +164,7 @@ pub struct DestPlateCellProps {
pub selected: bool, pub selected: bool,
pub mouse: Callback<(u8, u8, MouseEventType)>, pub mouse: Callback<(u8, u8, MouseEventType)>,
pub in_transfer: Option<bool>, pub in_transfer: Option<bool>,
color: Option<u8>, color: Option<[f64; 3]>,
cell_height: f64, cell_height: f64,
title: Option<String>, title: Option<String>,
} }
@ -192,7 +180,7 @@ fn DestPlateCell(props: &DestPlateCellProps) -> Html {
_ => None, _ => None,
}; };
let color = match props.color { let color = match props.color {
Some(num) => PALETTE.get_u8(num), Some(num) => num,
None => [255.0, 255.0, 255.0], None => [255.0, 255.0, 255.0],
}; };
let mouse = Callback::clone(&props.mouse); let mouse = Callback::clone(&props.mouse);

View File

@ -6,6 +6,7 @@ use yewdux::prelude::*;
use crate::components::states::{CurrentTransfer, MainState}; use crate::components::states::{CurrentTransfer, MainState};
use crate::data::plate_instances::PlateInstance; use crate::data::plate_instances::PlateInstance;
use crate::data::transfer::Transfer;
use crate::data::transfer_region::Region; use crate::data::transfer_region::Region;
// Color Palette for the Source Plates, can be changed here // Color Palette for the Source Plates, can be changed here
@ -38,36 +39,19 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
m_end_handle.set(Some(pt2)); m_end_handle.set(Some(pt2));
} }
let mut color_counter: u8 = 0; let transfer_map = {
let color_map = {
let ts = main_state let ts = main_state
.transfers .transfers
.iter() .iter()
.filter(|t| t.source_id == props.source_plate.get_uuid()); .filter(|t| t.source_id == props.source_plate.get_uuid());
let mut color_map: HashMap<(u8, u8), u8> = HashMap::new(); let mut tooltip_map: HashMap<(u8,u8), Vec<&Transfer>> = HashMap::new();
for t in ts {
color_counter += 1;
let sws = t.transfer_region.get_source_wells();
for sw in sws {
color_map.insert(sw, color_counter);
}
}
color_map
};
let tooltip_map = {
let ts = main_state
.transfers
.iter()
.filter(|t| t.source_id == props.source_plate.get_uuid());
let mut tooltip_map: HashMap<(u8,u8), Vec<String>> = HashMap::new();
for t in ts { for t in ts {
let sws = t.transfer_region.get_source_wells(); let sws = t.transfer_region.get_source_wells();
for sw in sws { for sw in sws {
if let Some(val) = tooltip_map.get_mut(&sw) { if let Some(val) = tooltip_map.get_mut(&sw) {
val.push(t.name.clone()); val.push(t);
} else { } else {
tooltip_map.insert(sw, vec![t.name.clone()]); tooltip_map.insert(sw, vec![t]);
} }
} }
} }
@ -135,10 +119,14 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
selected={in_rect(*m_start_handle.clone(), *m_end_handle.clone(), (i,j))} selected={in_rect(*m_start_handle.clone(), *m_end_handle.clone(), (i,j))}
mouse={mouse_callback.clone()} mouse={mouse_callback.clone()}
in_transfer={source_wells.contains(&(i,j))} in_transfer={source_wells.contains(&(i,j))}
color={color_map.get(&(i,j)).copied()} color={transfer_map.get(&(i,j))
.and_then(|t| t.last())
.map(|t| PALETTE.get_uuid(t.get_uuid()))
}
cell_height={props.cell_height} cell_height={props.cell_height}
title={if let Some(names) = tooltip_map.get(&(i,j)) { title={if let Some(transfers) = transfer_map.get(&(i,j)) {
Some(format!("Used by: {}", names.join(", "))) Some(format!("Used by: {}", transfers.iter().map(|t| t.name.clone())
.collect::<Vec<_>>().join(", ")))
} else { None }} } else { None }}
/> />
} }
@ -176,7 +164,7 @@ pub struct SourcePlateCellProps {
selected: bool, selected: bool,
mouse: Callback<(u8, u8, MouseEventType)>, mouse: Callback<(u8, u8, MouseEventType)>,
in_transfer: Option<bool>, in_transfer: Option<bool>,
color: Option<u8>, color: Option<[f64; 3]>,
cell_height: f64, cell_height: f64,
title: Option<String>, title: Option<String>,
} }
@ -197,7 +185,7 @@ fn SourcePlateCell(props: &SourcePlateCellProps) -> Html {
_ => None, _ => None,
}; };
let color = match props.color { let color = match props.color {
Some(num) => PALETTE.get_u8(num), Some(num) => num,
None => [255.0, 255.0, 255.0], None => [255.0, 255.0, 255.0],
}; };
let mouse = Callback::clone(&props.mouse); let mouse = Callback::clone(&props.mouse);

View File

@ -30,6 +30,11 @@ impl ColorPalette {
assert!(t > 0, "t must be greater than zero!"); assert!(t > 0, "t must be greater than zero!");
self.get((2f64.powi(-1*t.ilog2() as i32)) as f64 * (t as f64 + 0.5f64)-1.0f64) self.get((2f64.powi(-1*t.ilog2() as i32)) as f64 * (t as f64 + 0.5f64)-1.0f64)
} }
pub fn get_uuid(&self, t: uuid::Uuid) -> [f64; 3] {
log::debug!("{}", t.as_u128() as f64 / (u128::MAX) as f64);
self.get(t.as_u128() as f64 / (u128::MAX) as f64)
}
} }
#[non_exhaustive] #[non_exhaustive]