composite_widgets/
composite_widgets.rs

1use fltk::{prelude::*, *};
2use std::ops::{Deref, DerefMut};
3
4struct MyButton {
5    grp: group::Group,
6}
7
8impl MyButton {
9    pub fn new(w: i32, h: i32) -> MyButton {
10        let mut grp = group::Group::new(0, 0, w, h, None);
11        grp.set_frame(enums::FrameType::RFlatBox);
12        grp.set_color(enums::Color::from_u32(0x01579b));
13        grp.set_align(enums::Align::Center);
14        let mut btn = button::Button::new(grp.x() + 420, grp.y() + 35, 30, 25, "@1+");
15        btn.set_frame(enums::FrameType::OFlatFrame);
16        btn.set_color(enums::Color::from_u32(0xf49da9));
17        btn.set_callback(move |b| b.parent().unwrap().hide());
18        grp.end();
19        grp.handle(|g, ev| match ev {
20            enums::Event::Push => {
21                g.do_callback();
22                true
23            }
24            _ => false,
25        });
26        MyButton { grp }
27    }
28}
29
30impl Deref for MyButton {
31    type Target = group::Group;
32    fn deref(&self) -> &Self::Target {
33        &self.grp
34    }
35}
36impl DerefMut for MyButton {
37    fn deref_mut(&mut self) -> &mut Self::Target {
38        &mut self.grp
39    }
40}
41
42fn main() {
43    let app = app::App::default();
44    app::set_visible_focus(false);
45    let mut win = window::Window::default().with_size(500, 400);
46    win.make_resizable(true);
47    win.set_color(enums::Color::Black);
48    let mut col = group::Flex::default_fill().column();
49    col.set_margin(20);
50    col.set_pad(10);
51
52    for i in 0..3 {
53        let label = format!("Button {}", i + 1);
54        let mut but = MyButton::new(500, 100);
55        but.set_label(&label);
56        but.set_callback(move |_| println!("{label}"));
57    }
58
59    col.end();
60    win.end();
61    win.show();
62    app.run().unwrap();
63}