diff --git a/core/src/angle.rs b/core/src/angle.rs index 0882ae8007..98e3ac3e1b 100644 --- a/core/src/angle.rs +++ b/core/src/angle.rs @@ -71,6 +71,18 @@ impl num_traits::FromPrimitive for Degrees { } } +impl num_traits::AsPrimitive for Degrees { + fn as_(self) -> f32 { + self.0 + } +} + +impl num_traits::AsPrimitive for Degrees { + fn as_(self) -> f64 { + f64::from(self.0) + } +} + /// Radians #[derive(Debug, Copy, Clone, PartialEq, PartialOrd)] pub struct Radians(pub f32); @@ -143,6 +155,18 @@ impl num_traits::FromPrimitive for Radians { } } +impl num_traits::AsPrimitive for Radians { + fn as_(self) -> f32 { + self.0 + } +} + +impl num_traits::AsPrimitive for Radians { + fn as_(self) -> f64 { + f64::from(self.0) + } +} + impl Sub for Radians { type Output = Self; diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 2e7b0ec335..6296eac879 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -211,7 +211,7 @@ where impl Widget for Slider<'_, T, Message, Theme> where - T: Copy + Into + num_traits::FromPrimitive, + T: Copy + num_traits::AsPrimitive + num_traits::FromPrimitive, Message: Clone, Theme: Catalog, Renderer: core::Renderer, @@ -268,10 +268,10 @@ where } else { self.step } - .into(); + .as_(); - let start = (*self.range.start()).into(); - let end = (*self.range.end()).into(); + let start = (*self.range.start()).as_(); + let end = (*self.range.end()).as_(); let percent = f64::from(cursor_position.x - bounds.x) / f64::from(bounds.width); @@ -288,12 +288,12 @@ where } else { self.step } - .into(); + .as_(); - let steps = (value.into() / step).round(); + let steps = (value.as_() / step).round(); let new_value = step * (steps + 1.0); - if new_value > (*self.range.end()).into() { + if new_value > (*self.range.end()).as_() { return Some(*self.range.end()); } @@ -306,12 +306,12 @@ where } else { self.step } - .into(); + .as_(); - let steps = (value.into() / step).round(); + let steps = (value.as_() / step).round(); let new_value = step * (steps - 1.0); - if new_value < (*self.range.start()).into() { + if new_value < (*self.range.start()).as_() { return Some(*self.range.start()); } @@ -319,7 +319,7 @@ where }; let change = |new_value: T| { - if (self.value.into() - new_value.into()).abs() > f64::EPSILON { + if (self.value.as_() - new_value.as_()).abs() > f64::EPSILON { shell.publish((self.on_change)(new_value)); self.value = new_value; @@ -438,11 +438,11 @@ where } => (f32::from(width), bounds.height, border_radius), }; - let value = self.value.into() as f32; + let value = self.value.as_() as f32; let (range_start, range_end) = { let (start, end) = self.range.clone().into_inner(); - (start.into() as f32, end.into() as f32) + (start.as_() as f32, end.as_() as f32) }; let offset = if range_start >= range_end { @@ -533,7 +533,7 @@ where impl<'a, T, Message, Theme, Renderer> From> for Element<'a, Message, Theme, Renderer> where - T: Copy + Into + num_traits::FromPrimitive + 'a, + T: Copy + num_traits::AsPrimitive + num_traits::FromPrimitive + 'a, Message: Clone + 'a, Theme: Catalog + 'a, Renderer: core::Renderer + 'a, diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs index e007bb52dc..2ca8b23511 100644 --- a/widget/src/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -211,7 +211,7 @@ where impl Widget for VerticalSlider<'_, T, Message, Theme> where - T: Copy + Into + num_traits::FromPrimitive, + T: Copy + num_traits::AsPrimitive + num_traits::FromPrimitive, Message: Clone, Theme: Catalog, Renderer: core::Renderer, @@ -267,10 +267,10 @@ where } else { self.step } - .into(); + .as_(); - let start = (*self.range.start()).into(); - let end = (*self.range.end()).into(); + let start = (*self.range.start()).as_(); + let end = (*self.range.end()).as_(); let percent = 1.0 - f64::from(cursor_position.y - bounds.y) / f64::from(bounds.height); @@ -288,12 +288,12 @@ where } else { self.step } - .into(); + .as_(); - let steps = (value.into() / step).round(); + let steps = (value.as_() / step).round(); let new_value = step * (steps + 1.0); - if new_value > (*self.range.end()).into() { + if new_value > (*self.range.end()).as_() { return Some(*self.range.end()); } @@ -306,12 +306,12 @@ where } else { self.step } - .into(); + .as_(); - let steps = (value.into() / step).round(); + let steps = (value.as_() / step).round(); let new_value = step * (steps - 1.0); - if new_value < (*self.range.start()).into() { + if new_value < (*self.range.start()).as_() { return Some(*self.range.start()); } @@ -319,7 +319,7 @@ where }; let change = |new_value: T| { - if (self.value.into() - new_value.into()).abs() > f64::EPSILON { + if (self.value.as_() - new_value.as_()).abs() > f64::EPSILON { shell.publish((self.on_change)(new_value)); self.value = new_value; @@ -435,11 +435,11 @@ where } => (f32::from(width), bounds.width, border_radius), }; - let value = self.value.into() as f32; + let value = self.value.as_() as f32; let (range_start, range_end) = { let (start, end) = self.range.clone().into_inner(); - (start.into() as f32, end.into() as f32) + (start.as_() as f32, end.as_() as f32) }; let offset = if range_start >= range_end { @@ -530,7 +530,7 @@ where impl<'a, T, Message, Theme, Renderer> From> for Element<'a, Message, Theme, Renderer> where - T: Copy + Into + num_traits::FromPrimitive + 'a, + T: Copy + num_traits::AsPrimitive + num_traits::FromPrimitive + 'a, Message: Clone + 'a, Theme: Catalog + 'a, Renderer: core::Renderer + 'a,