Skip to main content

options/
options.rs

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