Common slider functions

This commit is contained in:
Andrew Golovashevich 2026-02-14 22:46:41 +03:00
parent ed1883773c
commit 467f3193b2
9 changed files with 68 additions and 108 deletions

View File

@ -2,12 +2,11 @@
mod algo; mod algo;
use bgtu_ai_utility::labeled_slider;
use eframe::egui; use eframe::egui;
use eframe::egui::{CornerRadius, Frame, Ui}; use eframe::egui::{CornerRadius, Frame};
use eframe::emath::Numeric;
use eframe::epaint::{Color32, Pos2, Rect}; use eframe::epaint::{Color32, Pos2, Rect};
use rand::SeedableRng; use rand::SeedableRng;
use std::ops::RangeInclusive;
use std::time::{SystemTime, UNIX_EPOCH}; use std::time::{SystemTime, UNIX_EPOCH};
fn main() -> eframe::Result { fn main() -> eframe::Result {
@ -45,32 +44,14 @@ impl Default for MyApp {
} }
} }
fn _slider<T: Numeric>(
ui: &mut Ui,
name: &str,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) {
let label = ui.label(name);
ui.scope(|ui| {
ui.spacing_mut().slider_width = ui.available_width()
- ui.spacing().interact_size.x
- ui.spacing().button_padding.x * 2.0;
ui.add(egui::Slider::new(storage, range).step_by(step))
.labelled_by(label.id);
});
}
impl eframe::App for MyApp { impl eframe::App for MyApp {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ui, |ui| { egui::CentralPanel::default().show(ui, |ui| {
ui.add_enabled_ui(matches!(self.result, None), |ui| { ui.add_enabled_ui(matches!(self.result, None), |ui| {
_slider(ui, "Board size:", &mut self.boardSize, 2..=50, 1.0); labeled_slider(ui, "Board size:", &mut self.boardSize, 2..=50, 1.0);
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Initial temperature:", "Initial temperature:",
&mut self.simulationConfig.initialTemperature, &mut self.simulationConfig.initialTemperature,
@ -78,15 +59,15 @@ impl eframe::App for MyApp {
0.01, 0.01,
); );
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Target Temperature:", "Target Temperature:",
&mut self.simulationConfig.targetTemperature, &mut self.simulationConfig.targetTemperature,
0.0..=99.98, 0.0..=self.simulationConfig.initialTemperature - 0.1,
0.01, 0.01,
); );
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Cooldown coefficient:", "Cooldown coefficient:",
&mut self.simulationConfig.cooldownCoefficient, &mut self.simulationConfig.cooldownCoefficient,
@ -95,7 +76,7 @@ impl eframe::App for MyApp {
); );
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Iterations per age:", "Iterations per age:",
&mut self.simulationConfig.iterationsPerAge, &mut self.simulationConfig.iterationsPerAge,

View File

@ -8,3 +8,4 @@ workspace = true
[dependencies] [dependencies]
eframe = { workspace = true } eframe = { workspace = true }
egui_extras = { workspace = true } egui_extras = { workspace = true }
bgtu-ai-utility = {workspace = true}

View File

@ -3,11 +3,9 @@
mod algo; mod algo;
use crate::algo::BitVector; use crate::algo::BitVector;
use bgtu_ai_utility::labeled_slider;
use eframe::egui; use eframe::egui;
use eframe::egui::Ui;
use eframe::emath::Numeric;
use egui_extras::{Column, TableBuilder}; use egui_extras::{Column, TableBuilder};
use std::ops::RangeInclusive;
fn main() -> eframe::Result { fn main() -> eframe::Result {
let options = eframe::NativeOptions { let options = eframe::NativeOptions {
@ -53,24 +51,6 @@ impl Default for MyApp {
} }
} }
fn _slider<T: Numeric>(
ui: &mut Ui,
name: &str,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) {
let label = ui.label(name);
ui.scope(|ui| {
ui.spacing_mut().slider_width = ui.available_width()
- ui.spacing().interact_size.x
- ui.spacing().button_padding.x * 2.0;
ui.add(egui::Slider::new(storage, range).step_by(step))
.labelled_by(label.id);
});
}
impl eframe::App for MyApp { impl eframe::App for MyApp {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
match self.columnUpdate { match self.columnUpdate {
@ -115,9 +95,9 @@ impl eframe::App for MyApp {
egui::CentralPanel::default().show(ui, |ui| { egui::CentralPanel::default().show(ui, |ui| {
ui.add_enabled_ui(matches!(self.result, None), |ui| { ui.add_enabled_ui(matches!(self.result, None), |ui| {
_slider(ui, "beta", &mut self.beta, 1..=10, 1f64); labeled_slider(ui, "beta", &mut self.beta, 1..=10, 1f64);
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"attentiveness", "attentiveness",
&mut self.attentiveness, &mut self.attentiveness,

View File

@ -6,13 +6,12 @@ use crate::algo::{
updateState, Ant, AntsSimulationConfig, AntsSimulationState, EdgeExtraData, EdgesVec, updateState, Ant, AntsSimulationConfig, AntsSimulationState, EdgeExtraData, EdgesVec,
VerticesVec, VerticesVec,
}; };
use eframe::egui;
use eframe::egui::{Frame, Ui};
use eframe::emath::Numeric;
use std::collections::HashSet;
use std::ops::RangeInclusive;
use bgtu_ai_utility::gui::lengths_table::{draw_lengths_table, UpdatePending}; use bgtu_ai_utility::gui::lengths_table::{draw_lengths_table, UpdatePending};
use bgtu_ai_utility::gui::render::render_graph; use bgtu_ai_utility::gui::render::render_graph;
use bgtu_ai_utility::labeled_slider;
use eframe::egui;
use eframe::egui::{Frame, Ui};
use std::collections::HashSet;
fn main() -> eframe::Result { fn main() -> eframe::Result {
let options = eframe::NativeOptions { let options = eframe::NativeOptions {
@ -62,23 +61,6 @@ impl Default for MyApp {
} }
} }
fn _slider<T: Numeric>(
ui: &mut Ui,
name: &str,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) {
let label = ui.label(name);
ui.scope(|ui| {
ui.spacing_mut().slider_width = ui.available_width()
- ui.spacing().interact_size.x
- ui.spacing().button_padding.x * 2.0;
ui.add(egui::Slider::new(storage, range).step_by(step))
.labelled_by(label.id);
});
}
impl eframe::App for MyApp { impl eframe::App for MyApp {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
@ -145,7 +127,7 @@ impl eframe::App for MyApp {
fn edit_panel(data: &mut MyApp, ui: &mut Ui) { fn edit_panel(data: &mut MyApp, ui: &mut Ui) {
let mut run: bool = false; let mut run: bool = false;
_slider( labeled_slider(
ui, ui,
"Ferment weight", "Ferment weight",
&mut data.config.ferment_weight, &mut data.config.ferment_weight,
@ -153,7 +135,7 @@ fn edit_panel(data: &mut MyApp, ui: &mut Ui) {
0.001, 0.001,
); );
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Heuristic coefficient", "Heuristic coefficient",
&mut data.config.heuristic_coefficient, &mut data.config.heuristic_coefficient,
@ -161,11 +143,11 @@ fn edit_panel(data: &mut MyApp, ui: &mut Ui) {
0.001, 0.001,
); );
ui.label(""); ui.label("");
_slider(ui, "Q", &mut data.config.q, 0.0..=1.0, 0.001); labeled_slider(ui, "Q", &mut data.config.q, 0.0..=1.0, 0.001);
ui.label(""); ui.label("");
_slider(ui, "r", &mut data.config.r, 0.0..=1.0, 0.001); labeled_slider(ui, "r", &mut data.config.r, 0.0..=1.0, 0.001);
ui.label(""); ui.label("");
_slider( labeled_slider(
ui, ui,
"Ants per vertex", "Ants per vertex",
&mut data.ants_per_vertex, &mut data.ants_per_vertex,

View File

@ -9,3 +9,4 @@ workspace = true
rand = { workspace = true } rand = { workspace = true }
eframe = { workspace = true } eframe = { workspace = true }
egui_extras = { workspace = true } egui_extras = { workspace = true }
bgtu-ai-utility = {workspace = true}

View File

@ -4,13 +4,12 @@
mod algo; mod algo;
use crate::algo::{ComparationOperatorsModel, gen_images}; use crate::algo::{gen_images, ComparationOperatorsModel};
use bgtu_ai_utility::labeled_slider;
use eframe::egui; use eframe::egui;
use eframe::egui::{Ui, Widget}; use eframe::egui::Widget;
use eframe::emath::Numeric;
use egui_extras::{Column, TableBuilder}; use egui_extras::{Column, TableBuilder};
use std::cmp::min; use std::cmp::min;
use std::ops::RangeInclusive;
fn main() -> eframe::Result { fn main() -> eframe::Result {
let options = eframe::NativeOptions { let options = eframe::NativeOptions {
@ -58,36 +57,19 @@ impl Default for MyApp {
} }
} }
fn _slider<T: Numeric>(
ui: &mut Ui,
name: &str,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) {
let label = ui.label(name);
ui.scope(|ui| {
ui.spacing_mut().slider_width = ui.available_width()
- ui.spacing().interact_size.x
- ui.spacing().button_padding.x * 2.0;
ui.add(egui::Slider::new(storage, range).step_by(step))
.labelled_by(label.id);
});
}
impl eframe::App for MyApp { impl eframe::App for MyApp {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) { fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ui, |ui| { egui::CentralPanel::default().show(ui, |ui| {
ui.add_enabled_ui(matches!(self.training, TrainingState::NoTrain), |ui| { ui.add_enabled_ui(matches!(self.training, TrainingState::NoTrain), |ui| {
_slider(ui, "Hidden layer size", &mut self.hidden_layer_size, 1..=49, 1f64); labeled_slider(ui, "Hidden layer size", &mut self.hidden_layer_size, 1..=49, 1f64);
if (self.hidden_layer_size != self.model.hidden_layer_size()) { if (self.hidden_layer_size != self.model.hidden_layer_size()) {
self.model.resize_hidden_layer(self.hidden_layer_size); self.model.resize_hidden_layer(self.hidden_layer_size);
} }
ui.label(""); ui.label("");
_slider(ui, "η", &mut self.n, 0.0..=1.0, 0.001); labeled_slider(ui, "η", &mut self.n, 0.0..=1.0, 0.001);
ui.label(""); ui.label("");
_slider(ui, "Epochs count", &mut self.epochs_count, 1..=500, 1f64); labeled_slider(ui, "Epochs count", &mut self.epochs_count, 1..=500, 1f64);
ui.label(""); ui.label("");
ui.horizontal(|ui| { ui.horizontal(|ui| {

View File

@ -1,5 +1,5 @@
use crate::graph::{EdgesVec, VerticesVec}; use crate::graph::{EdgesVec, VerticesVec};
use eframe::egui; use crate::slider;
use eframe::egui::{ScrollArea, Ui}; use eframe::egui::{ScrollArea, Ui};
use egui_extras::{Column, TableBuilder}; use egui_extras::{Column, TableBuilder};
use std::ptr::NonNull; use std::ptr::NonNull;
@ -52,7 +52,8 @@ pub fn draw_lengths_table<D>(
}); });
}); });
let mut local_edges = Vec::<(usize, NonNull<f64>)>::with_capacity(v.len()); let mut local_edges =
Vec::<(usize, NonNull<f64>)>::with_capacity(v.len());
for ei in v.iter() { for ei in v.iter() {
let e = &mut edges[*ei]; let e = &mut edges[*ei];
let p = (e.another(vi), &mut e.length); let p = (e.another(vi), &mut e.length);
@ -67,10 +68,7 @@ pub fn draw_lengths_table<D>(
ci += 1 ci += 1
} }
row.col(|ui| { row.col(|ui| {
ui.add( slider(ui, unsafe { l.as_mut() }, 0.0..=10.0, 0.1);
egui::Slider::new(unsafe { l.as_mut() }, 0.0..=10.0)
.step_by(0.1),
);
}); });
ci += 1; ci += 1;
} }

View File

@ -1,2 +1,5 @@
pub mod graph; pub mod graph;
pub mod gui; pub mod gui;
mod slider;
pub use slider::{slider, labeled_slider};

32
utility/src/slider.rs Normal file
View File

@ -0,0 +1,32 @@
use eframe::egui;
use eframe::egui::{Response, Ui};
use eframe::emath::Numeric;
use std::ops::RangeInclusive;
pub fn slider<T: Numeric>(
ui: &mut Ui,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) -> Response {
let scope = |ui: &mut Ui| {
let spacing = ui.spacing();
ui.spacing_mut().slider_width =
ui.available_width() - spacing.interact_size.x - spacing.button_padding.x * 2.0;
return ui.add(egui::Slider::new(storage, range).step_by(step));
};
return ui.scope(scope).inner;
}
pub fn labeled_slider<T: Numeric>(
ui: &mut Ui,
name: &str,
storage: &mut T,
range: RangeInclusive<T>,
step: f64,
) -> Response {
let label = ui.label(name);
return slider(ui, storage, range, step).labelled_by(label.id);
}