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::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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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