plate-tool/plate-tool-eframe/src/tree.rs

164 lines
5.6 KiB
Rust

use eframe::egui;
use crate::{
main_state::MainState,
modals::ModalState,
transfer_menu::{CurrentTransferState, CurrentTransferStateInterior},
};
use std::sync::LazyLock;
static SELECT_COLOR: LazyLock<egui::Color32> =
LazyLock::new(|| egui::Color32::from_hex("#aa0000").unwrap());
pub fn tree(
ui: &mut egui::Ui,
ms: &mut MainState,
cts: &CurrentTransferState,
modal_state: &mut ModalState,
) {
// Add all source plates
ui.vertical(|ui| {
ui.heading("Source Plates");
let mut new_uuid: Option<plate_tool_lib::uuid::Uuid> = None;
for (name, uuid) in ms.source_plates.iter().map(|x| (&x.name, x.get_uuid())) {
let f = {
let mut f = egui::Frame::none();
if ms.get_current_source_uuid().is_some_and(|x| x == uuid) {
f = f.fill(*SELECT_COLOR);
}
f
};
f.show(ui, |ui| {
let r = ui.add(
egui::Label::new(name)
.sense(egui::Sense::click())
.selectable(false),
);
if r.clicked() {
new_uuid = Some(uuid);
}
if r.double_clicked() {
let pi = ms.get_source_by_uuid(uuid);
if let Some(pi) = pi {
crate::modals::open_edit_plate_modal_plateinstance(modal_state, &pi);
}
}
});
}
if let Some(uuid) = new_uuid {
let current_source_uuid = ms.get_current_source_uuid();
if current_source_uuid.is_some_and(|x| x != uuid) || current_source_uuid.is_none() {
ms.set_current_source(uuid);
ms.set_no_current_transfer();
if let Some(mut cts) = cts.lock().ok() {
*cts = CurrentTransferStateInterior::default();
}
set_plates(ms, cts);
}
}
});
// Add all destination plates
ui.vertical(|ui| {
ui.heading("Destination Plates");
let mut new_uuid: Option<plate_tool_lib::uuid::Uuid> = None;
for (name, uuid) in ms
.destination_plates
.iter()
.map(|x| (&x.name, x.get_uuid()))
{
let f = {
let mut f = egui::Frame::none();
if ms.get_current_destination_uuid().is_some_and(|x| x == uuid) {
f = f.fill(*SELECT_COLOR);
}
f
};
f.show(ui, |ui| {
let r = ui.add(
egui::Label::new(name)
.sense(egui::Sense::click())
.selectable(false),
);
if r.clicked() {
new_uuid = Some(uuid);
}
if r.double_clicked() {
let pi = ms.get_destination_by_uuid(uuid);
if let Some(pi) = pi {
crate::modals::open_edit_plate_modal_plateinstance(modal_state, &pi);
}
}
});
}
if let Some(uuid) = new_uuid {
let current_destination_uuid = ms.get_current_destination_uuid();
if current_destination_uuid.is_some_and(|x| x != uuid)
|| current_destination_uuid.is_none()
{
ms.set_current_destination(uuid);
ms.set_no_current_transfer();
if let Some(mut cts) = cts.lock().ok() {
*cts = CurrentTransferStateInterior::default();
cts.destination_plate = ms
.get_current_destination_plateinstance()
.expect("Just set destination")
.plate;
}
set_plates(ms, cts);
log::warn!(
"{:?}\n{:?}",
cts,
ms.get_current_destination_plateinstance()
);
}
}
});
// Add all transfers
ui.vertical(|ui| {
ui.heading("Transfers");
let mut new_uuid: Option<plate_tool_lib::uuid::Uuid> = None;
for (name, uuid) in ms.transfers.iter().map(|x| (&x.name, x.get_uuid())) {
let f = {
let mut f = egui::Frame::none();
if ms.get_current_transfer_uuid().is_some_and(|x| x == uuid) {
f = f.fill(*SELECT_COLOR);
}
f
};
f.show(ui, |ui| {
let r = ui.add(
egui::Label::new(name)
.sense(egui::Sense::click())
.selectable(false),
);
if r.clicked() {
new_uuid = Some(uuid);
log::info!("{:?}", uuid);
}
});
}
if let Some(uuid) = new_uuid {
ms.set_current_transfer(uuid);
if let Some(new_cts) =
CurrentTransferStateInterior::try_new_from_main_state_transfer(ms)
{
*cts.lock().unwrap() = new_cts;
}
set_plates(ms, cts);
}
});
}
fn set_plates(ms: &MainState, cts: &CurrentTransferState) {
if let Some(mut cts) = cts.lock().ok() {
if let Some(source_plate) = ms.get_current_source_plateinstance() {
cts.source_plate = source_plate.plate;
}
if let Some(destination_plate) = ms.get_current_destination_plateinstance() {
cts.destination_plate = destination_plate.plate;
}
}
}