fltk_extras/
slider.rs

1use crate::styles::colors::*;
2use fltk::{enums::*, prelude::*, *};
3
4#[derive(Debug, Clone)]
5pub struct FancyHorSlider {
6    p: group::Pack,
7    s: valuator::Slider,
8}
9
10impl Default for FancyHorSlider {
11    fn default() -> Self {
12        Self::new(0, 0, 0, 0, "")
13    }
14}
15
16impl FancyHorSlider {
17    pub fn new(x: i32, y: i32, width: i32, height: i32, label: &str) -> Self {
18        let p = group::Pack::new(x, y, width, height, None).with_label(label);
19        frame::Frame::default().with_size(width, 5);
20        let mut s = valuator::Slider::new(x, y, width, 10, None);
21        s.set_type(valuator::SliderType::Horizontal);
22        s.set_frame(FrameType::RFlatBox);
23        s.set_color(SLIDER_PURPLE);
24        s.draw(|s| {
25            draw::set_draw_color(SEL_BLUE);
26            draw::draw_pie(
27                s.x() - 10 + (s.w() as f64 * s.value()) as i32,
28                s.y() - 10,
29                30,
30                30,
31                0.,
32                360.,
33            );
34        });
35        s.set_callback(|_| app::redraw());
36        p.end();
37        Self { p, s }
38    }
39
40    pub fn set_callback<F: 'static + FnMut(&mut Self)>(&mut self, mut cb: F) {
41        let mut s = self.clone();
42        self.s.set_callback(move |_| {
43            cb(&mut s);
44            app::redraw();
45        });
46    }
47    pub fn value(&self) -> f64 {
48        self.s.value()
49    }
50    pub fn set_value(&mut self, val: f64) {
51        self.s.set_value(val)
52    }
53}
54
55fltk::widget_extends!(FancyHorSlider, group::Pack, p);
56
57#[derive(Debug, Clone)]
58pub struct FancyVertSlider {
59    p: group::Pack,
60    s: valuator::Slider,
61}
62
63impl Default for FancyVertSlider {
64    fn default() -> Self {
65        Self::new(0, 0, 0, 0, "")
66    }
67}
68
69impl FancyVertSlider {
70    pub fn new(x: i32, y: i32, width: i32, height: i32, label: &str) -> Self {
71        let p = group::Pack::new(x, y, width, height, None)
72            .with_label(label)
73            .with_type(group::PackType::Horizontal)
74            .with_align(Align::Right);
75        frame::Frame::default().with_size(5, height);
76        let mut s = valuator::Slider::new(x, y, 10, height, None);
77        s.set_type(valuator::SliderType::Vertical);
78        s.set_frame(FrameType::RFlatBox);
79        s.set_color(SLIDER_PURPLE);
80        s.draw(|s| {
81            draw::set_draw_color(SEL_BLUE);
82            draw::draw_pie(
83                s.x() - 10,
84                s.y() - 10 + (s.h() as f64 * s.value()) as i32,
85                30,
86                30,
87                0.,
88                360.,
89            );
90        });
91        s.set_callback(|_| app::redraw());
92        p.end();
93        Self { p, s }
94    }
95
96    pub fn set_callback<F: 'static + FnMut(&mut Self)>(&mut self, mut cb: F) {
97        let mut s = self.clone();
98        self.s.set_callback(move |_| {
99            cb(&mut s);
100            app::redraw();
101        });
102    }
103    pub fn value(&self) -> f64 {
104        self.s.value()
105    }
106    pub fn set_value(&mut self, val: f64) {
107        self.s.set_value(val)
108    }
109}
110
111fltk::widget_extends!(FancyVertSlider, group::Pack, p);