use crate::types::WidgetId;
use super::types::DualSliderHandle;
#[derive(Debug, Default, Clone)]
pub struct SliderDragState {
pub field_id: Option<WidgetId>,
pub track_x: f64,
pub track_width: f64,
pub min: f64,
pub max: f64,
pub handle: Option<DualSliderHandle>,
pub floating_value: Option<f64>,
pub floating_value2: Option<f64>,
}
impl SliderDragState {
pub fn start_single(
field_id: impl Into<WidgetId>,
track_x: f64,
track_width: f64,
min: f64,
max: f64,
) -> Self {
Self {
field_id: Some(field_id.into()),
track_x,
track_width,
min,
max,
handle: None,
floating_value: None,
floating_value2: None,
}
}
pub fn start_dual(
field_id: impl Into<WidgetId>,
track_x: f64,
track_width: f64,
min: f64,
max: f64,
handle: DualSliderHandle,
initial_click_x: f64,
) -> Self {
let t = ((initial_click_x - track_x) / track_width).clamp(0.0, 1.0);
let initial_value = min + t * (max - min);
Self {
field_id: Some(field_id.into()),
track_x,
track_width,
min,
max,
handle: Some(handle),
floating_value: Some(initial_value),
floating_value2: None,
}
}
pub fn single(
field_id: impl Into<WidgetId>,
track_x: f64,
track_width: f64,
min: f64,
max: f64,
) -> Self {
Self::start_single(field_id, track_x, track_width, min, max)
}
pub fn dual(
field_id: impl Into<WidgetId>,
track_x: f64,
track_width: f64,
min: f64,
max: f64,
handle: DualSliderHandle,
) -> Self {
Self::start_dual(field_id, track_x, track_width, min, max, handle, track_x)
}
pub fn update_floating(&mut self, value: f64) {
self.floating_value = Some(value);
}
pub fn take_value(&mut self) -> Option<(WidgetId, f64, Option<DualSliderHandle>)> {
if let Some(field_id) = self.field_id.take() {
let fv = self.floating_value.take();
let handle = self.handle;
self.clear();
fv.map(|v| (field_id, v, handle))
} else {
None
}
}
pub fn is_active(&self) -> bool {
self.field_id.is_some()
}
pub fn is_dual(&self) -> bool {
self.handle.is_some()
}
pub fn clear(&mut self) {
*self = Self::default();
}
}