1use crate::enums::{Color, Font, FrameType};
2use crate::prelude::*;
3use crate::utils::FlString;
4use crate::widget::Widget;
5use crate::window::Window;
6use fltk_sys::misc::*;
7use std::{
8 ffi::{CStr, CString},
9 mem,
10 os::raw,
11};
12
13#[repr(i32)]
15#[derive(Debug, Copy, Clone, PartialEq, Eq)]
16pub enum ChartType {
17 Bar = 0,
19 HorizontalBar = 1,
21 Line = 2,
23 Fill = 3,
25 Spike = 4,
27 Pie = 5,
29 SpecialPie = 6,
31}
32
33crate::macros::widget::impl_widget_type!(ChartType);
34
35#[repr(i32)]
37#[derive(Debug, Copy, Clone, PartialEq, Eq)]
38pub enum ClockType {
39 Square = 0,
41 Round = 1,
43}
44
45crate::macros::widget::impl_widget_type!(ClockType);
46
47#[derive(Debug)]
49pub struct Spinner {
50 inner: crate::widget::WidgetTracker,
51 is_derived: bool,
52}
53
54crate::macros::widget::impl_widget_ext!(Spinner, Fl_Spinner);
55crate::macros::widget::impl_widget_base!(Spinner, Fl_Spinner);
56crate::macros::widget::impl_widget_default!(Spinner, Fl_Spinner);
57
58impl Spinner {
59 pub fn minimum(&self) -> f64 {
61 unsafe { Fl_Spinner_minimum(self.inner.widget() as _) }
62 }
63
64 pub fn set_minimum(&mut self, a: f64) {
66 unsafe { Fl_Spinner_set_minimum(self.inner.widget() as _, a) }
67 }
68
69 pub fn maximum(&self) -> f64 {
71 unsafe { Fl_Spinner_maximum(self.inner.widget() as _) }
72 }
73
74 pub fn set_maximum(&mut self, a: f64) {
76 unsafe { Fl_Spinner_set_maximum(self.inner.widget() as _, a) }
77 }
78
79 pub fn set_range(&mut self, a: f64, b: f64) {
81 unsafe { Fl_Spinner_set_range(self.inner.widget() as _, a, b) }
82 }
83
84 pub fn set_step(&mut self, a: f64) {
86 unsafe { Fl_Spinner_set_step(self.inner.widget() as _, a) }
87 }
88
89 pub fn step(&self) -> f64 {
91 unsafe { Fl_Spinner_step(self.inner.widget() as _) }
92 }
93
94 pub fn maximum_size(&self) -> i32 {
96 unsafe { Fl_Spinner_maxsize(self.inner.widget() as _) }
97 }
98
99 pub fn set_maximum_size(&mut self, s: i32) {
101 unsafe { Fl_Spinner_set_maxsize(self.inner.widget() as _, s) }
102 }
103
104 pub fn text_font(&self) -> Font {
106 unsafe { std::mem::transmute(Fl_Spinner_text_font(self.inner.widget() as _)) }
107 }
108
109 pub fn set_text_font(&mut self, f: Font) {
111 unsafe { Fl_Spinner_set_text_font(self.inner.widget() as _, f.bits()) }
112 }
113
114 pub fn text_size(&self) -> i32 {
116 unsafe { Fl_Spinner_text_size(self.inner.widget() as _) }
117 }
118
119 pub fn set_text_size(&mut self, s: i32) {
121 unsafe { Fl_Spinner_set_text_size(self.inner.widget() as _, s) }
122 }
123
124 pub fn text_color(&self) -> Color {
126 unsafe { std::mem::transmute(Fl_Spinner_text_color(self.inner.widget() as _)) }
127 }
128
129 pub fn set_text_color(&mut self, color: Color) {
131 unsafe { Fl_Spinner_set_text_color(self.inner.widget() as _, color.bits()) }
132 }
133
134 pub fn value(&self) -> f64 {
136 unsafe { Fl_Spinner_value(self.inner.widget() as _) }
137 }
138
139 pub fn set_value(&mut self, arg2: f64) {
141 unsafe {
142 Fl_Spinner_set_value(self.inner.widget() as _, arg2);
143 }
144 }
145
146 pub fn wrap(&self) -> bool {
148 unsafe { Fl_Spinner_wrap(self.inner.widget() as _) != 0 }
149 }
150
151 pub fn set_wrap(&mut self, flag: bool) {
153 unsafe {
154 Fl_Spinner_set_wrap(self.inner.widget() as _, flag.into());
155 }
156 }
157}
158
159#[derive(Debug)]
161pub struct Clock {
162 inner: crate::widget::WidgetTracker,
163 is_derived: bool,
164}
165
166crate::macros::widget::impl_widget_ext!(Clock, Fl_Clock);
167crate::macros::widget::impl_widget_base!(Clock, Fl_Clock);
168crate::macros::widget::impl_widget_default!(Clock, Fl_Clock);
169
170#[derive(Debug)]
172pub struct Chart {
173 inner: crate::widget::WidgetTracker,
174 is_derived: bool,
175}
176
177crate::macros::widget::impl_widget_ext!(Chart, Fl_Chart);
178crate::macros::widget::impl_widget_base!(Chart, Fl_Chart);
179crate::macros::widget::impl_widget_default!(Chart, Fl_Chart);
180
181impl Chart {
182 pub fn clear(&mut self) {
184 unsafe { Fl_Chart_clear(self.inner.widget() as _) }
185 }
186
187 pub fn add(&mut self, val: f64, txt: &str, col: Color) {
189 let txt = CString::safe_new(txt);
190 unsafe { Fl_Chart_add(self.inner.widget() as _, val, txt.as_ptr(), col.bits()) }
191 }
192
193 pub fn insert(&mut self, idx: i32, val: f64, txt: &str, col: Color) {
195 let txt = CString::safe_new(txt);
196 unsafe { Fl_Chart_insert(self.inner.widget() as _, idx, val, txt.as_ptr(), col.bits()) }
197 }
198
199 pub fn replace(&mut self, idx: i32, val: f64, txt: &str, col: Color) {
201 let txt = CString::safe_new(txt);
202 unsafe { Fl_Chart_replace(self.inner.widget() as _, idx, val, txt.as_ptr(), col.bits()) }
203 }
204
205 pub fn set_bounds(&mut self, a: f64, b: f64) {
207 unsafe { Fl_Chart_set_bounds(self.inner.widget() as _, a, b) }
208 }
209
210 pub fn size(&self) -> i32 {
212 unsafe { Fl_Chart_size(self.inner.widget() as _) }
213 }
214
215 pub fn maximum_size(&self) -> i32 {
217 unsafe { Fl_Chart_maxsize(self.inner.widget() as _) }
218 }
219
220 pub fn set_maximum_size(&mut self, s: i32) {
222 unsafe { Fl_Chart_set_maxsize(self.inner.widget() as _, s) }
223 }
224
225 pub fn text_font(&self) -> Font {
227 unsafe { std::mem::transmute(Fl_Chart_text_font(self.inner.widget() as _)) }
228 }
229
230 pub fn set_text_font(&mut self, f: Font) {
232 unsafe { Fl_Chart_set_text_font(self.inner.widget() as _, f.bits()) }
233 }
234
235 pub fn text_size(&self) -> i32 {
237 unsafe { Fl_Chart_text_size(self.inner.widget() as _) }
238 }
239
240 pub fn set_text_size(&mut self, s: i32) {
242 unsafe { Fl_Chart_set_text_size(self.inner.widget() as _, s) }
243 }
244
245 pub fn text_color(&self) -> Color {
247 unsafe { std::mem::transmute(Fl_Chart_text_color(self.inner.widget() as _)) }
248 }
249
250 pub fn set_text_color(&mut self, color: Color) {
252 unsafe { Fl_Chart_set_text_color(self.inner.widget() as _, color.bits()) }
253 }
254
255 pub fn is_autosize(&self) -> bool {
257 unsafe { Fl_Chart_is_autosize(self.inner.widget() as _) != 0 }
258 }
259
260 pub fn make_autosize(&mut self, val: bool) {
262 unsafe { Fl_Chart_make_autosize(self.inner.widget() as _, i32::from(val)) }
263 }
264}
265
266#[derive(Debug)]
268pub struct Progress {
269 inner: crate::widget::WidgetTracker,
270 is_derived: bool,
271}
272
273crate::macros::widget::impl_widget_ext!(Progress, Fl_Progress);
274crate::macros::widget::impl_widget_base!(Progress, Fl_Progress);
275crate::macros::widget::impl_widget_default!(Progress, Fl_Progress);
276
277impl Progress {
278 pub fn minimum(&self) -> f64 {
280 unsafe { Fl_Progress_minimum(self.inner.widget() as _) }
281 }
282
283 pub fn set_minimum(&mut self, a: f64) {
285 unsafe { Fl_Progress_set_minimum(self.inner.widget() as _, a) }
286 }
287
288 pub fn maximum(&self) -> f64 {
290 unsafe { Fl_Progress_maximum(self.inner.widget() as _) }
291 }
292
293 pub fn set_maximum(&mut self, a: f64) {
295 unsafe { Fl_Progress_set_maximum(self.inner.widget() as _, a) }
296 }
297
298 pub fn value(&self) -> f64 {
300 unsafe { Fl_Progress_value(self.inner.widget() as _) }
301 }
302
303 pub fn set_value(&mut self, arg2: f64) {
305 unsafe {
306 Fl_Progress_set_value(self.inner.widget() as _, arg2);
307 }
308 }
309}
310
311#[derive(Clone, Debug)]
313pub struct Tooltip {}
314
315impl Tooltip {
316 pub fn delay() -> f32 {
318 unsafe { Fl_Tooltip_delay() }
319 }
320
321 pub fn set_delay(f: f32) {
323 unsafe { Fl_Tooltip_set_delay(f) }
324 }
325
326 pub fn hidedelay() -> f32 {
328 unsafe { Fl_Tooltip_hidedelay() }
329 }
330
331 pub fn set_hidedelay(f: f32) {
333 unsafe { Fl_Tooltip_set_hidedelay(f) }
334 }
335
336 pub fn hoverdelay() -> f32 {
338 unsafe { Fl_Tooltip_hoverdelay() }
339 }
340
341 pub fn set_hoverdelay(f: f32) {
343 unsafe { Fl_Tooltip_set_hoverdelay(f) }
344 }
345
346 pub fn enabled() -> bool {
348 unsafe { Fl_Tooltip_enabled() != 0 }
349 }
350
351 pub fn enable(b: bool) {
353 unsafe { Fl_Tooltip_enable(i32::from(b)) }
354 }
355
356 pub fn disable() {
358 unsafe { Fl_Tooltip_disable() }
359 }
360
361 pub fn enter_area<W: WidgetExt>(
365 widget: &W,
366 x: i32,
367 y: i32,
368 w: i32,
369 h: i32,
370 tip: &'static CStr,
371 ) {
372 unsafe {
373 Fl_Tooltip_enter_area(
374 widget.as_widget_ptr() as *mut Fl_Widget,
375 x,
376 y,
377 w,
378 h,
379 tip.as_ptr(),
380 );
381 }
382 }
383
384 pub fn current_widget() -> impl WidgetExt {
386 unsafe {
387 let widget_ptr = Fl_Tooltip_current_widget();
388 assert!(!widget_ptr.is_null());
389 Widget::from_widget_ptr(widget_ptr as *mut fltk_sys::widget::Fl_Widget)
390 }
391 }
392
393 pub fn current<W: WidgetExt>(w: &W) {
395 unsafe { Fl_Tooltip_current(w.as_widget_ptr() as *mut Fl_Widget) }
396 }
397
398 pub fn font() -> Font {
400 unsafe { mem::transmute(Fl_Tooltip_font()) }
401 }
402
403 pub fn set_font(font: Font) {
405 unsafe { Fl_Tooltip_set_font(font.bits()) }
406 }
407
408 pub fn font_size() -> i32 {
410 unsafe { Fl_Tooltip_font_size() }
411 }
412
413 pub fn set_font_size(s: i32) {
415 unsafe { Fl_Tooltip_set_font_size(s) }
416 }
417
418 pub fn color() -> Color {
420 unsafe { mem::transmute(Fl_Tooltip_color()) }
421 }
422
423 pub fn set_color(c: Color) {
425 unsafe { Fl_Tooltip_set_color(c.bits()) }
426 }
427
428 pub fn text_color() -> Color {
430 unsafe { mem::transmute(Fl_Tooltip_text_color()) }
431 }
432
433 pub fn set_text_color(c: Color) {
435 unsafe { Fl_Tooltip_set_text_color(c.bits()) }
436 }
437
438 pub fn margin_width() -> i32 {
440 unsafe { Fl_Tooltip_margin_width() }
441 }
442
443 pub fn set_margin_width(v: i32) {
445 unsafe { Fl_Tooltip_set_margin_width(v) }
446 }
447
448 pub fn margin_height() -> i32 {
450 unsafe { Fl_Tooltip_margin_height() }
451 }
452
453 pub fn set_margin_height(v: i32) {
455 unsafe { Fl_Tooltip_set_margin_height(v) }
456 }
457
458 pub fn wrap_width() -> i32 {
460 unsafe { Fl_Tooltip_wrap_width() }
461 }
462
463 pub fn set_wrap_width(v: i32) {
465 unsafe { Fl_Tooltip_set_wrap_width(v) }
466 }
467
468 pub fn current_window() -> impl WindowExt {
470 unsafe {
471 let wind = Fl_Tooltip_current_window();
472 assert!(!wind.is_null());
473 Window::from_widget_ptr(wind as *mut fltk_sys::widget::Fl_Widget)
474 }
475 }
476}
477
478#[derive(Debug)]
480pub struct InputChoice {
481 inner: crate::widget::WidgetTracker,
482 is_derived: bool,
483}
484
485crate::macros::widget::impl_widget_ext!(InputChoice, Fl_Input_Choice);
486crate::macros::widget::impl_widget_base!(InputChoice, Fl_Input_Choice);
487crate::macros::widget::impl_widget_default!(InputChoice, Fl_Input_Choice);
488
489impl InputChoice {
490 pub fn set_down_frame(&mut self, f: FrameType) {
492 unsafe { Fl_Input_Choice_set_down_box(self.inner.widget() as _, f.as_i32()) }
493 }
494
495 pub fn down_frame(&self) -> FrameType {
497 unsafe { FrameType::from_i32(Fl_Input_Choice_down_box(self.inner.widget() as _)) }
498 }
499
500 pub fn add(&mut self, s: &str) {
502 let s = CString::safe_new(s);
503 unsafe { Fl_Input_Choice_add(self.inner.widget() as _, s.as_ptr()) }
504 }
505
506 pub fn clear(&mut self) {
508 unsafe { Fl_Input_Choice_clear(self.inner.widget() as _) }
509 }
510
511 pub fn value(&self) -> Option<String> {
513 unsafe {
514 let ptr = Fl_Input_Choice_value(self.inner.widget() as _);
515 if ptr.is_null() {
516 None
517 } else {
518 Some(CStr::from_ptr(ptr).to_string_lossy().to_string())
519 }
520 }
521 }
522
523 pub fn value_index(&self) -> i32 {
525 unsafe { Fl_Input_Choice_value_index(self.inner.widget() as _) }
526 }
527
528 pub fn set_value(&mut self, val: &str) {
530 let val = CString::safe_new(val);
531 unsafe { Fl_Input_Choice_set_value(self.inner.widget() as _, val.as_ptr()) }
532 }
533
534 pub fn set_value_index(&mut self, idx: i32) {
536 unsafe { Fl_Input_Choice_set_value_index(self.inner.widget() as _, idx) }
537 }
538
539 pub fn input(&self) -> crate::input::Input {
541 unsafe {
542 let ptr = Fl_Input_Choice_input(self.inner.widget() as _);
543 assert!(!ptr.is_null());
544 crate::input::Input::from_widget_ptr(ptr as _)
545 }
546 }
547
548 pub fn menu_button(&self) -> crate::menu::MenuButton {
550 unsafe {
551 let ptr = Fl_Input_Choice_menu_button(self.inner.widget() as _);
552 assert!(!ptr.is_null());
553 crate::menu::MenuButton::from_widget_ptr(ptr as _)
554 }
555 }
556
557 pub fn text_font(&self) -> Font {
559 unsafe { std::mem::transmute(Fl_Input_Choice_text_font(self.inner.widget() as _)) }
560 }
561
562 pub fn set_text_font(&mut self, f: Font) {
564 unsafe { Fl_Input_Choice_set_text_font(self.inner.widget() as _, f.bits()) }
565 }
566
567 pub fn text_size(&self) -> i32 {
569 unsafe { Fl_Input_Choice_text_size(self.inner.widget() as _) }
570 }
571
572 pub fn set_text_size(&mut self, s: i32) {
574 unsafe { Fl_Input_Choice_set_text_size(self.inner.widget() as _, s) }
575 }
576
577 pub fn text_color(&self) -> Color {
579 unsafe { std::mem::transmute(Fl_Input_Choice_text_color(self.inner.widget() as _)) }
580 }
581
582 pub fn set_text_color(&mut self, color: Color) {
584 unsafe { Fl_Input_Choice_set_text_color(self.inner.widget() as _, color.bits()) }
585 }
586}
587
588#[derive(Debug)]
598pub struct HelpView {
599 inner: crate::widget::WidgetTracker,
600 is_derived: bool,
601}
602
603crate::macros::widget::impl_widget_ext!(HelpView, Fl_Help_View);
604crate::macros::widget::impl_widget_base!(HelpView, Fl_Help_View);
605crate::macros::widget::impl_widget_default!(HelpView, Fl_Help_View);
606
607impl HelpView {
608 pub fn directory(&self) -> Option<std::path::PathBuf> {
610 unsafe {
611 let x = Fl_Help_View_directory(self.inner.widget() as _);
612 if x.is_null() {
613 None
614 } else {
615 Some(std::path::PathBuf::from(
616 CStr::from_ptr(x as *mut raw::c_char)
617 .to_string_lossy()
618 .to_string(),
619 ))
620 }
621 }
622 }
623
624 pub fn filename(&self) -> Option<std::path::PathBuf> {
626 unsafe {
627 let x = Fl_Help_View_directory(self.inner.widget() as _);
628 if x.is_null() {
629 None
630 } else {
631 Some(std::path::PathBuf::from(
632 CStr::from_ptr(x as *mut raw::c_char)
633 .to_string_lossy()
634 .to_string(),
635 ))
636 }
637 }
638 }
639
640 pub fn find(&self, s: &str, start_from: i32) -> Option<usize> {
642 unsafe {
643 let s = CString::safe_new(s);
644 let ret = Fl_Help_View_find(self.inner.widget() as _, s.as_ptr(), start_from);
645 match ret {
646 -1 => None,
647 _ => Some(ret as usize),
648 }
649 }
650 }
651
652 pub fn value(&self) -> Option<String> {
654 unsafe {
655 let val = Fl_Help_View_value(self.inner.widget() as _);
656 if val.is_null() {
657 None
658 } else {
659 Some(CStr::from_ptr(val).to_string_lossy().to_string())
660 }
661 }
662 }
663
664 pub fn set_value(&mut self, val: &str) {
666 let val = CString::safe_new(val);
667 unsafe { Fl_Help_View_set_value(self.inner.widget() as _, val.as_ptr()) }
668 }
669
670 pub fn clear_selection(&mut self) {
672 unsafe { Fl_Help_View_clear_selection(self.inner.widget() as _) }
673 }
674
675 pub fn select_all(&mut self) {
677 unsafe { Fl_Help_View_select_all(self.inner.widget() as _) }
678 }
679
680 pub fn set_top_line_string(&mut self, n: &str) {
682 let n = CString::safe_new(n);
683 unsafe { Fl_Help_View_set_topline_str(self.inner.widget() as _, n.as_ptr()) }
684 }
685
686 pub fn set_top_line(&mut self, line: i32) {
688 unsafe { Fl_Help_View_set_topline(self.inner.widget() as _, line) }
689 }
690
691 pub fn top_line(&self) -> i32 {
693 unsafe { Fl_Help_View_topline(self.inner.widget() as _) }
694 }
695
696 pub fn set_left_line(&mut self, arg1: i32) {
698 unsafe { Fl_Help_View_set_leftline(self.inner.widget() as _, arg1) }
699 }
700
701 pub fn left_line(&self) -> i32 {
703 unsafe { Fl_Help_View_leftline(self.inner.widget() as _) }
704 }
705
706 pub fn text_font(&self) -> Font {
708 unsafe { std::mem::transmute(Fl_Help_View_text_font(self.inner.widget() as _)) }
709 }
710
711 pub fn set_text_font(&mut self, f: Font) {
713 unsafe { Fl_Help_View_set_text_font(self.inner.widget() as _, f.bits()) }
714 }
715
716 pub fn text_size(&self) -> i32 {
718 unsafe { Fl_Help_View_text_size(self.inner.widget() as _) }
719 }
720
721 pub fn set_text_size(&mut self, s: i32) {
723 unsafe { Fl_Help_View_set_text_size(self.inner.widget() as _, s) }
724 }
725
726 pub fn text_color(&self) -> Color {
728 unsafe { std::mem::transmute(Fl_Help_View_text_color(self.inner.widget() as _)) }
729 }
730
731 pub fn set_text_color(&mut self, color: Color) {
733 unsafe { Fl_Help_View_set_text_color(self.inner.widget() as _, color.bits()) }
734 }
735
736 pub fn scrollbar_size(&self) -> i32 {
738 unsafe { Fl_Help_View_scrollbar_size(self.inner.widget() as _) }
739 }
740
741 pub fn set_scrollbar_size(&mut self, new_size: i32) {
743 unsafe { Fl_Help_View_set_scrollbar_size(self.inner.widget() as _, new_size) }
744 }
745
746 pub fn load(&mut self, f: &str) -> Result<(), FltkError> {
750 let f = CString::safe_new(f);
751 unsafe {
752 match Fl_Help_View_load(self.inner.widget() as _, f.as_ptr()) {
753 0 => Ok(()),
754 _ => Err(FltkError::Internal(FltkErrorKind::ResourceNotFound)),
755 }
756 }
757 }
758}