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;
use bgtu_ai_utility::labeled_slider;
use eframe::egui;
use eframe::egui::{CornerRadius, Frame, Ui};
use eframe::emath::Numeric;
use eframe::egui::{CornerRadius, Frame};
use eframe::epaint::{Color32, Pos2, Rect};
use rand::SeedableRng;
use std::ops::RangeInclusive;
use std::time::{SystemTime, UNIX_EPOCH};
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 {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ui, |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("");
_slider(
labeled_slider(
ui,
"Initial temperature:",
&mut self.simulationConfig.initialTemperature,
@ -78,15 +59,15 @@ impl eframe::App for MyApp {
0.01,
);
ui.label("");
_slider(
labeled_slider(
ui,
"Target Temperature:",
&mut self.simulationConfig.targetTemperature,
0.0..=99.98,
0.0..=self.simulationConfig.initialTemperature - 0.1,
0.01,
);
ui.label("");
_slider(
labeled_slider(
ui,
"Cooldown coefficient:",
&mut self.simulationConfig.cooldownCoefficient,
@ -95,7 +76,7 @@ impl eframe::App for MyApp {
);
ui.label("");
_slider(
labeled_slider(
ui,
"Iterations per age:",
&mut self.simulationConfig.iterationsPerAge,

View File

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

View File

@ -3,11 +3,9 @@
mod algo;
use crate::algo::BitVector;
use bgtu_ai_utility::labeled_slider;
use eframe::egui;
use eframe::egui::Ui;
use eframe::emath::Numeric;
use egui_extras::{Column, TableBuilder};
use std::ops::RangeInclusive;
fn main() -> eframe::Result {
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 {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
match self.columnUpdate {
@ -115,9 +95,9 @@ impl eframe::App for MyApp {
egui::CentralPanel::default().show(ui, |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("");
_slider(
labeled_slider(
ui,
"attentiveness",
&mut self.attentiveness,

View File

@ -6,13 +6,12 @@ use crate::algo::{
updateState, Ant, AntsSimulationConfig, AntsSimulationState, EdgeExtraData, EdgesVec,
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::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 {
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 {
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) {
let mut run: bool = false;
_slider(
labeled_slider(
ui,
"Ferment weight",
&mut data.config.ferment_weight,
@ -153,7 +135,7 @@ fn edit_panel(data: &mut MyApp, ui: &mut Ui) {
0.001,
);
ui.label("");
_slider(
labeled_slider(
ui,
"Heuristic coefficient",
&mut data.config.heuristic_coefficient,
@ -161,11 +143,11 @@ fn edit_panel(data: &mut MyApp, ui: &mut Ui) {
0.001,
);
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("");
_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("");
_slider(
labeled_slider(
ui,
"Ants per vertex",
&mut data.ants_per_vertex,

View File

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

View File

@ -4,13 +4,12 @@
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::{Ui, Widget};
use eframe::emath::Numeric;
use eframe::egui::Widget;
use egui_extras::{Column, TableBuilder};
use std::cmp::min;
use std::ops::RangeInclusive;
fn main() -> eframe::Result {
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 {
fn update(&mut self, ui: &eframe::egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ui, |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()) {
self.model.resize_hidden_layer(self.hidden_layer_size);
}
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("");
_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.horizontal(|ui| {

View File

@ -1,5 +1,5 @@
use crate::graph::{EdgesVec, VerticesVec};
use eframe::egui;
use crate::slider;
use eframe::egui::{ScrollArea, Ui};
use egui_extras::{Column, TableBuilder};
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() {
let e = &mut edges[*ei];
let p = (e.another(vi), &mut e.length);
@ -67,10 +68,7 @@ pub fn draw_lengths_table<D>(
ci += 1
}
row.col(|ui| {
ui.add(
egui::Slider::new(unsafe { l.as_mut() }, 0.0..=10.0)
.step_by(0.1),
);
slider(ui, unsafe { l.as_mut() }, 0.0..=10.0, 0.1);
});
ci += 1;
}

View File

@ -1,2 +1,5 @@
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);
}