Refactor top bar menu to new file
This commit is contained in:
parent
f0476fe650
commit
e855732901
|
|
@ -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<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",
|
||||
upper_menu::render_menu_bar(
|
||||
ui,
|
||||
&mut self.main_state,
|
||||
&mut self.modal_state,
|
||||
&mut self.current_transfer_state,
|
||||
&mut self.main_window_state,
|
||||
);
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -6,4 +6,5 @@ mod main_state;
|
|||
mod modals;
|
||||
mod styling;
|
||||
mod file_handling;
|
||||
mod upper_menu;
|
||||
pub use app::PlateToolEframe;
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue