From 773af39118282f69a6b99712291f17897a82ef9a Mon Sep 17 00:00:00 2001 From: grimsace Date: Tue, 28 Apr 2026 12:11:24 -0500 Subject: [PATCH] added selection for level to export --- src/main.rs | 15 ++++++++++++--- src/ui.rs | 23 ++++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 61b680c..e2e661e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -114,7 +114,12 @@ impl Drop for DungeonApp { impl eframe::App for DungeonApp { // Render UI, handle input, and update app state each frame. fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - let panel_result = draw_side_panel(ctx, &mut self.settings, self.export_rx.is_some()); + let panel_result = draw_side_panel( + ctx, + &mut self.settings, + self.export_rx.is_some(), + self.levels.len(), + ); let undo_requested = ctx.input(|i| i.modifiers.command && i.key_pressed(egui::Key::Z)); let redo_requested = ctx.input(|i| { (i.modifiers.command && i.key_pressed(egui::Key::Y)) @@ -218,8 +223,12 @@ impl eframe::App for DungeonApp { } } - if self.settings.active_level_index < self.levels.len() { - let layout = self.levels[self.settings.active_level_index].clone(); + let export_idx = self + .settings + .export_level_index + .min(self.levels.len().saturating_sub(1)); + if export_idx < self.levels.len() { + let layout = self.levels[export_idx].clone(); let settings = self.settings.clone(); let (tx, rx) = mpsc::channel(); thread::spawn(move || { diff --git a/src/ui.rs b/src/ui.rs index 7f8508f..e4e3f74 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -145,6 +145,7 @@ pub struct UiSettings { pub min_levels: usize, pub max_levels: usize, pub active_level_index: usize, + pub export_level_index: usize, pub trap_frequency_percent: usize, pub min_traps_per_area: usize, pub max_traps_per_area: usize, @@ -223,6 +224,7 @@ impl Default for UiSettings { max_stairs_per_level: 2, sync_stairs_across_levels: false, manual_stair_size: 2, + export_level_index: 0, active_tab: Tab::Generate, } } @@ -260,6 +262,7 @@ pub fn draw_side_panel( ctx: &egui::Context, settings: &mut UiSettings, export_in_progress: bool, + num_levels: usize, ) -> SidePanelResult { // Render the left side panel and return user interaction results. let mut result = SidePanelResult::default(); @@ -307,7 +310,7 @@ pub fn draw_side_panel( match settings.active_tab { Tab::Generate => { - draw_generate_tab(ui, settings, &mut result, export_in_progress) + draw_generate_tab(ui, settings, &mut result, export_in_progress, num_levels) } Tab::Layout => draw_layout_tab(ui, settings, &mut result), Tab::StartAndEnd => draw_start_and_end_tab(ui, settings, &mut result), @@ -326,6 +329,7 @@ fn draw_generate_tab( settings: &mut UiSettings, result: &mut SidePanelResult, export_in_progress: bool, + num_levels: usize, ) { ui.label(RichText::new("Grid Settings").strong()); ui.add_space(8.0); @@ -424,6 +428,23 @@ fn draw_generate_tab( }); }); + ui.add_space(4.0); + let level_count = num_levels; + ui.horizontal(|ui| { + ui.label("Level"); + egui::ComboBox::from_id_salt("export_level") + .selected_text(format!("Level {}", settings.export_level_index)) + .show_ui(ui, |ui| { + for i in 0..level_count { + ui.selectable_value( + &mut settings.export_level_index, + i, + format!("Level {}", i), + ); + } + }); + }); + if settings.export_format == ExportFormat::Folder { ui.add_space(6.0); ui.horizontal(|ui| {