use eframe::egui; use crate::{ main_state::MainState, modals::ModalState, transfer_menu::{CurrentTransferState, CurrentTransferStateInterior}, }; use std::sync::LazyLock; static SELECT_COLOR: LazyLock = 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 = 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 = 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 = 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; } } }