use crate::Ui;
use crate::sys;
use super::SliderFlags;
use super::validation::{validate_slider_flags, validate_slider_range};
#[derive(Copy, Clone, Debug)]
#[must_use]
pub struct AngleSlider<Label, Format = &'static str> {
label: Label,
min_degrees: f32,
max_degrees: f32,
display_format: Format,
flags: SliderFlags,
}
impl<Label> AngleSlider<Label>
where
Label: AsRef<str>,
{
#[doc(alias = "SliderAngle")]
pub fn new(label: Label) -> Self {
AngleSlider {
label,
min_degrees: -360.0,
max_degrees: 360.0,
display_format: "%.0f deg",
flags: SliderFlags::NONE,
}
}
}
impl<Label, Format> AngleSlider<Label, Format>
where
Label: AsRef<str>,
Format: AsRef<str>,
{
#[inline]
pub fn range_degrees(mut self, min_degrees: f32, max_degrees: f32) -> Self {
self.min_degrees = min_degrees;
self.max_degrees = max_degrees;
self
}
#[inline]
pub fn min_degrees(mut self, min_degrees: f32) -> Self {
self.min_degrees = min_degrees;
self
}
#[inline]
pub fn max_degrees(mut self, max_degrees: f32) -> Self {
self.max_degrees = max_degrees;
self
}
#[inline]
pub fn display_format<Format2: AsRef<str>>(
self,
display_format: Format2,
) -> AngleSlider<Label, Format2> {
AngleSlider {
label: self.label,
min_degrees: self.min_degrees,
max_degrees: self.max_degrees,
display_format,
flags: self.flags,
}
}
#[inline]
pub fn flags(mut self, flags: SliderFlags) -> Self {
self.flags = flags;
self
}
pub fn build(self, ui: &Ui, value_rad: &mut f32) -> bool {
validate_slider_flags("AngleSlider::build()", self.flags);
validate_slider_range("AngleSlider::build()", &self.min_degrees, &self.max_degrees);
unsafe {
let (label, display_format) = ui.scratch_txt_two(self.label, self.display_format);
sys::igSliderAngle(
label,
value_rad as *mut _,
self.min_degrees,
self.max_degrees,
display_format,
self.flags.bits(),
)
}
}
}