use egui::{Response, Stroke};
use super::super::{BRAND, RADIUS, RAISED, space};
pub fn slider(
ui: &mut egui::Ui,
value: &mut f32,
(floor, ceiling, step): (f32, f32, f32),
unit: &str,
help: &str,
) -> Response {
let before = *value;
let under = ui.painter().add(egui::Shape::Noop);
let mut seat = ui
.scope(|ui| {
let widgets = &mut ui.visuals_mut().widgets;
widgets.inactive.bg_fill = RAISED;
for rung in [
&mut widgets.inactive,
&mut widgets.hovered,
&mut widgets.active,
] {
rung.fg_stroke = Stroke::new(1.0, BRAND);
}
ui.add(
egui::Slider::new(value, floor..=ceiling)
.step_by(f64::from(step))
.suffix(unit)
.trailing_fill(true),
)
})
.inner;
if seat.hovered() {
let wash =
egui::Shape::rect_filled(seat.rect.expand(space::XS), RADIUS, super::super::hover());
ui.painter().set(under, wash);
}
if seat.has_focus() {
ui.painter()
.rect_stroke(seat.rect.expand(space::XS), RADIUS, Stroke::new(1.0, BRAND));
}
if seat.drag_started() {
seat.request_focus();
}
if seat.has_focus() {
let presses = |key| {
let n = ui.input(|i| i.num_presses(key));
f32::from(u8::try_from(n).unwrap_or(u8::MAX))
};
let steps = presses(egui::Key::ArrowRight) - presses(egui::Key::ArrowLeft);
if steps != 0.0 {
*value = step.mul_add(steps, before).clamp(floor, ceiling);
seat.mark_changed();
}
}
super::told(seat, help)
}