threads_windows/
threads_windows.rs1use 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}