From e855732901e9fb230e62f828c34eda9be18930fd Mon Sep 17 00:00:00 2001 From: Emilia Date: Sun, 23 Nov 2025 19:25:57 -0500 Subject: [PATCH] Refactor top bar menu to new file --- plate-tool-eframe/src/app.rs | 139 +++------------------------- plate-tool-eframe/src/lib.rs | 1 + plate-tool-eframe/src/upper_menu.rs | 139 ++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 126 deletions(-) create mode 100644 plate-tool-eframe/src/upper_menu.rs diff --git a/plate-tool-eframe/src/app.rs b/plate-tool-eframe/src/app.rs index 84e9c61..652006e 100644 --- a/plate-tool-eframe/src/app.rs +++ b/plate-tool-eframe/src/app.rs @@ -14,13 +14,14 @@ use crate::modals::{self, ModalState}; use crate::plate::{add_plate, PlateDisplayOptions, PlateUiState}; use crate::transfer_menu::{transfer_menu, CurrentTransferState, TransferMenuState}; use crate::tree::tree; +use crate::upper_menu; #[non_exhaustive] #[derive(Debug, serde::Serialize, serde::Deserialize)] -struct MainWindowState { - show_side_panel: bool, - plate_display_options: PlateDisplayOptions, - csv_export_type: CsvExportType, +pub struct MainWindowState { + pub show_side_panel: bool, + pub plate_display_options: PlateDisplayOptions, + pub csv_export_type: CsvExportType, } impl Default for MainWindowState { @@ -35,7 +36,7 @@ impl Default for MainWindowState { #[non_exhaustive] #[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, std::default::Default)] -enum CsvExportType { +pub enum CsvExportType { #[default] Normal, EchoClient, @@ -107,127 +108,13 @@ impl eframe::App for PlateToolEframe { crate::styling::set_visuals(&ctx); egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { - egui::MenuBar::new().ui(ui, |ui| { - ui.menu_button("File", |ui| { - if ui.button("New Plate").clicked() { - crate::modals::open_new_plate_modal(&mut self.modal_state); - } - ui.menu_button("Export", |ui| { - if ui.button("Export as CSV").clicked() { - let records: Vec = self - .main_state - .transfers - .iter() - .flat_map(|transfer| { - let src_barcode = self - .main_state - .source_plates - .iter() - .find(|spi| spi.get_uuid() == transfer.source_id)?; - let dest_barcode = self - .main_state - .destination_plates - .iter() - .find(|dpi| dpi.get_uuid() == transfer.dest_id)?; - - if self.main_window_state.csv_export_type - != CsvExportType::EchoClient - || self - .main_state - .get_current_source_uuid() - .is_some_and(|x| x != src_barcode.get_uuid()) - || self - .main_state - .get_current_destination_uuid() - .is_some_and(|x| x != dest_barcode.get_uuid()) - { - return None; - } - - Some(transfer_to_records( - transfer, - &src_barcode.name, - &dest_barcode.name, - )) - }) - .flatten() - .collect(); - - let data = match self.main_window_state.csv_export_type { - CsvExportType::Normal => records_to_csv(records), - CsvExportType::EchoClient => records_to_echo_client_csv(records), - }; - if let Ok(data) = data { - let bytes: &[u8] = data.as_bytes(); - save_file(bytes, Some("transfers.csv")); - } - } - if ui.button("Export as JSON").clicked() { - let data = serde_json::to_string_pretty(&self.main_state); - if let Ok(data) = data { - let bytes: &[u8] = data.as_bytes(); - save_file(bytes, Some("plate_tool_state.json")); - } - } - }); - ui.menu_button("Import", |ui| { - if ui.button("Import from JSON").clicked() {} - if ui.button("Import transfer from CSV").clicked() {} - }); - if ui.button("Reset All").clicked() { - self.main_state = MainState::default(); - self.current_transfer_state = CurrentTransferState::default(); - } - if ui.button("Dump State").clicked() { - log::warn!("{:?}\n{:?}", self.main_state, self.current_transfer_state); - } - }); - ui.menu_button("Options", |ui| { - ui.menu_button("Styles", |ui| { - ui.toggle_value( - &mut self - .main_window_state - .plate_display_options - .show_transfer_hashes, - "Toggle transfer hashes", - ); - ui.toggle_value( - &mut self - .main_window_state - .plate_display_options - .show_volume_heatmap, - "Toggle volume heatmap", - ); - ui.toggle_value( - &mut self - .main_window_state - .plate_display_options - .show_coordinates, - "Toggle coordinate highlighting", - ); - }); - ui.menu_button("Exports", |ui| { - ui.menu_button("CSV Export Type", |ui| { - ui.radio_value( - &mut self.main_window_state.csv_export_type, - CsvExportType::Normal, - format!("{}", CsvExportType::Normal), - ); - ui.radio_value( - &mut self.main_window_state.csv_export_type, - CsvExportType::EchoClient, - format!("{}", CsvExportType::EchoClient), - ); - }); - }); - ui.menu_button("Windows", |ui| { - ui.toggle_value( - &mut self.main_window_state.show_side_panel, - "Toggle side panel", - ); - }); - }); - }); + upper_menu::render_menu_bar( + ui, + &mut self.main_state, + &mut self.modal_state, + &mut self.current_transfer_state, + &mut self.main_window_state, + ); }); if self.main_window_state.show_side_panel { diff --git a/plate-tool-eframe/src/lib.rs b/plate-tool-eframe/src/lib.rs index c025f35..26426f3 100644 --- a/plate-tool-eframe/src/lib.rs +++ b/plate-tool-eframe/src/lib.rs @@ -6,4 +6,5 @@ mod main_state; mod modals; mod styling; mod file_handling; +mod upper_menu; pub use app::PlateToolEframe; diff --git a/plate-tool-eframe/src/upper_menu.rs b/plate-tool-eframe/src/upper_menu.rs new file mode 100644 index 0000000..201df3c --- /dev/null +++ b/plate-tool-eframe/src/upper_menu.rs @@ -0,0 +1,139 @@ +use crate::app::{CsvExportType, MainWindowState}; +use crate::file_handling::save_file; +use crate::main_state::MainState; +use crate::modals::ModalState; +use crate::transfer_menu::CurrentTransferState; + +use plate_tool_lib::csv::{ + records_to_csv, records_to_echo_client_csv, transfer_to_records, TransferRecord, +}; + +use eframe::egui; + +pub fn render_menu_bar( + ui: &mut egui::Ui, + main_state: &mut MainState, + modal_state: &mut ModalState, + current_transfer_state: &mut CurrentTransferState, + main_window_state: &mut MainWindowState, +) { + egui::MenuBar::new().ui(ui, |ui| { + ui.menu_button("File", |ui| { + if ui.button("New Plate").clicked() { + crate::modals::open_new_plate_modal(modal_state); + } + ui.menu_button("Export", |ui| { + render_export_menu( + ui, + main_state, + modal_state, + current_transfer_state, + main_window_state, + ); + }); + ui.menu_button("Import", |ui| { + if ui.button("Import from JSON").clicked() {} + if ui.button("Import transfer from CSV").clicked() {} + }); + if ui.button("Reset All").clicked() { + *main_state = MainState::default(); + *current_transfer_state = CurrentTransferState::default(); + } + if ui.button("Dump State").clicked() { + log::warn!("{:?}\n{:?}", main_state, current_transfer_state); + } + }); + ui.menu_button("Options", |ui| { + ui.menu_button("Styles", |ui| { + ui.toggle_value( + &mut main_window_state.plate_display_options.show_transfer_hashes, + "Toggle transfer hashes", + ); + ui.toggle_value( + &mut main_window_state.plate_display_options.show_volume_heatmap, + "Toggle volume heatmap", + ); + ui.toggle_value( + &mut main_window_state.plate_display_options.show_coordinates, + "Toggle coordinate highlighting", + ); + }); + ui.menu_button("Exports", |ui| { + ui.menu_button("CSV Export Type", |ui| { + ui.radio_value( + &mut main_window_state.csv_export_type, + CsvExportType::Normal, + format!("{}", CsvExportType::Normal), + ); + ui.radio_value( + &mut main_window_state.csv_export_type, + CsvExportType::EchoClient, + format!("{}", CsvExportType::EchoClient), + ); + }); + }); + ui.menu_button("Windows", |ui| { + ui.toggle_value(&mut main_window_state.show_side_panel, "Toggle side panel"); + }); + }); + }); +} + +fn render_export_menu( + ui: &mut egui::Ui, + main_state: &mut MainState, + _modal_state: &mut ModalState, + _current_transfer_state: &mut CurrentTransferState, + main_window_state: &mut MainWindowState, +) { + if ui.button("Export as CSV").clicked() { + let records: Vec = main_state + .transfers + .iter() + .flat_map(|transfer| { + let src_barcode = main_state + .source_plates + .iter() + .find(|spi| spi.get_uuid() == transfer.source_id)?; + let dest_barcode = main_state + .destination_plates + .iter() + .find(|dpi| dpi.get_uuid() == transfer.dest_id)?; + + if main_window_state.csv_export_type != CsvExportType::EchoClient + || main_state + .get_current_source_uuid() + .is_some_and(|x| x != src_barcode.get_uuid()) + || main_state + .get_current_destination_uuid() + .is_some_and(|x| x != dest_barcode.get_uuid()) + { + return None; + } + + Some(transfer_to_records( + transfer, + &src_barcode.name, + &dest_barcode.name, + )) + }) + .flatten() + .collect(); + + let data = match main_window_state.csv_export_type { + CsvExportType::Normal => records_to_csv(records), + CsvExportType::EchoClient => records_to_echo_client_csv(records), + }; + if let Ok(data) = data { + let bytes: &[u8] = data.as_bytes(); + save_file(bytes, Some("transfers.csv")); + } + } + if ui.button("Export as JSON").clicked() { + let data = serde_json::to_string_pretty(main_state); + if let Ok(data) = data { + let bytes: &[u8] = data.as_bytes(); + save_file(bytes, Some("plate_tool_state.json")); + } + } +}