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 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 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}