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::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
@ -58,36 +59,19 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html {
})
};
let mut color_counter: u8 = 0;
let color_map = {
let transfer_map = {
let ts = main_state
.transfers
.iter()
.filter(|t| t.dest_id == props.destination_plate.get_uuid());
let mut color_map: HashMap<(u8, u8), u8> = 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();
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.name.clone());
val.push(t);
} 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))}
mouse={mouse_callback.clone()}
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}
title={if let Some(names) = tooltip_map.get(&(i,j)) {
Some(format!("Used by: {}", names.join(", ")))
title={if let Some(transfers) = transfer_map.get(&(i,j)) {
Some(format!("Used by: {}", transfers.iter().map(|t| t.name.clone())
.collect::<Vec<_>>().join(", ")))
} else { None }}
/>
}
@ -176,7 +164,7 @@ pub struct DestPlateCellProps {
pub selected: bool,
pub mouse: Callback<(u8, u8, MouseEventType)>,
pub in_transfer: Option<bool>,
color: Option<u8>,
color: Option<[f64; 3]>,
cell_height: f64,
title: Option<String>,
}
@ -192,7 +180,7 @@ fn DestPlateCell(props: &DestPlateCellProps) -> Html {
_ => None,
};
let color = match props.color {
Some(num) => PALETTE.get_u8(num),
Some(num) => num,
None => [255.0, 255.0, 255.0],
};
let mouse = Callback::clone(&props.mouse);

View File

@ -6,6 +6,7 @@ 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
@ -38,36 +39,19 @@ pub fn SourcePlate(props: &SourcePlateProps) -> Html {
m_end_handle.set(Some(pt2));
}
let mut color_counter: u8 = 0;
let color_map = {
let transfer_map = {
let ts = main_state
.transfers
.iter()
.filter(|t| t.source_id == props.source_plate.get_uuid());
let mut color_map: HashMap<(u8, u8), u8> = 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();
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.name.clone());
val.push(t);
} 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))}
mouse={mouse_callback.clone()}
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}
title={if let Some(names) = tooltip_map.get(&(i,j)) {
Some(format!("Used by: {}", names.join(", ")))
title={if let Some(transfers) = transfer_map.get(&(i,j)) {
Some(format!("Used by: {}", transfers.iter().map(|t| t.name.clone())
.collect::<Vec<_>>().join(", ")))
} else { None }}
/>
}
@ -176,7 +164,7 @@ pub struct SourcePlateCellProps {
selected: bool,
mouse: Callback<(u8, u8, MouseEventType)>,
in_transfer: Option<bool>,
color: Option<u8>,
color: Option<[f64; 3]>,
cell_height: f64,
title: Option<String>,
}
@ -197,7 +185,7 @@ fn SourcePlateCell(props: &SourcePlateCellProps) -> Html {
_ => None,
};
let color = match props.color {
Some(num) => PALETTE.get_u8(num),
Some(num) => num,
None => [255.0, 255.0, 255.0],
};
let mouse = Callback::clone(&props.mouse);

View File

@ -30,6 +30,11 @@ impl ColorPalette {
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)
}
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]