diff --git a/lab1/src/main.rs b/lab1/src/main.rs index c13e713..09217a7 100644 --- a/lab1/src/main.rs +++ b/lab1/src/main.rs @@ -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( - ui: &mut Ui, - name: &str, - storage: &mut T, - range: RangeInclusive, - 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, diff --git a/lab2/Cargo.toml b/lab2/Cargo.toml index 55a8631..89a0541 100644 --- a/lab2/Cargo.toml +++ b/lab2/Cargo.toml @@ -8,3 +8,4 @@ workspace = true [dependencies] eframe = { workspace = true } egui_extras = { workspace = true } +bgtu-ai-utility = {workspace = true} diff --git a/lab2/src/main.rs b/lab2/src/main.rs index a0e397e..a8be12b 100644 --- a/lab2/src/main.rs +++ b/lab2/src/main.rs @@ -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( - ui: &mut Ui, - name: &str, - storage: &mut T, - range: RangeInclusive, - 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, diff --git a/lab3/src/main.rs b/lab3/src/main.rs index 96b2056..7baef92 100644 --- a/lab3/src/main.rs +++ b/lab3/src/main.rs @@ -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( - ui: &mut Ui, - name: &str, - storage: &mut T, - range: RangeInclusive, - 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, diff --git a/lab4/Cargo.toml b/lab4/Cargo.toml index 05cdf78..19fbf3d 100644 --- a/lab4/Cargo.toml +++ b/lab4/Cargo.toml @@ -9,3 +9,4 @@ workspace = true rand = { workspace = true } eframe = { workspace = true } egui_extras = { workspace = true } +bgtu-ai-utility = {workspace = true} diff --git a/lab4/src/main.rs b/lab4/src/main.rs index 9a095cf..ad9500c 100644 --- a/lab4/src/main.rs +++ b/lab4/src/main.rs @@ -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( - ui: &mut Ui, - name: &str, - storage: &mut T, - range: RangeInclusive, - 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| { diff --git a/utility/src/gui/lengths_table.rs b/utility/src/gui/lengths_table.rs index 5f81c46..30b1503 100644 --- a/utility/src/gui/lengths_table.rs +++ b/utility/src/gui/lengths_table.rs @@ -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( }); }); - let mut local_edges = Vec::<(usize, NonNull)>::with_capacity(v.len()); + let mut local_edges = + Vec::<(usize, NonNull)>::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( 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; } diff --git a/utility/src/lib.rs b/utility/src/lib.rs index 3bf8889..ece6d42 100644 --- a/utility/src/lib.rs +++ b/utility/src/lib.rs @@ -1,2 +1,5 @@ pub mod graph; -pub mod gui; \ No newline at end of file +pub mod gui; +mod slider; + +pub use slider::{slider, labeled_slider}; \ No newline at end of file diff --git a/utility/src/slider.rs b/utility/src/slider.rs new file mode 100644 index 0000000..289dba2 --- /dev/null +++ b/utility/src/slider.rs @@ -0,0 +1,32 @@ +use eframe::egui; +use eframe::egui::{Response, Ui}; +use eframe::emath::Numeric; +use std::ops::RangeInclusive; + +pub fn slider( + ui: &mut Ui, + storage: &mut T, + range: RangeInclusive, + 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( + ui: &mut Ui, + name: &str, + storage: &mut T, + range: RangeInclusive, + step: f64, +) -> Response { + let label = ui.label(name); + + return slider(ui, storage, range, step).labelled_by(label.id); +}