Refactor top bar menu to new file

This commit is contained in:
Emilia Allison 2025-11-23 19:25:57 -05:00
parent f0476fe650
commit e855732901
Signed by: emilia
GPG Key ID: FEC1CE6360EEC9A8
3 changed files with 153 additions and 126 deletions

View File

@ -14,13 +14,14 @@ use crate::modals::{self, ModalState};
use crate::plate::{add_plate, PlateDisplayOptions, PlateUiState}; use crate::plate::{add_plate, PlateDisplayOptions, PlateUiState};
use crate::transfer_menu::{transfer_menu, CurrentTransferState, TransferMenuState}; use crate::transfer_menu::{transfer_menu, CurrentTransferState, TransferMenuState};
use crate::tree::tree; use crate::tree::tree;
use crate::upper_menu;
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, serde::Serialize, serde::Deserialize)] #[derive(Debug, serde::Serialize, serde::Deserialize)]
struct MainWindowState { pub struct MainWindowState {
show_side_panel: bool, pub show_side_panel: bool,
plate_display_options: PlateDisplayOptions, pub plate_display_options: PlateDisplayOptions,
csv_export_type: CsvExportType, pub csv_export_type: CsvExportType,
} }
impl Default for MainWindowState { impl Default for MainWindowState {
@ -35,7 +36,7 @@ impl Default for MainWindowState {
#[non_exhaustive] #[non_exhaustive]
#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, std::default::Default)] #[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, std::default::Default)]
enum CsvExportType { pub enum CsvExportType {
#[default] #[default]
Normal, Normal,
EchoClient, EchoClient,
@ -107,127 +108,13 @@ impl eframe::App for PlateToolEframe {
crate::styling::set_visuals(&ctx); crate::styling::set_visuals(&ctx);
egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { egui::TopBottomPanel::top("top_panel").show(ctx, |ui| {
egui::MenuBar::new().ui(ui, |ui| { upper_menu::render_menu_bar(
ui.menu_button("File", |ui| { ui,
if ui.button("New Plate").clicked() { &mut self.main_state,
crate::modals::open_new_plate_modal(&mut self.modal_state); &mut self.modal_state,
} &mut self.current_transfer_state,
ui.menu_button("Export", |ui| { &mut self.main_window_state,
if ui.button("Export as CSV").clicked() { );
let records: Vec<TransferRecord> = 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",
);
});
});
});
}); });
if self.main_window_state.show_side_panel { if self.main_window_state.show_side_panel {

View File

@ -6,4 +6,5 @@ mod main_state;
mod modals; mod modals;
mod styling; mod styling;
mod file_handling; mod file_handling;
mod upper_menu;
pub use app::PlateToolEframe; pub use app::PlateToolEframe;

View File

@ -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<TransferRecord> = 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"));
}
}
}