made ui changes
This commit is contained in:
@@ -0,0 +1,205 @@
|
||||
use eframe::egui;
|
||||
use egui::RichText;
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
enum Tab {
|
||||
Generate,
|
||||
Layout,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct UiSettings {
|
||||
pub cols: usize,
|
||||
pub rows: usize,
|
||||
pub room_count: usize,
|
||||
pub min_room_size: usize,
|
||||
pub max_room_size: usize,
|
||||
pub square_rooms_only: bool,
|
||||
pub corridor_randomness: usize,
|
||||
pub dead_end_rooms_percent: usize,
|
||||
active_tab: Tab,
|
||||
}
|
||||
|
||||
impl Default for UiSettings {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
cols: 24,
|
||||
rows: 18,
|
||||
room_count: 8,
|
||||
min_room_size: 2,
|
||||
max_room_size: 6,
|
||||
square_rooms_only: false,
|
||||
corridor_randomness: 0,
|
||||
dead_end_rooms_percent: 0,
|
||||
active_tab: Tab::Generate,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, Default)]
|
||||
pub struct SidePanelResult {
|
||||
pub settings_changed: bool,
|
||||
pub generate_clicked: bool,
|
||||
}
|
||||
|
||||
pub fn draw_side_panel(ctx: &egui::Context, settings: &mut UiSettings) -> SidePanelResult {
|
||||
let mut result = SidePanelResult::default();
|
||||
|
||||
egui::SidePanel::left("options_panel")
|
||||
.resizable(true)
|
||||
.min_width(180.0)
|
||||
.default_width(280.0)
|
||||
.show_separator_line(true)
|
||||
.show(ctx, |ui| {
|
||||
ui.horizontal(|ui| {
|
||||
let is_generate = settings.active_tab == Tab::Generate;
|
||||
let is_layout = settings.active_tab == Tab::Layout;
|
||||
|
||||
if ui.selectable_label(is_generate, "Generate").clicked() {
|
||||
settings.active_tab = Tab::Generate;
|
||||
}
|
||||
if ui.selectable_label(is_layout, "Layout").clicked() {
|
||||
settings.active_tab = Tab::Layout;
|
||||
}
|
||||
});
|
||||
ui.separator();
|
||||
|
||||
match settings.active_tab {
|
||||
Tab::Generate => draw_generate_tab(ui, settings, &mut result),
|
||||
Tab::Layout => draw_layout_tab(ui, settings, &mut result),
|
||||
}
|
||||
});
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
fn draw_generate_tab(ui: &mut egui::Ui, settings: &mut UiSettings, result: &mut SidePanelResult) {
|
||||
ui.label(RichText::new("Grid Settings").strong());
|
||||
ui.add_space(8.0);
|
||||
|
||||
ui.label("Columns");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.cols, 6..=100).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.cols)
|
||||
.speed(1.0)
|
||||
.range(2..=500),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
ui.label("Rows");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.rows, 6..=100).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.rows)
|
||||
.speed(1.0)
|
||||
.range(2..=500),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(12.0);
|
||||
ui.label(RichText::new("Generation").strong());
|
||||
ui.add_space(8.0);
|
||||
|
||||
if ui.button("Generate New Layout").clicked() {
|
||||
result.generate_clicked = true;
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_layout_tab(ui: &mut egui::Ui, settings: &mut UiSettings, result: &mut SidePanelResult) {
|
||||
ui.label(RichText::new("Room Settings").strong());
|
||||
ui.add_space(8.0);
|
||||
|
||||
ui.label("Room Count");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.room_count, 1..=40).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.room_count)
|
||||
.speed(1.0)
|
||||
.range(1..=200),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
ui.label("Min Room Size");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.min_room_size, 2..=30).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.min_room_size)
|
||||
.speed(1.0)
|
||||
.range(2..=200),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
ui.label("Max Room Size");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.max_room_size, 2..=30).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.max_room_size)
|
||||
.speed(1.0)
|
||||
.range(2..=200),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
result.settings_changed |= ui
|
||||
.checkbox(&mut settings.square_rooms_only, "Square Rooms Only")
|
||||
.changed();
|
||||
|
||||
ui.add_space(12.0);
|
||||
ui.separator();
|
||||
ui.add_space(8.0);
|
||||
ui.label(RichText::new("Corridor Settings").strong());
|
||||
ui.add_space(8.0);
|
||||
|
||||
ui.label("Corridor Randomness (%)");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.corridor_randomness, 0..=100).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.corridor_randomness)
|
||||
.speed(1.0)
|
||||
.range(0..=100),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
|
||||
ui.add_space(8.0);
|
||||
ui.label("Dead-End Rooms (%)");
|
||||
ui.horizontal(|ui| {
|
||||
result.settings_changed |= ui
|
||||
.add(egui::Slider::new(&mut settings.dead_end_rooms_percent, 0..=50).show_value(false))
|
||||
.changed();
|
||||
result.settings_changed |= ui
|
||||
.add(
|
||||
egui::DragValue::new(&mut settings.dead_end_rooms_percent)
|
||||
.speed(1.0)
|
||||
.range(0..=50),
|
||||
)
|
||||
.changed();
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user