options/
options.rs

1use everything_plugin::ui::winio::prelude::*;
2
3use crate::{App, HANDLER, Mode};
4
5pub struct MainModel {
6    window: Child<Window>,
7    enabled: Child<CheckBox>,
8    b: Child<CheckBox>,
9    s_label: Child<Label>,
10    s: Child<Edit>,
11    e_label: Child<Label>,
12    e: Child<ComboBox>,
13}
14
15#[derive(Debug)]
16pub enum MainMessage {
17    Noop,
18    Close,
19    Redraw,
20    EnabledClick,
21    OptionsPage(OptionsPageMessage<App>),
22}
23
24impl From<OptionsPageMessage<App>> for MainMessage {
25    fn from(value: OptionsPageMessage<App>) -> Self {
26        Self::OptionsPage(value)
27    }
28}
29
30impl Component for MainModel {
31    type Event = ();
32    type Init<'a> = OptionsPageInit<'a, App>;
33    type Message = MainMessage;
34
35    fn init(mut init: Self::Init<'_>, sender: &ComponentSender<Self>) -> Self {
36        let mut window = init.window(sender);
37        // window.set_size(Size::new(800.0, 600.0));
38
39        let mut enabled = Child::<CheckBox>::init(&window);
40        enabled.set_text("Enable");
41
42        let mut b = Child::<CheckBox>::init(&window);
43        b.set_text("Switch");
44
45        let mut e_label = Child::<Label>::init(&window);
46        e_label.set_text("Mode:");
47        let mut e = Child::<ComboBox>::init(&window);
48        e.insert(0, "A");
49        e.insert(1, "B");
50
51        let mut s_label = Child::<Label>::init(&window);
52        s_label.set_text("Message:");
53        let mut s = Child::<Edit>::init(&window);
54
55        HANDLER.with_app(|a| {
56            let config = a.config();
57
58            enabled.set_checked(config.enabled);
59            b.set_checked(config.b);
60
61            e.set_selection(Some(match config.e {
62                Mode::A => 0,
63                Mode::B => 1,
64            }));
65
66            s.set_text(&config.s);
67        });
68
69        sender.post(MainMessage::EnabledClick);
70
71        window.show();
72
73        Self {
74            window,
75            enabled,
76            b,
77            s_label,
78            s,
79            e_label,
80            e,
81        }
82    }
83
84    async fn start(&mut self, sender: &ComponentSender<Self>) -> ! {
85        start! {
86            sender, default: MainMessage::Noop,
87            self.window => {
88                WindowEvent::Close => MainMessage::Close,
89                WindowEvent::Resize => MainMessage::Redraw,
90            },
91            self.enabled => {
92                CheckBoxEvent::Click => MainMessage::EnabledClick
93            }
94        }
95    }
96
97    async fn update(&mut self, message: Self::Message, sender: &ComponentSender<Self>) -> bool {
98        futures_util::join!(self.window.update());
99        match message {
100            MainMessage::Noop => false,
101            MainMessage::Close => {
102                sender.output(());
103                false
104            }
105            MainMessage::Redraw => true,
106            MainMessage::EnabledClick => {
107                let enabled = self.enabled.is_checked();
108                self.b.set_enabled(enabled);
109                self.e.set_enabled(enabled);
110                self.s.set_enabled(enabled);
111                false
112            }
113            MainMessage::OptionsPage(m) => {
114                tracing::debug!(?m, "Options page message");
115                match m {
116                    OptionsPageMessage::Save(config, tx) => {
117                        config.enabled = self.enabled.is_checked();
118                        config.b = self.b.is_checked();
119                        config.e = match self.e.selection() {
120                            Some(0) => Mode::A,
121                            Some(1) => Mode::B,
122                            _ => Default::default(),
123                        };
124                        config.s = self.s.text();
125                        tx.send(config).unwrap()
126                    }
127                }
128                false
129            }
130        }
131    }
132
133    fn render(&mut self, _sender: &ComponentSender<Self>) {
134        self.window.render();
135
136        let csize = self.window.client_size();
137
138        let m = Margin::new(5., 0., 5., 0.);
139        let m_l = Margin::new(0., 5., 0., 0.);
140
141        let mut form = layout! {
142            Grid::from_str("auto,1*", "auto,auto").unwrap(),
143            self.e_label => { column: 0, row: 0, margin: m_l, valign: VAlign::Center },
144            self.e => { column: 1, row: 0, margin: m },
145            self.s_label => { column: 0, row: 1, margin: m_l, valign: VAlign::Center },
146            self.s => { column: 1, row: 1, margin: m },
147        };
148
149        let mut grid = layout! {
150            Grid::from_str("auto,1*", "auto,auto,auto,1*").unwrap(),
151            self.enabled => { column: 0, row: 0, margin: m },
152            self.b => { column: 0, row: 1, margin: m },
153            form => { column: 0, row: 2, margin: m },
154        };
155        grid.set_size(csize);
156    }
157}