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