a large number of small ui changes

This commit is contained in:
grimsace
2026-04-21 14:12:02 -05:00
parent 4295bb6b0f
commit 82f8323ff4
2 changed files with 77 additions and 45 deletions
+60 -41
View File
@@ -2,7 +2,7 @@ use std::sync::mpsc::{self, Receiver, TryRecvError};
use std::thread;
use eframe::egui::{
self, Color32, ColorImage, Context, DragValue, RichText, Sense, Slider, TextureHandle,
self, Color32, ColorImage, Context, DragValue, Frame, RichText, Sense, Slider, TextureHandle,
TextureOptions, Ui, Vec2,
};
use rand::Rng;
@@ -42,7 +42,7 @@ impl TerrainApp {
Self {
params: GenerationParams::default(),
generation_tab: LeftTab::Generation,
preview_focus: PreviewFocus::Heightmap,
preview_focus: PreviewFocus::Bumpmap,
textures: None,
generated: None,
generation_receiver: None,
@@ -127,11 +127,16 @@ impl TerrainApp {
.default_width(320.0)
.min_width(280.0)
.show(ctx, |ui| {
ui.heading("Terrain Generator");
ui.heading("Advanced Erosion Terrain Generator");
ui.add_space(8.0);
ui.horizontal(|ui| {
Self::tab_button(ui, &mut self.generation_tab, LeftTab::Generation, "Generation");
Self::tab_button(
ui,
&mut self.generation_tab,
LeftTab::Generation,
"Generation",
);
Self::tab_button(ui, &mut self.generation_tab, LeftTab::Advanced, "Advanced");
});
@@ -231,46 +236,46 @@ impl TerrainApp {
let bottom_strip_height = (available.y * 0.24).max(120.0).min(220.0);
let main_height = (available.y - bottom_strip_height - 8.0).max(100.0);
let (main_texture, bottom_texture) = match self.preview_focus {
PreviewFocus::Heightmap => (&textures.heightmap, &textures.bumpmap),
PreviewFocus::Bumpmap => (&textures.bumpmap, &textures.heightmap),
let main_texture = match self.preview_focus {
PreviewFocus::Heightmap => &textures.heightmap,
PreviewFocus::Bumpmap => &textures.bumpmap,
};
render_clickable_image(ui, main_texture, Vec2::new(available.x, main_height), false);
ui.add_space(8.0);
let thumb_width = (available.x * 0.28).max(120.0).min(240.0);
let panel_width = (thumb_width + 32.0).min(available.x);
let secondary_texture = match self.preview_focus {
PreviewFocus::Heightmap => &textures.bumpmap,
PreviewFocus::Bumpmap => &textures.heightmap,
};
let secondary_focus = match self.preview_focus {
PreviewFocus::Heightmap => PreviewFocus::Bumpmap,
PreviewFocus::Bumpmap => PreviewFocus::Heightmap,
};
let secondary_label = match secondary_focus {
PreviewFocus::Heightmap => "Heightmap",
PreviewFocus::Bumpmap => "Bumpmap",
};
ui.horizontal_centered(|ui| {
let thumb_width = ((available.x - 24.0) * 0.28).max(100.0).min(220.0);
let spacer = (available.x - thumb_width * 2.0).max(0.0);
let main_thumb_clicked = render_clickable_image(
ui,
match self.preview_focus {
PreviewFocus::Heightmap => &textures.heightmap,
PreviewFocus::Bumpmap => &textures.bumpmap,
},
Vec2::new(thumb_width, bottom_strip_height),
true,
);
ui.add_space(spacer);
let secondary_clicked =
render_clickable_image(ui, bottom_texture, Vec2::new(thumb_width, bottom_strip_height), true);
if main_thumb_clicked {
self.preview_focus = match self.preview_focus {
PreviewFocus::Heightmap => PreviewFocus::Heightmap,
PreviewFocus::Bumpmap => PreviewFocus::Bumpmap,
};
}
if secondary_clicked {
self.preview_focus = match self.preview_focus {
PreviewFocus::Heightmap => PreviewFocus::Bumpmap,
PreviewFocus::Bumpmap => PreviewFocus::Heightmap,
};
}
Frame::group(ui.style()).show(ui, |ui| {
ui.set_min_width(panel_width);
ui.set_max_width(panel_width);
ui.vertical_centered(|ui| {
ui.label(RichText::new(secondary_label).strong());
ui.add_space(6.0);
if render_clickable_image(
ui,
secondary_texture,
Vec2::new(thumb_width, bottom_strip_height - 32.0),
true,
) {
self.preview_focus = secondary_focus;
}
});
});
});
});
}
@@ -294,7 +299,12 @@ fn gray_to_color_image(image: &image::GrayImage) -> ColorImage {
ColorImage::new(size, pixels)
}
fn labeled_int_slider(ui: &mut Ui, label: &str, value: &mut usize, range: std::ops::RangeInclusive<usize>) {
fn labeled_int_slider(
ui: &mut Ui,
label: &str,
value: &mut usize,
range: std::ops::RangeInclusive<usize>,
) {
ui.label(label);
let mut slider_value = *value as u32;
if ui
@@ -320,12 +330,21 @@ fn labeled_float_slider(
ui.add(slider);
}
fn render_clickable_image(ui: &mut Ui, texture: &TextureHandle, max_size: Vec2, clickable: bool) -> bool {
fn render_clickable_image(
ui: &mut Ui,
texture: &TextureHandle,
max_size: Vec2,
clickable: bool,
) -> bool {
let image_size = texture.size_vec2();
let scale = (max_size.x / image_size.x).min(max_size.y / image_size.y);
let desired_size = image_size * scale.max(0.01);
let image = egui::Image::new(texture)
.fit_to_exact_size(desired_size)
.sense(if clickable { Sense::click() } else { Sense::hover() });
.sense(if clickable {
Sense::click()
} else {
Sense::hover()
});
ui.add(image).clicked()
}