fltk/
valuator.rs

1use crate::enums::{Color, Font, FrameType};
2use crate::prelude::*;
3use crate::utils::FlString;
4use fltk_sys::valuator::*;
5use std::{
6    ffi::{CStr, CString},
7    os::raw,
8};
9
10/// Creates a slider widget
11#[derive(Debug)]
12pub struct Slider {
13    inner: crate::widget::WidgetTracker,
14    is_derived: bool,
15}
16
17crate::macros::widget::impl_widget_ext!(Slider, Fl_Slider);
18crate::macros::widget::impl_widget_base!(Slider, Fl_Slider);
19crate::macros::widget::impl_widget_default!(Slider, Fl_Slider);
20crate::macros::valuator::impl_valuator_ext!(Slider, Fl_Slider);
21
22/// Slider implementation
23impl Slider {
24    /// Get the slider size as a fraction of the long axis
25    pub fn slider_size(&self) -> f32 {
26        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
27    }
28
29    /// Set the slider size as a fraction of the long axis
30    pub fn set_slider_size(&mut self, v: f32) {
31        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
32    }
33
34    /// Get the frame type of the slider box
35    pub fn slider_frame(&self) -> FrameType {
36        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
37    }
38
39    /// Set the frame type of the slider box
40    pub fn set_slider_frame(&mut self, c: FrameType) {
41        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
42    }
43}
44
45/// Creates a nice slider widget
46#[derive(Debug)]
47pub struct NiceSlider {
48    inner: crate::widget::WidgetTracker,
49    is_derived: bool,
50}
51
52crate::macros::widget::impl_widget_ext!(NiceSlider, Fl_Nice_Slider);
53crate::macros::widget::impl_widget_base!(NiceSlider, Fl_Nice_Slider);
54crate::macros::widget::impl_widget_default!(NiceSlider, Fl_Nice_Slider);
55crate::macros::valuator::impl_valuator_ext!(NiceSlider, Fl_Nice_Slider);
56
57/// Slider implementation
58impl NiceSlider {
59    /// Get the slider size as a fraction of the long axis
60    pub fn slider_size(&self) -> f32 {
61        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
62    }
63
64    /// Set the slider size as a fraction of the long axis
65    pub fn set_slider_size(&mut self, v: f32) {
66        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
67    }
68
69    /// Get the frame type of the slider box
70    pub fn slider_frame(&self) -> FrameType {
71        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
72    }
73
74    /// Set the frame type of the slider box
75    pub fn set_slider_frame(&mut self, c: FrameType) {
76        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
77    }
78}
79
80/// Defines slider types
81#[repr(i32)]
82#[derive(Debug, Copy, Clone, PartialEq, Eq)]
83pub enum SliderType {
84    /// Vertical slider
85    Vertical = 0,
86    /// Horizontal slider
87    Horizontal = 1,
88    /// Vertical fill slider
89    VerticalFill = 2,
90    /// Horizontal fill slider
91    HorizontalFill = 3,
92    /// Vertical nice slider
93    VerticalNice = 4,
94    /// Horizontal nice slider
95    HorizontalNice = 5,
96}
97
98crate::macros::widget::impl_widget_type!(SliderType);
99
100/// Creates a dial widget
101#[derive(Debug)]
102pub struct Dial {
103    inner: crate::widget::WidgetTracker,
104    is_derived: bool,
105}
106
107crate::macros::widget::impl_widget_ext!(Dial, Fl_Dial);
108crate::macros::widget::impl_widget_base!(Dial, Fl_Dial);
109crate::macros::widget::impl_widget_default!(Dial, Fl_Dial);
110crate::macros::valuator::impl_valuator_ext!(Dial, Fl_Dial);
111
112impl Dial {
113    /// Get the angles of the dial
114    pub fn angles(&self) -> (i32, i32) {
115        let angle1 = unsafe { Fl_Dial_angle1(self.inner.widget() as _) };
116        let angle2 = unsafe { Fl_Dial_angle2(self.inner.widget() as _) };
117        (i32::from(angle1), i32::from(angle2))
118    }
119
120    /// Set the angles of the dial
121    pub fn set_angles(&mut self, angle1: i32, angle2: i32) {
122        if angle1 <= 360 {
123            unsafe {
124                Fl_Dial_set_angle1(self.inner.widget() as _, angle1 as _);
125            }
126        }
127        if angle2 <= 360 {
128            unsafe {
129                Fl_Dial_set_angle2(self.inner.widget() as _, angle2 as _);
130            }
131        }
132    }
133}
134
135/// Creates a line dial widget
136#[derive(Debug)]
137pub struct LineDial {
138    inner: crate::widget::WidgetTracker,
139    is_derived: bool,
140}
141
142crate::macros::widget::impl_widget_ext!(LineDial, Fl_Line_Dial);
143crate::macros::widget::impl_widget_base!(LineDial, Fl_Line_Dial);
144crate::macros::widget::impl_widget_default!(LineDial, Fl_Line_Dial);
145crate::macros::valuator::impl_valuator_ext!(LineDial, Fl_Line_Dial);
146
147impl LineDial {
148    /// Get the angles of the dial
149    pub fn angles(&self) -> (i32, i32) {
150        let angle1 = unsafe { Fl_Dial_angle1(self.inner.widget() as _) };
151        let angle2 = unsafe { Fl_Dial_angle2(self.inner.widget() as _) };
152        (i32::from(angle1), i32::from(angle2))
153    }
154
155    /// Set the angles of the dial
156    pub fn set_angles(&mut self, angle1: i32, angle2: i32) {
157        if angle1 <= 360 {
158            unsafe {
159                Fl_Dial_set_angle1(self.inner.widget() as _, angle1 as _);
160            }
161        }
162        if angle2 <= 360 {
163            unsafe {
164                Fl_Dial_set_angle2(self.inner.widget() as _, angle2 as _);
165            }
166        }
167    }
168}
169
170/// Defines dial types
171#[repr(i32)]
172#[derive(Debug, Copy, Clone, PartialEq, Eq)]
173pub enum DialType {
174    /// Normal dial
175    Normal = 0,
176    /// Line dial
177    Line = 1,
178    /// Filled dial
179    Fill = 2,
180}
181
182crate::macros::widget::impl_widget_type!(DialType);
183
184/// Creates a counter widget
185#[derive(Debug)]
186pub struct Counter {
187    inner: crate::widget::WidgetTracker,
188    is_derived: bool,
189}
190
191crate::macros::widget::impl_widget_ext!(Counter, Fl_Counter);
192crate::macros::widget::impl_widget_base!(Counter, Fl_Counter);
193crate::macros::widget::impl_widget_default!(Counter, Fl_Counter);
194crate::macros::valuator::impl_valuator_ext!(Counter, Fl_Counter);
195
196/// Defines counter types
197#[repr(i32)]
198#[derive(Debug, Copy, Clone, PartialEq, Eq)]
199pub enum CounterType {
200    /// Normal counter
201    Normal = 0,
202    /// Simple counter
203    Simple = 1,
204}
205
206crate::macros::widget::impl_widget_type!(CounterType);
207
208/// Creates a scrollbar widget
209#[derive(Debug)]
210pub struct Scrollbar {
211    inner: crate::widget::WidgetTracker,
212    is_derived: bool,
213}
214
215crate::macros::widget::impl_widget_ext!(Scrollbar, Fl_Scrollbar);
216crate::macros::widget::impl_widget_base!(Scrollbar, Fl_Scrollbar);
217crate::macros::widget::impl_widget_default!(Scrollbar, Fl_Scrollbar);
218crate::macros::valuator::impl_valuator_ext!(Scrollbar, Fl_Scrollbar);
219
220impl Scrollbar {
221    /// Get the slider size as a fraction of the long axis
222    pub fn slider_size(&self) -> f32 {
223        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
224    }
225
226    /// Set the slider size as a fraction of the long axis
227    pub fn set_slider_size(&mut self, v: f32) {
228        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
229    }
230
231    /// Get the frame type of the slider box
232    pub fn slider_frame(&self) -> FrameType {
233        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
234    }
235
236    /// Set the frame type of the slider box
237    pub fn set_slider_frame(&mut self, c: FrameType) {
238        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
239    }
240
241    /// Get the scrollbar's linesize
242    pub fn linesize(&self) -> i32 {
243        unsafe { Fl_Scrollbar_linesize(self.inner.widget() as _) }
244    }
245
246    /// Set the scrollbar's linesize
247    pub fn set_linesize(&mut self, sz: i32) {
248        unsafe { Fl_Scrollbar_set_linesize(self.inner.widget() as _, sz) }
249    }
250
251    /// Sets the position, size and range of the slider in the scrollbar.
252    /// `pos`   position, first line displayed.
253    /// `win_size`  number of lines displayed.
254    /// `first_line` number of first line.
255    /// `total_lines` total number of lines.
256    ///
257    /// You should call this every time your window changes size, your data
258    /// changes size, or your scroll position changes (even if in response
259    /// to a callback from this scrollbar).
260    /// All necessary calls to `redraw()` are done
261    pub fn scroll_value(
262        &mut self,
263        pos: i32,
264        win_size: i32,
265        first_line: i32,
266        total_lines: i32,
267    ) -> i32 {
268        unsafe {
269            Fl_Scrollbar_scroll_value(
270                self.inner.widget() as _,
271                pos,
272                win_size,
273                first_line,
274                total_lines,
275            )
276        }
277    }
278}
279
280/// Defines scrollbar types
281#[repr(i32)]
282#[derive(Debug, Copy, Clone, PartialEq, Eq)]
283pub enum ScrollbarType {
284    /// Vertical scrollbar
285    Vertical = 0,
286    /// Horizontal scrollbar
287    Horizontal = 1,
288    /// Vertical fill scrollbar
289    VerticalFill = 2,
290    /// Horizontal fill scrollbar
291    HorizontalFill = 3,
292    /// Vertical nice scrollbar
293    VerticalNice = 4,
294    /// Horizontal nice scrollbar
295    HorizontalNice = 5,
296}
297
298crate::macros::widget::impl_widget_type!(ScrollbarType);
299
300/// Creates a roller widget
301#[derive(Debug)]
302pub struct Roller {
303    inner: crate::widget::WidgetTracker,
304    is_derived: bool,
305}
306
307crate::macros::widget::impl_widget_ext!(Roller, Fl_Roller);
308crate::macros::widget::impl_widget_base!(Roller, Fl_Roller);
309crate::macros::widget::impl_widget_default!(Roller, Fl_Roller);
310crate::macros::valuator::impl_valuator_ext!(Roller, Fl_Roller);
311
312/// Creates a value slider widget
313#[derive(Debug)]
314pub struct ValueSlider {
315    inner: crate::widget::WidgetTracker,
316    is_derived: bool,
317}
318
319crate::macros::widget::impl_widget_ext!(ValueSlider, Fl_Value_Slider);
320crate::macros::widget::impl_widget_base!(ValueSlider, Fl_Value_Slider);
321crate::macros::widget::impl_widget_default!(ValueSlider, Fl_Value_Slider);
322crate::macros::valuator::impl_valuator_ext!(ValueSlider, Fl_Value_Slider);
323
324impl ValueSlider {
325    /// Gets the text font
326    pub fn text_font(&self) -> Font {
327        unsafe { std::mem::transmute(Fl_Value_Slider_text_font(self.inner.widget() as _)) }
328    }
329
330    /// Sets the text font
331    pub fn set_text_font(&mut self, f: Font) {
332        unsafe { Fl_Value_Slider_set_text_font(self.inner.widget() as _, f.bits()) }
333    }
334
335    /// Gets the text size
336    pub fn text_size(&self) -> i32 {
337        unsafe { Fl_Value_Slider_text_size(self.inner.widget() as _) }
338    }
339
340    /// Sets the text size
341    pub fn set_text_size(&mut self, s: i32) {
342        unsafe { Fl_Value_Slider_set_text_size(self.inner.widget() as _, s) }
343    }
344
345    /// Gets the text's color
346    pub fn text_color(&self) -> Color {
347        unsafe { std::mem::transmute(Fl_Value_Slider_text_color(self.inner.widget() as _)) }
348    }
349
350    /// Sets the text's color
351    pub fn set_text_color(&mut self, color: Color) {
352        unsafe { Fl_Value_Slider_set_text_color(self.inner.widget() as _, color.bits()) }
353    }
354
355    /// Get the slider size as a fraction of the long axis
356    pub fn slider_size(&self) -> f32 {
357        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
358    }
359
360    /// Set the slider size as a fraction of the long axis
361    pub fn set_slider_size(&mut self, v: f32) {
362        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
363    }
364
365    /// Get the frame type of the slider box
366    pub fn slider_frame(&self) -> FrameType {
367        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
368    }
369
370    /// Set the frame type of the slider box
371    pub fn set_slider_frame(&mut self, c: FrameType) {
372        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
373    }
374
375    /// Sets the position, size and range of the slider.
376    /// `pos`   position, first line displayed.
377    /// `win_size`  number of lines displayed.
378    /// `first_line` number of first line.
379    /// `total_lines` total number of lines.
380    ///
381    /// You should call this every time your window changes size, your data
382    /// changes size, or your scroll position changes (even if in response
383    /// to a callback from this slider).
384    /// All necessary calls to `redraw()` are done
385    pub fn scroll_value(
386        &mut self,
387        pos: i32,
388        win_size: i32,
389        first_line: i32,
390        total_lines: i32,
391    ) -> i32 {
392        unsafe {
393            Fl_Slider_scroll_value(
394                self.inner.widget() as _,
395                pos,
396                win_size,
397                first_line,
398                total_lines,
399            )
400        }
401    }
402}
403
404/// Creates an adjuster widget
405#[derive(Debug)]
406pub struct Adjuster {
407    inner: crate::widget::WidgetTracker,
408    is_derived: bool,
409}
410
411crate::macros::widget::impl_widget_ext!(Adjuster, Fl_Adjuster);
412crate::macros::widget::impl_widget_base!(Adjuster, Fl_Adjuster);
413crate::macros::widget::impl_widget_default!(Adjuster, Fl_Adjuster);
414crate::macros::valuator::impl_valuator_ext!(Adjuster, Fl_Adjuster);
415
416/// Creates an value input widget, which takes a numeric value.
417/// If a step is set, the value can be also dragged
418#[derive(Debug)]
419pub struct ValueInput {
420    inner: crate::widget::WidgetTracker,
421    is_derived: bool,
422}
423
424crate::macros::widget::impl_widget_ext!(ValueInput, Fl_Value_Input);
425crate::macros::widget::impl_widget_base!(ValueInput, Fl_Value_Input);
426crate::macros::widget::impl_widget_default!(ValueInput, Fl_Value_Input);
427crate::macros::valuator::impl_valuator_ext!(ValueInput, Fl_Value_Input);
428
429impl ValueInput {
430    /// Gets the text font
431    pub fn text_font(&self) -> Font {
432        unsafe { std::mem::transmute(Fl_Value_Input_text_font(self.inner.widget() as _)) }
433    }
434
435    /// Sets the text font
436    pub fn set_text_font(&mut self, f: Font) {
437        unsafe { Fl_Value_Input_set_text_font(self.inner.widget() as _, f.bits()) }
438    }
439
440    /// Gets the text size
441    pub fn text_size(&self) -> i32 {
442        unsafe { Fl_Value_Input_text_size(self.inner.widget() as _) }
443    }
444
445    /// Sets the text size
446    pub fn set_text_size(&mut self, s: i32) {
447        unsafe { Fl_Value_Input_set_text_size(self.inner.widget() as _, s) }
448    }
449
450    /// Gets the text's color
451    pub fn text_color(&self) -> Color {
452        unsafe { std::mem::transmute(Fl_Value_Input_text_color(self.inner.widget() as _)) }
453    }
454
455    /// Sets the text's color
456    pub fn set_text_color(&mut self, color: Color) {
457        unsafe { Fl_Value_Input_set_text_color(self.inner.widget() as _, color.bits()) }
458    }
459
460    /// Returns whether the user is allowed to drag the value outside the range.
461    /// Default is true
462    pub fn soft(&self) -> bool {
463        unsafe { Fl_Value_Input_soft(self.inner.widget() as _) != 0 }
464    }
465
466    /// Set whether the user is allowed to drag the value outside the range
467    pub fn set_soft(&mut self, val: bool) {
468        unsafe { Fl_Value_Input_set_soft(self.inner.widget() as _, raw::c_char::from(val)) }
469    }
470}
471
472/// Creates an value output widget
473#[derive(Debug)]
474pub struct ValueOutput {
475    inner: crate::widget::WidgetTracker,
476    is_derived: bool,
477}
478
479crate::macros::widget::impl_widget_ext!(ValueOutput, Fl_Value_Output);
480crate::macros::widget::impl_widget_base!(ValueOutput, Fl_Value_Output);
481crate::macros::widget::impl_widget_default!(ValueOutput, Fl_Value_Output);
482crate::macros::valuator::impl_valuator_ext!(ValueOutput, Fl_Value_Output);
483
484impl ValueOutput {
485    /// Gets the text font
486    pub fn text_font(&self) -> Font {
487        unsafe { std::mem::transmute(Fl_Value_Output_text_font(self.inner.widget() as _)) }
488    }
489
490    /// Sets the text font
491    pub fn set_text_font(&mut self, f: Font) {
492        unsafe { Fl_Value_Output_set_text_font(self.inner.widget() as _, f.bits()) }
493    }
494
495    /// Gets the text size
496    pub fn text_size(&self) -> i32 {
497        unsafe { Fl_Value_Output_text_size(self.inner.widget() as _) }
498    }
499
500    /// Sets the text size
501    pub fn set_text_size(&mut self, s: i32) {
502        unsafe { Fl_Value_Output_set_text_size(self.inner.widget() as _, s) }
503    }
504
505    /// Gets the text's color
506    pub fn text_color(&self) -> Color {
507        unsafe { std::mem::transmute(Fl_Value_Output_text_color(self.inner.widget() as _)) }
508    }
509
510    /// Sets the text's color
511    pub fn set_text_color(&mut self, color: Color) {
512        unsafe { Fl_Value_Output_set_text_color(self.inner.widget() as _, color.bits()) }
513    }
514}
515
516/// Creates a fill slider
517#[derive(Debug)]
518pub struct FillSlider {
519    inner: crate::widget::WidgetTracker,
520    is_derived: bool,
521}
522
523crate::macros::widget::impl_widget_ext!(FillSlider, Fl_Fill_Slider);
524crate::macros::widget::impl_widget_base!(FillSlider, Fl_Fill_Slider);
525crate::macros::widget::impl_widget_default!(FillSlider, Fl_Fill_Slider);
526crate::macros::valuator::impl_valuator_ext!(FillSlider, Fl_Fill_Slider);
527
528/// Creates a fill dial
529#[derive(Debug)]
530pub struct FillDial {
531    inner: crate::widget::WidgetTracker,
532    is_derived: bool,
533}
534
535crate::macros::widget::impl_widget_ext!(FillDial, Fl_Fill_Dial);
536crate::macros::widget::impl_widget_base!(FillDial, Fl_Fill_Dial);
537crate::macros::widget::impl_widget_default!(FillDial, Fl_Fill_Dial);
538crate::macros::valuator::impl_valuator_ext!(FillDial, Fl_Fill_Dial);
539
540impl FillDial {
541    /// Get the angles of the dial
542    pub fn angles(&self) -> (i32, i32) {
543        let angle1 = unsafe { Fl_Dial_angle1(self.inner.widget() as _) };
544        let angle2 = unsafe { Fl_Dial_angle2(self.inner.widget() as _) };
545        (i32::from(angle1), i32::from(angle2))
546    }
547
548    /// Set the angles of the dial
549    pub fn set_angles(&mut self, angle1: i32, angle2: i32) {
550        if angle1 <= 360 {
551            unsafe {
552                Fl_Dial_set_angle1(self.inner.widget() as _, angle1 as _);
553            }
554        }
555        if angle2 <= 360 {
556            unsafe {
557                Fl_Dial_set_angle2(self.inner.widget() as _, angle2 as _);
558            }
559        }
560    }
561}
562
563/// Creates a horizontal slider
564#[derive(Debug)]
565pub struct HorSlider {
566    inner: crate::widget::WidgetTracker,
567    is_derived: bool,
568}
569
570crate::macros::widget::impl_widget_ext!(HorSlider, Fl_Hor_Slider);
571crate::macros::widget::impl_widget_base!(HorSlider, Fl_Hor_Slider);
572crate::macros::widget::impl_widget_default!(HorSlider, Fl_Hor_Slider);
573crate::macros::valuator::impl_valuator_ext!(HorSlider, Fl_Hor_Slider);
574
575/// Slider implementation
576impl HorSlider {
577    /// Get the slider size as a fraction of the long axis
578    pub fn slider_size(&self) -> f32 {
579        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
580    }
581
582    /// Set the slider size as a fraction of the long axis
583    pub fn set_slider_size(&mut self, v: f32) {
584        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
585    }
586
587    /// Get the frame type of the slider box
588    pub fn slider_frame(&self) -> FrameType {
589        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
590    }
591
592    /// Set the frame type of the slider box
593    pub fn set_slider_frame(&mut self, c: FrameType) {
594        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
595    }
596}
597
598/// Creates a horizontal fill slider
599#[derive(Debug)]
600pub struct HorFillSlider {
601    inner: crate::widget::WidgetTracker,
602    is_derived: bool,
603}
604
605crate::macros::widget::impl_widget_ext!(HorFillSlider, Fl_Hor_Fill_Slider);
606crate::macros::widget::impl_widget_base!(HorFillSlider, Fl_Hor_Fill_Slider);
607crate::macros::widget::impl_widget_default!(HorFillSlider, Fl_Hor_Fill_Slider);
608crate::macros::valuator::impl_valuator_ext!(HorFillSlider, Fl_Hor_Fill_Slider);
609
610/// Slider implementation
611impl HorFillSlider {
612    /// Get the slider size as a fraction of the long axis
613    pub fn slider_size(&self) -> f32 {
614        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
615    }
616
617    /// Set the slider size as a fraction of the long axis
618    pub fn set_slider_size(&mut self, v: f32) {
619        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
620    }
621
622    /// Get the frame type of the slider box
623    pub fn slider_frame(&self) -> FrameType {
624        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
625    }
626
627    /// Set the frame type of the slider box
628    pub fn set_slider_frame(&mut self, c: FrameType) {
629        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
630    }
631}
632
633/// Creates a horizontal nice slider
634#[derive(Debug)]
635pub struct HorNiceSlider {
636    inner: crate::widget::WidgetTracker,
637    is_derived: bool,
638}
639
640crate::macros::widget::impl_widget_ext!(HorNiceSlider, Fl_Hor_Nice_Slider);
641crate::macros::widget::impl_widget_base!(HorNiceSlider, Fl_Hor_Nice_Slider);
642crate::macros::widget::impl_widget_default!(HorNiceSlider, Fl_Hor_Nice_Slider);
643crate::macros::valuator::impl_valuator_ext!(HorNiceSlider, Fl_Hor_Nice_Slider);
644
645/// Slider implementation
646impl HorNiceSlider {
647    /// Get the slider size as a fraction of the long axis
648    pub fn slider_size(&self) -> f32 {
649        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
650    }
651
652    /// Set the slider size as a fraction of the long axis
653    pub fn set_slider_size(&mut self, v: f32) {
654        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
655    }
656
657    /// Get the frame type of the slider box
658    pub fn slider_frame(&self) -> FrameType {
659        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
660    }
661
662    /// Set the frame type of the slider box
663    pub fn set_slider_frame(&mut self, c: FrameType) {
664        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
665    }
666}
667
668/// Creates a horizontal value slider
669#[derive(Debug)]
670pub struct HorValueSlider {
671    inner: crate::widget::WidgetTracker,
672    is_derived: bool,
673}
674
675crate::macros::widget::impl_widget_ext!(HorValueSlider, Fl_Hor_Value_Slider);
676crate::macros::widget::impl_widget_base!(HorValueSlider, Fl_Hor_Value_Slider);
677crate::macros::widget::impl_widget_default!(HorValueSlider, Fl_Hor_Value_Slider);
678crate::macros::valuator::impl_valuator_ext!(HorValueSlider, Fl_Hor_Value_Slider);
679
680impl HorValueSlider {
681    /// Gets the text font
682    pub fn text_font(&self) -> Font {
683        unsafe { std::mem::transmute(Fl_Hor_Value_Slider_text_font(self.inner.widget() as _)) }
684    }
685
686    /// Sets the text font
687    pub fn set_text_font(&mut self, f: Font) {
688        unsafe { Fl_Hor_Value_Slider_set_text_font(self.inner.widget() as _, f.bits()) }
689    }
690
691    /// Gets the text size
692    pub fn text_size(&self) -> i32 {
693        unsafe { Fl_Hor_Value_Slider_text_size(self.inner.widget() as _) }
694    }
695
696    /// Sets the text size
697    pub fn set_text_size(&mut self, s: i32) {
698        unsafe { Fl_Hor_Value_Slider_set_text_size(self.inner.widget() as _, s) }
699    }
700
701    /// Gets the text's color
702    pub fn text_color(&self) -> Color {
703        unsafe { std::mem::transmute(Fl_Hor_Value_Slider_text_color(self.inner.widget() as _)) }
704    }
705
706    /// Sets the text's color
707    pub fn set_text_color(&mut self, color: Color) {
708        unsafe { Fl_Hor_Value_Slider_set_text_color(self.inner.widget() as _, color.bits()) }
709    }
710
711    /// Get the slider size as a fraction of the long axis
712    pub fn slider_size(&self) -> f32 {
713        unsafe { Fl_Slider_slider_size(self.inner.widget() as _) }
714    }
715
716    /// Set the slider size as a fraction of the long axis
717    pub fn set_slider_size(&mut self, v: f32) {
718        unsafe { Fl_Slider_set_slider_size(self.inner.widget() as _, v) }
719    }
720
721    /// Get the frame type of the slider box
722    pub fn slider_frame(&self) -> FrameType {
723        unsafe { FrameType::from_i32(Fl_Slider_slider_box(self.inner.widget() as _)) }
724    }
725
726    /// Set the frame type of the slider box
727    pub fn set_slider_frame(&mut self, c: FrameType) {
728        unsafe { Fl_Slider_set_slider_box(self.inner.widget() as _, c.as_i32()) }
729    }
730}