added option to rename levels
This commit is contained in:
+40
-6
@@ -56,6 +56,7 @@ pub struct DungeonApp {
|
|||||||
pub hover_marker: Option<HoverMarker>,
|
pub hover_marker: Option<HoverMarker>,
|
||||||
pub hover_level_idx: Option<usize>,
|
pub hover_level_idx: Option<usize>,
|
||||||
pub hover_stair_idx: Option<usize>,
|
pub hover_stair_idx: Option<usize>,
|
||||||
|
pub rename_level_state: Option<(usize, String)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for DungeonApp {
|
impl Default for DungeonApp {
|
||||||
@@ -82,6 +83,7 @@ impl Default for DungeonApp {
|
|||||||
hover_marker: None,
|
hover_marker: None,
|
||||||
hover_level_idx: None,
|
hover_level_idx: None,
|
||||||
hover_stair_idx: None,
|
hover_stair_idx: None,
|
||||||
|
rename_level_state: None,
|
||||||
};
|
};
|
||||||
if app.settings.composition_mode {
|
if app.settings.composition_mode {
|
||||||
app.enter_composition_layout();
|
app.enter_composition_layout();
|
||||||
@@ -170,9 +172,9 @@ impl eframe::App for DungeonApp {
|
|||||||
} else if panel_result.new_level_clicked {
|
} else if panel_result.new_level_clicked {
|
||||||
self.push_undo_snapshot();
|
self.push_undo_snapshot();
|
||||||
if self.settings.composition_mode {
|
if self.settings.composition_mode {
|
||||||
self.levels.push(DungeonLayout::empty(
|
let mut layout = DungeonLayout::empty(self.settings.pack_rooms_without_corridors);
|
||||||
self.settings.pack_rooms_without_corridors,
|
layout.name = format!("Level {}", self.levels.len() + 1);
|
||||||
));
|
self.levels.push(layout);
|
||||||
} else {
|
} else {
|
||||||
self.levels
|
self.levels
|
||||||
.push(generate_level(&self.settings, self.levels.len()));
|
.push(generate_level(&self.settings, self.levels.len()));
|
||||||
@@ -257,10 +259,41 @@ impl eframe::App for DungeonApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
self.hover_level_idx =
|
self.hover_level_idx = draw_level_tabs(
|
||||||
draw_level_tabs(ui, self.levels.len(), &mut self.settings.active_level_index);
|
ui,
|
||||||
|
&self.levels,
|
||||||
|
&mut self.settings.active_level_index,
|
||||||
|
&mut self.rename_level_state,
|
||||||
|
);
|
||||||
ui.separator();
|
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 available = ui.available_size_before_wrap();
|
||||||
let (response, painter) = ui.allocate_painter(available, egui::Sense::click_and_drag());
|
let (response, painter) = ui.allocate_painter(available, egui::Sense::click_and_drag());
|
||||||
let canvas = response.rect.shrink(12.0);
|
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.
|
// Generates a single dungeon level from the UI settings.
|
||||||
pub fn generate_level(settings: &UiSettings, level_index: usize) -> DungeonLayout {
|
pub fn generate_level(settings: &UiSettings, level_index: usize) -> DungeonLayout {
|
||||||
let level_seed = crate::seed::derive_seed(settings.seed, level_index as u64);
|
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.cols,
|
||||||
settings.rows,
|
settings.rows,
|
||||||
settings.room_count,
|
settings.room_count,
|
||||||
@@ -380,6 +413,7 @@ pub fn generate_level(settings: &UiSettings, level_index: usize) -> DungeonLayou
|
|||||||
door_settings_from_ui(settings),
|
door_settings_from_ui(settings),
|
||||||
window_settings_from_ui(settings),
|
window_settings_from_ui(settings),
|
||||||
);
|
);
|
||||||
|
layout.name = format!("Level {}", level_index + 1);
|
||||||
|
|
||||||
populate_random_markers(layout, settings)
|
populate_random_markers(layout, settings)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ pub struct WindowSettings {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
|
||||||
pub struct DungeonLayout {
|
pub struct DungeonLayout {
|
||||||
|
pub name: String,
|
||||||
pub rooms: Vec<Room>,
|
pub rooms: Vec<Room>,
|
||||||
pub corridors: Vec<Corridor>,
|
pub corridors: Vec<Corridor>,
|
||||||
pub doors: Vec<Door>,
|
pub doors: Vec<Door>,
|
||||||
|
|||||||
+13
-3
@@ -169,16 +169,23 @@ pub fn draw_legend_panel(ctx: &egui::Context, settings: &mut UiSettings) -> bool
|
|||||||
composition_mode_changed
|
composition_mode_changed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::layout::DungeonLayout;
|
||||||
|
|
||||||
// Draws level tabs.
|
// Draws level tabs.
|
||||||
pub fn draw_level_tabs(
|
pub fn draw_level_tabs(
|
||||||
ui: &mut egui::Ui,
|
ui: &mut egui::Ui,
|
||||||
level_count: usize,
|
levels: &[DungeonLayout],
|
||||||
active_level_index: &mut usize,
|
active_level_index: &mut usize,
|
||||||
|
rename_level_state: &mut Option<(usize, String)>,
|
||||||
) -> Option<usize> {
|
) -> Option<usize> {
|
||||||
let mut hovered_level_idx = None;
|
let mut hovered_level_idx = None;
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
for level_idx in 0..level_count {
|
for (level_idx, level) in levels.iter().enumerate() {
|
||||||
let label = format!("Level {}", level_idx + 1);
|
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 is_active = *active_level_index == level_idx;
|
||||||
let response = ui.selectable_label(is_active, label);
|
let response = ui.selectable_label(is_active, label);
|
||||||
if response.hovered() {
|
if response.hovered() {
|
||||||
@@ -187,6 +194,9 @@ pub fn draw_level_tabs(
|
|||||||
if response.clicked() {
|
if response.clicked() {
|
||||||
*active_level_index = level_idx;
|
*active_level_index = level_idx;
|
||||||
}
|
}
|
||||||
|
if response.double_clicked() {
|
||||||
|
*rename_level_state = Some((level_idx, level.name.clone()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
hovered_level_idx
|
hovered_level_idx
|
||||||
|
|||||||
Reference in New Issue
Block a user