Use min..=max syntax for slider ranges

This commit is contained in:
Emil Ernerfeldt 2020-04-25 11:01:57 +02:00
parent 02f3b6dddf
commit 663fbda90c
4 changed files with 37 additions and 37 deletions

View file

@ -123,7 +123,7 @@ fn font_definitions_ui(font_definitions: &mut FontDefinitions, region: &mut Regi
for (text_style, (_family, size)) in font_definitions.iter_mut() { for (text_style, (_family, size)) in font_definitions.iter_mut() {
// TODO: radiobutton for family // TODO: radiobutton for family
region.add( region.add(
Slider::f32(size, 4.0, 40.0) Slider::f32(size, 4.0..=40.0)
.precision(0) .precision(0)
.text(format!("{:?}", text_style)), .text(format!("{:?}", text_style)),
); );

View file

@ -93,14 +93,14 @@ impl ExampleApp {
)); ));
}); });
region.add(Slider::usize(&mut self.slider_value, 1, 1000).text("value")); region.add(Slider::usize(&mut self.slider_value, 1..=1000).text("value"));
if region.add(Button::new("Double it")).clicked { if region.add(Button::new("Double it")).clicked {
self.slider_value *= 2; self.slider_value *= 2;
} }
}); });
region.collapsing("Layouts", |region| { region.collapsing("Layouts", |region| {
region.add(Slider::usize(&mut self.num_columns, 1, 10).text("Columns")); region.add(Slider::usize(&mut self.num_columns, 1..=10).text("Columns"));
region.columns(self.num_columns, |cols| { region.columns(self.num_columns, |cols| {
for (i, col) in cols.iter_mut().enumerate() { for (i, col) in cols.iter_mut().enumerate() {
col.add(label!("Column {} out of {}", i + 1, self.num_columns)); col.add(label!("Column {} out of {}", i + 1, self.num_columns));
@ -112,11 +112,11 @@ impl ExampleApp {
}); });
region.collapsing("Test box rendering", |region| { region.collapsing("Test box rendering", |region| {
region.add(Slider::f32(&mut self.size.x, 0.0, 500.0).text("width")); region.add(Slider::f32(&mut self.size.x, 0.0..=500.0).text("width"));
region.add(Slider::f32(&mut self.size.y, 0.0, 500.0).text("height")); region.add(Slider::f32(&mut self.size.y, 0.0..=500.0).text("height"));
region.add(Slider::f32(&mut self.corner_radius, 0.0, 50.0).text("corner_radius")); region.add(Slider::f32(&mut self.corner_radius, 0.0..=50.0).text("corner_radius"));
region.add(Slider::f32(&mut self.stroke_width, 0.0, 10.0).text("stroke_width")); region.add(Slider::f32(&mut self.stroke_width, 0.0..=10.0).text("stroke_width"));
region.add(Slider::usize(&mut self.num_boxes, 0, 5).text("num_boxes")); region.add(Slider::usize(&mut self.num_boxes, 0..=5).text("num_boxes"));
let pos = region let pos = region
.reserve_space( .reserve_space(

View file

@ -155,15 +155,15 @@ impl Style {
} }
region.add(Slider::f32(&mut self.item_spacing.x, 0.0, 10.0).text("item_spacing.x").precision(0)); region.add(Slider::f32(&mut self.item_spacing.x, 0.0..=10.0).text("item_spacing.x").precision(0));
region.add(Slider::f32(&mut self.item_spacing.y, 0.0, 10.0).text("item_spacing.y").precision(0)); region.add(Slider::f32(&mut self.item_spacing.y, 0.0..=10.0).text("item_spacing.y").precision(0));
region.add(Slider::f32(&mut self.window_padding.x, 0.0, 10.0).text("window_padding.x").precision(0)); region.add(Slider::f32(&mut self.window_padding.x, 0.0..=10.0).text("window_padding.x").precision(0));
region.add(Slider::f32(&mut self.window_padding.y, 0.0, 10.0).text("window_padding.y").precision(0)); region.add(Slider::f32(&mut self.window_padding.y, 0.0..=10.0).text("window_padding.y").precision(0));
region.add(Slider::f32(&mut self.indent, 0.0, 100.0).text("indent").precision(0)); region.add(Slider::f32(&mut self.indent, 0.0..=100.0).text("indent").precision(0));
region.add(Slider::f32(&mut self.button_padding.x, 0.0, 20.0).text("button_padding.x").precision(0)); region.add(Slider::f32(&mut self.button_padding.x, 0.0..=20.0).text("button_padding.x").precision(0));
region.add(Slider::f32(&mut self.button_padding.y, 0.0, 20.0).text("button_padding.y").precision(0)); region.add(Slider::f32(&mut self.button_padding.y, 0.0..=20.0).text("button_padding.y").precision(0));
region.add(Slider::f32(&mut self.clickable_diameter, 0.0, 60.0).text("clickable_diameter").precision(0)); region.add(Slider::f32(&mut self.clickable_diameter, 0.0..=60.0).text("clickable_diameter").precision(0));
region.add(Slider::f32(&mut self.start_icon_width, 0.0, 60.0).text("start_icon_width").precision(0)); region.add(Slider::f32(&mut self.start_icon_width, 0.0..=60.0).text("start_icon_width").precision(0));
region.add(Slider::f32(&mut self.line_width, 0.0, 10.0).text("line_width").precision(0)); region.add(Slider::f32(&mut self.line_width, 0.0..=10.0).text("line_width").precision(0));
} }
} }

View file

@ -1,5 +1,7 @@
#![allow(clippy::new_without_default)] #![allow(clippy::new_without_default)]
use std::ops::RangeInclusive;
use crate::{ use crate::{
layout::{Direction, GuiResponse}, layout::{Direction, GuiResponse},
*, *,
@ -310,8 +312,7 @@ type SliderGetSet<'a> = Box<dyn 'a + FnMut(Option<f32>) -> f32>;
pub struct Slider<'a> { pub struct Slider<'a> {
get_set_value: SliderGetSet<'a>, get_set_value: SliderGetSet<'a>,
min: f32, range: RangeInclusive<f32>,
max: f32,
text: Option<String>, text: Option<String>,
precision: usize, precision: usize,
text_color: Option<Color>, text_color: Option<Color>,
@ -320,11 +321,13 @@ pub struct Slider<'a> {
} }
impl<'a> Slider<'a> { impl<'a> Slider<'a> {
fn from_get_set(get_set_value: impl 'a + FnMut(Option<f32>) -> f32) -> Self { fn from_get_set(
range: RangeInclusive<f32>,
get_set_value: impl 'a + FnMut(Option<f32>) -> f32,
) -> Self {
Slider { Slider {
get_set_value: Box::new(get_set_value), get_set_value: Box::new(get_set_value),
min: f32::NAN, range,
max: f32::NAN,
text: None, text: None,
precision: 3, precision: 3,
text_on_top: None, text_on_top: None,
@ -333,12 +336,11 @@ impl<'a> Slider<'a> {
} }
} }
pub fn f32(value: &'a mut f32, min: f32, max: f32) -> Self { // TODO: use range syntax
pub fn f32(value: &'a mut f32, range: RangeInclusive<f32>) -> Self {
Slider { Slider {
min,
max,
precision: 3, precision: 3,
..Self::from_get_set(move |v: Option<f32>| { ..Self::from_get_set(range, move |v: Option<f32>| {
if let Some(v) = v { if let Some(v) = v {
*value = v *value = v
} }
@ -347,12 +349,11 @@ impl<'a> Slider<'a> {
} }
} }
pub fn i32(value: &'a mut i32, min: i32, max: i32) -> Self { pub fn i32(value: &'a mut i32, range: RangeInclusive<i32>) -> Self {
let range = (*range.start() as f32)..=(*range.end() as f32);
Slider { Slider {
min: min as f32,
max: max as f32,
precision: 0, precision: 0,
..Self::from_get_set(move |v: Option<f32>| { ..Self::from_get_set(range, move |v: Option<f32>| {
if let Some(v) = v { if let Some(v) = v {
*value = v.round() as i32 *value = v.round() as i32
} }
@ -361,12 +362,11 @@ impl<'a> Slider<'a> {
} }
} }
pub fn usize(value: &'a mut usize, min: usize, max: usize) -> Self { pub fn usize(value: &'a mut usize, range: RangeInclusive<usize>) -> Self {
let range = (*range.start() as f32)..=(*range.end() as f32);
Slider { Slider {
min: min as f32,
max: max as f32,
precision: 0, precision: 0,
..Self::from_get_set(move |v: Option<f32>| { ..Self::from_get_set(range, move |v: Option<f32>| {
if let Some(v) = v { if let Some(v) = v {
*value = v.round() as usize *value = v.round() as usize
} }
@ -457,8 +457,8 @@ impl<'a> Widget for Slider<'a> {
let left = interact.rect.left() + handle_radius; let left = interact.rect.left() + handle_radius;
let right = interact.rect.right() - handle_radius; let right = interact.rect.right() - handle_radius;
let min = self.min; let min = *self.range.start();
let max = self.max; let max = *self.range.end();
debug_assert!(min <= max); debug_assert!(min <= max);
if let Some(mouse_pos) = region.input().mouse_pos { if let Some(mouse_pos) = region.input().mouse_pos {