added level deletion
This commit is contained in:
+40
-4
@@ -64,6 +64,7 @@ struct DungeonApp {
|
|||||||
hover_door_idx: Option<usize>,
|
hover_door_idx: Option<usize>,
|
||||||
hover_text_idx: Option<usize>,
|
hover_text_idx: Option<usize>,
|
||||||
hover_marker: Option<HoverMarker>,
|
hover_marker: Option<HoverMarker>,
|
||||||
|
hover_level_idx: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for DungeonApp {
|
impl Default for DungeonApp {
|
||||||
@@ -87,6 +88,7 @@ impl Default for DungeonApp {
|
|||||||
hover_door_idx: None,
|
hover_door_idx: None,
|
||||||
hover_text_idx: None,
|
hover_text_idx: None,
|
||||||
hover_marker: None,
|
hover_marker: None,
|
||||||
|
hover_level_idx: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,9 +176,21 @@ impl eframe::App for DungeonApp {
|
|||||||
self.levels.push(layout);
|
self.levels.push(layout);
|
||||||
self.settings.active_level_index = self.levels.len() - 1;
|
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)) {
|
if ctx.input(|i| i.key_pressed(egui::Key::Delete) || i.key_pressed(egui::Key::Backspace)) {
|
||||||
self.pending_delete = true;
|
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() {
|
if panel_result.export_clicked && self.export_rx.is_none() {
|
||||||
let target = match exporter::select_export_target(&self.settings) {
|
let target = match exporter::select_export_target(&self.settings) {
|
||||||
Ok(target) => target,
|
Ok(target) => target,
|
||||||
@@ -286,10 +300,13 @@ impl eframe::App for DungeonApp {
|
|||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
for i in 0..self.levels.len() {
|
for i in 0..self.levels.len() {
|
||||||
let label = format!("Level {}", i + 1);
|
let label = format!("Level {}", i + 1);
|
||||||
if ui
|
let is_active = self.settings.active_level_index == i;
|
||||||
.selectable_label(self.settings.active_level_index == i, label)
|
let response = ui.selectable_label(is_active, label);
|
||||||
.clicked()
|
// Track hover on level tabs.
|
||||||
{
|
if response.hovered() {
|
||||||
|
self.hover_level_idx = Some(i);
|
||||||
|
}
|
||||||
|
if response.clicked() {
|
||||||
self.settings.active_level_index = i;
|
self.settings.active_level_index = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -411,6 +428,7 @@ impl DungeonApp {
|
|||||||
self.hover_door_idx = None;
|
self.hover_door_idx = None;
|
||||||
self.hover_text_idx = None;
|
self.hover_text_idx = None;
|
||||||
self.hover_marker = None;
|
self.hover_marker = None;
|
||||||
|
self.hover_level_idx = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reset_transient_state(&mut self) {
|
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.
|
// Handle dragging rooms or corridors with the primary mouse button.
|
||||||
fn handle_drag(
|
fn handle_drag(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|||||||
Reference in New Issue
Block a user