threads_windows/
threads_windows.rs

1use fltk::{
2    app, button::Button, enums::Align, frame::Frame, group::Flex, misc::HelpView, prelude::*,
3    window::Window,
4};
5
6use std::{thread, time::Duration};
7
8#[derive(Debug, Clone, Copy)]
9pub enum Message {
10    Increment,
11    Decrement,
12    Activate,
13    Deactivate,
14    Message(&'static str),
15}
16
17fn main() -> Result<(), Box<dyn std::error::Error>> {
18    let app = app::App::default();
19    let mut wind = Window::default().with_size(160, 200).with_label("Counter");
20    let mut col = Flex::default()
21        .with_size(120, 140)
22        .center_of(&wind)
23        .column();
24    col.set_spacing(10);
25    let mut but_inc = Button::default().with_label("+");
26    let mut frame = Frame::default().with_label("0");
27    let mut but_dec = Button::default().with_label("-");
28    col.end();
29    wind.end();
30    wind.show();
31
32    let mut msg_wind = Window::default().with_size(120, 100).with_label("Message");
33    let mut msgview = HelpView::default().with_size(120, 100);
34    msgview.set_align(Align::Center);
35    msg_wind.end();
36
37    let (s, r) = app::channel::<Message>();
38
39    but_inc.set_callback({
40        move |_| {
41            s.send(Message::Deactivate);
42            thread::spawn(move || {
43                thread::sleep(Duration::from_secs(1));
44                s.send(Message::Increment);
45                s.send(Message::Message("Incremented"));
46                s.send(Message::Activate);
47            });
48        }
49    });
50    but_dec.set_callback({
51        move |_| {
52            s.send(Message::Deactivate);
53            thread::spawn(move || {
54                thread::sleep(Duration::from_secs(1));
55                s.send(Message::Decrement);
56                s.send(Message::Message("Decremented"));
57                s.send(Message::Activate);
58            });
59        }
60    });
61
62    while app.wait() {
63        if let Some(msg) = r.recv() {
64            let label: i32 = frame.label().unwrap().parse()?;
65            match msg {
66                Message::Increment => frame.set_label(&(label + 1).to_string()),
67                Message::Decrement => frame.set_label(&(label - 1).to_string()),
68                Message::Activate => {
69                    but_inc.activate();
70                    but_dec.activate();
71                }
72                Message::Deactivate => {
73                    but_inc.deactivate();
74                    but_dec.deactivate();
75                }
76                Message::Message(s) => {
77                    msgview.set_value(s);
78                    msg_wind.show();
79                }
80            }
81        }
82    }
83    Ok(())
84}