From 2922dabc8fe184d805a725ed94722af3b7c6837e Mon Sep 17 00:00:00 2001 From: Joonas Javanainen Date: Sat, 19 Sep 2020 19:38:40 +0300 Subject: [PATCH] Looks like sliders *do* need a default range --- src/internal.rs | 11 +++++++++ src/widget/slider.rs | 54 +++++++++++++++----------------------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/src/internal.rs b/src/internal.rs index 41c66b4..358fd50 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -119,36 +119,47 @@ pub enum DataType { /// representation in memory as the primitive value described by the associated `KIND` constant. pub unsafe trait DataTypeKind: Copy { const KIND: DataType; + const SLIDER_RANGE: RangeInclusive; } unsafe impl DataTypeKind for i8 { const KIND: DataType = DataType::I8; + const SLIDER_RANGE: RangeInclusive = i8::MIN..=i8::MAX; } unsafe impl DataTypeKind for u8 { const KIND: DataType = DataType::U8; + const SLIDER_RANGE: RangeInclusive = u8::MIN..=u8::MAX; } unsafe impl DataTypeKind for i16 { const KIND: DataType = DataType::I16; + const SLIDER_RANGE: RangeInclusive = i16::MIN..=i16::MAX; } unsafe impl DataTypeKind for u16 { const KIND: DataType = DataType::U16; + const SLIDER_RANGE: RangeInclusive = u16::MIN..=u16::MAX; } unsafe impl DataTypeKind for i32 { const KIND: DataType = DataType::I32; + const SLIDER_RANGE: RangeInclusive = (i32::MIN / 2)..=(i32::MAX / 2); } unsafe impl DataTypeKind for u32 { const KIND: DataType = DataType::U32; + const SLIDER_RANGE: RangeInclusive = (u32::MIN / 2)..=(u32::MAX / 2); } unsafe impl DataTypeKind for i64 { const KIND: DataType = DataType::I64; + const SLIDER_RANGE: RangeInclusive = (i64::MIN / 2)..=(i64::MAX / 2); } unsafe impl DataTypeKind for u64 { const KIND: DataType = DataType::U64; + const SLIDER_RANGE: RangeInclusive = (u64::MIN / 2)..=(u64::MAX / 2); } unsafe impl DataTypeKind for f32 { const KIND: DataType = DataType::F32; + const SLIDER_RANGE: RangeInclusive = (f32::MIN / 2.0)..=(f32::MAX / 2.0); } unsafe impl DataTypeKind for f64 { const KIND: DataType = DataType::F64; + const SLIDER_RANGE: RangeInclusive = (f64::MIN / 2.0)..=(f64::MAX / 2.0); } pub trait InclusiveRangeBounds { diff --git a/src/widget/slider.rs b/src/widget/slider.rs index 198dcaa..1c01b71 100644 --- a/src/widget/slider.rs +++ b/src/widget/slider.rs @@ -29,8 +29,8 @@ bitflags!( #[must_use] pub struct Slider<'a, T: DataTypeKind> { label: &'a ImStr, - min: Option, - max: Option, + min: T, + max: T, display_format: Option<&'a ImStr>, flags: SliderFlags, } @@ -40,8 +40,8 @@ impl<'a, T: DataTypeKind> Slider<'a, T> { pub fn new(label: &ImStr) -> Slider { Slider { label, - min: None, - max: None, + min: *T::SLIDER_RANGE.start(), + max: *T::SLIDER_RANGE.end(), display_format: None, flags: SliderFlags::empty(), } @@ -49,8 +49,8 @@ impl<'a, T: DataTypeKind> Slider<'a, T> { /// Sets the range (inclusive) #[inline] pub fn range>(mut self, range: R) -> Self { - self.min = range.start_bound().copied(); - self.max = range.end_bound().copied(); + self.min = *range.start_bound().unwrap_or(T::SLIDER_RANGE.start()); + self.max = *range.end_bound().unwrap_or(T::SLIDER_RANGE.end()); self } /// Sets the display format using *a C-style printf string* @@ -74,14 +74,8 @@ impl<'a, T: DataTypeKind> Slider<'a, T> { self.label.as_ptr(), T::KIND as i32, value as *mut T as *mut c_void, - self.min - .as_ref() - .map(|min| min as *const T) - .unwrap_or(ptr::null()) as *const c_void, - self.max - .as_ref() - .map(|max| max as *const T) - .unwrap_or(ptr::null()) as *const c_void, + &self.min as *const T as *const c_void, + &self.max as *const T as *const c_void, self.display_format .map(ImStr::as_ptr) .unwrap_or(ptr::null()), @@ -99,14 +93,8 @@ impl<'a, T: DataTypeKind> Slider<'a, T> { T::KIND as i32, values.as_mut_ptr() as *mut c_void, values.len() as i32, - self.min - .as_ref() - .map(|min| min as *const T) - .unwrap_or(ptr::null()) as *const c_void, - self.max - .as_ref() - .map(|max| max as *const T) - .unwrap_or(ptr::null()) as *const c_void, + &self.min as *const T as *const c_void, + &self.max as *const T as *const c_void, self.display_format .map(ImStr::as_ptr) .unwrap_or(ptr::null()), @@ -122,8 +110,8 @@ impl<'a, T: DataTypeKind> Slider<'a, T> { pub struct VerticalSlider<'a, T: DataTypeKind + Copy> { label: &'a ImStr, size: [f32; 2], - min: Option, - max: Option, + min: T, + max: T, display_format: Option<&'a ImStr>, flags: SliderFlags, } @@ -134,8 +122,8 @@ impl<'a, T: DataTypeKind> VerticalSlider<'a, T> { VerticalSlider { label, size, - min: None, - max: None, + min: *T::SLIDER_RANGE.start(), + max: *T::SLIDER_RANGE.end(), display_format: None, flags: SliderFlags::empty(), } @@ -143,8 +131,8 @@ impl<'a, T: DataTypeKind> VerticalSlider<'a, T> { /// Sets the range (inclusive) #[inline] pub fn range>(mut self, range: R) -> Self { - self.min = range.start_bound().copied(); - self.max = range.end_bound().copied(); + self.min = *range.start_bound().unwrap_or(T::SLIDER_RANGE.start()); + self.max = *range.end_bound().unwrap_or(T::SLIDER_RANGE.end()); self } /// Sets the display format using *a C-style printf string* @@ -169,14 +157,8 @@ impl<'a, T: DataTypeKind> VerticalSlider<'a, T> { self.size.into(), T::KIND as i32, value as *mut T as *mut c_void, - self.min - .as_ref() - .map(|min| min as *const T) - .unwrap_or(ptr::null()) as *const c_void, - self.max - .as_ref() - .map(|max| max as *const T) - .unwrap_or(ptr::null()) as *const c_void, + &self.min as *const T as *const c_void, + &self.max as *const T as *const c_void, self.display_format .map(ImStr::as_ptr) .unwrap_or(ptr::null()),