Use UUID to calculate colors
Ensures that a transfer will always be represented by the same color.
This commit is contained in:
parent
43391850e0
commit
cf7860c5c5
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Reference in New Issue