added level deletion

This commit is contained in:
grimsace
2026-04-27 07:20:17 -05:00
parent 062a9fddd5
commit 8d48c7598e
+40 -4
View File
@@ -64,6 +64,7 @@ struct DungeonApp {
hover_door_idx: Option<usize>,
hover_text_idx: Option<usize>,
hover_marker: Option<HoverMarker>,
hover_level_idx: Option<usize>,
}
impl Default for DungeonApp {
@@ -87,6 +88,7 @@ impl Default for DungeonApp {
hover_door_idx: None,
hover_text_idx: None,
hover_marker: None,
hover_level_idx: None,
}
}
}
@@ -174,9 +176,21 @@ impl eframe::App for DungeonApp {
self.levels.push(layout);
self.settings.active_level_index = self.levels.len() - 1;
}
// Check for level deletion keybind when hovering over a level tab.
let level_delete_requested = ctx.input(|i| {
(i.key_pressed(egui::Key::Delete) || i.key_pressed(egui::Key::Backspace))
&& self.hover_level_idx.is_some()
});
if ctx.input(|i| i.key_pressed(egui::Key::Delete) || i.key_pressed(egui::Key::Backspace)) {
self.pending_delete = true;
}
if level_delete_requested {
if let Some(level_idx) = self.hover_level_idx {
self.delete_level(level_idx);
}
}
if panel_result.export_clicked && self.export_rx.is_none() {
let target = match exporter::select_export_target(&self.settings) {
Ok(target) => target,
@@ -286,10 +300,13 @@ impl eframe::App for DungeonApp {
ui.horizontal(|ui| {
for i in 0..self.levels.len() {
let label = format!("Level {}", i + 1);
if ui
.selectable_label(self.settings.active_level_index == i, label)
.clicked()
{
let is_active = self.settings.active_level_index == i;
let response = ui.selectable_label(is_active, label);
// Track hover on level tabs.
if response.hovered() {
self.hover_level_idx = Some(i);
}
if response.clicked() {
self.settings.active_level_index = i;
}
}
@@ -411,6 +428,7 @@ impl DungeonApp {
self.hover_door_idx = None;
self.hover_text_idx = None;
self.hover_marker = None;
self.hover_level_idx = None;
}
fn reset_transient_state(&mut self) {
@@ -487,6 +505,24 @@ impl DungeonApp {
}
}
// Delete a level by index, with undo support and safeguards.
fn delete_level(&mut self, level_idx: usize) {
// Don't delete if there's only one level remaining.
if self.levels.len() <= 1 {
return;
}
if level_idx >= self.levels.len() {
return;
}
self.push_undo_snapshot();
self.levels.remove(level_idx);
// Adjust active level index to stay within bounds.
if self.settings.active_level_index >= self.levels.len() {
self.settings.active_level_index = self.levels.len() - 1;
}
self.reset_transient_state();
}
// Handle dragging rooms or corridors with the primary mouse button.
fn handle_drag(
&mut self,