added option to rename levels

This commit is contained in:
grimsace
2026-05-21 10:56:44 -05:00
parent 0499c054cf
commit e4845db201
3 changed files with 54 additions and 9 deletions
+40 -6
View File
@@ -56,6 +56,7 @@ pub struct DungeonApp {
pub hover_marker: Option<HoverMarker>,
pub hover_level_idx: Option<usize>,
pub hover_stair_idx: Option<usize>,
pub rename_level_state: Option<(usize, String)>,
}
impl Default for DungeonApp {
@@ -82,6 +83,7 @@ impl Default for DungeonApp {
hover_marker: None,
hover_level_idx: None,
hover_stair_idx: None,
rename_level_state: None,
};
if app.settings.composition_mode {
app.enter_composition_layout();
@@ -170,9 +172,9 @@ impl eframe::App for DungeonApp {
} else if panel_result.new_level_clicked {
self.push_undo_snapshot();
if self.settings.composition_mode {
self.levels.push(DungeonLayout::empty(
self.settings.pack_rooms_without_corridors,
));
let mut layout = DungeonLayout::empty(self.settings.pack_rooms_without_corridors);
layout.name = format!("Level {}", self.levels.len() + 1);
self.levels.push(layout);
} else {
self.levels
.push(generate_level(&self.settings, self.levels.len()));
@@ -257,10 +259,41 @@ impl eframe::App for DungeonApp {
}
egui::CentralPanel::default().show(ctx, |ui| {
self.hover_level_idx =
draw_level_tabs(ui, self.levels.len(), &mut self.settings.active_level_index);
self.hover_level_idx = draw_level_tabs(
ui,
&self.levels,
&mut self.settings.active_level_index,
&mut self.rename_level_state,
);
ui.separator();
if let Some((level_idx, mut name)) = self.rename_level_state.take() {
let mut open = true;
egui::Window::new("Rename Level")
.collapsible(false)
.resizable(false)
.open(&mut open)
.show(ctx, |ui| {
ui.horizontal(|ui| {
ui.label("Name:");
let res = ui.text_edit_singleline(&mut name);
if ui.button("Rename").clicked()
|| (res.lost_focus()
&& ui.input(|i| i.key_pressed(egui::Key::Enter)))
{
if level_idx < self.levels.len() {
self.levels[level_idx].name = name.clone();
self.rename_level_state = None;
}
}
});
});
if open {
self.rename_level_state = Some((level_idx, name));
}
}
let available = ui.available_size_before_wrap();
let (response, painter) = ui.allocate_painter(available, egui::Sense::click_and_drag());
let canvas = response.rect.shrink(12.0);
@@ -364,7 +397,7 @@ pub fn generate_all_levels(settings: &UiSettings) -> Vec<DungeonLayout> {
// Generates a single dungeon level from the UI settings.
pub fn generate_level(settings: &UiSettings, level_index: usize) -> DungeonLayout {
let level_seed = crate::seed::derive_seed(settings.seed, level_index as u64);
let layout = layout::generate_layout(
let mut layout = layout::generate_layout(
settings.cols,
settings.rows,
settings.room_count,
@@ -380,6 +413,7 @@ pub fn generate_level(settings: &UiSettings, level_index: usize) -> DungeonLayou
door_settings_from_ui(settings),
window_settings_from_ui(settings),
);
layout.name = format!("Level {}", level_index + 1);
populate_random_markers(layout, settings)
}
+1
View File
@@ -213,6 +213,7 @@ pub struct WindowSettings {
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct DungeonLayout {
pub name: String,
pub rooms: Vec<Room>,
pub corridors: Vec<Corridor>,
pub doors: Vec<Door>,
+13 -3
View File
@@ -169,16 +169,23 @@ pub fn draw_legend_panel(ctx: &egui::Context, settings: &mut UiSettings) -> bool
composition_mode_changed
}
use crate::layout::DungeonLayout;
// Draws level tabs.
pub fn draw_level_tabs(
ui: &mut egui::Ui,
level_count: usize,
levels: &[DungeonLayout],
active_level_index: &mut usize,
rename_level_state: &mut Option<(usize, String)>,
) -> Option<usize> {
let mut hovered_level_idx = None;
ui.horizontal(|ui| {
for level_idx in 0..level_count {
let label = format!("Level {}", level_idx + 1);
for (level_idx, level) in levels.iter().enumerate() {
let label = if level.name.is_empty() {
format!("Level {}", level_idx + 1)
} else {
level.name.clone()
};
let is_active = *active_level_index == level_idx;
let response = ui.selectable_label(is_active, label);
if response.hovered() {
@@ -187,6 +194,9 @@ pub fn draw_level_tabs(
if response.clicked() {
*active_level_index = level_idx;
}
if response.double_clicked() {
*rename_level_state = Some((level_idx, level.name.clone()));
}
}
});
hovered_level_idx