1use alloc::{rc::Rc, string::String};
2use core::cell::RefCell;
3
4use crate::{Checkbox, CheckboxArgs, EventData, SetCheckboxArgs, Table, Val};
5
6impl Table {
7 pub fn checkbox(
8 &mut self,
9 kwargs: Option<CheckboxArgs>,
10 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
11 let kwargs: CheckboxArgs = kwargs.unwrap_or_default();
12 let span = self.cr_key_to_span(kwargs.key)?;
13 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
14 let checkbox = if kwargs.del {
15 None
16 } else {
17 Some(Checkbox {
18 true_val: kwargs.true_val.unwrap_or(Val::Bl(true)),
19 false_val: kwargs.false_val.unwrap_or(Val::Bl(false)),
20 text: kwargs.text,
21 state: kwargs.state,
22 })
23 };
24 let (start_row, end_row) = span.rows_start_end(&self.grid);
25 let (start_col, end_col) = span.cols_start_end(&self.grid);
26
27 if let Err(e) = (|| -> Result<(), String> {
28 if kwargs.expand {
29 self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
30 self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
31 }
32 let empty_val = &self.opts.empty_val;
33
34 for row in start_row..=end_row {
35 for col in start_col..=end_col {
36 Self::acr_event_data_set_tcheckbox(
37 &mut self.grid.index.cells,
38 row,
39 col,
40 checkbox.clone(),
41 empty_val,
42 &mut event_data,
43 )?;
44 }
45 }
46 Ok(())
47 })() {
48 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
49 return Err(e);
50 }
51
52 self.cr_finalize_event_if_any_non_selection_change(
53 event_data,
54 kwargs.undo,
55 kwargs.emit,
56 true,
57 )
58 }
59
60 pub fn checkbox_i(
61 &mut self,
62 kwargs: Option<CheckboxArgs>,
63 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
64 let kwargs: CheckboxArgs = kwargs.unwrap_or_default();
65 let span = self.cr_key_to_span(kwargs.key)?;
66 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
67 let checkbox = if kwargs.del {
68 None
69 } else {
70 Some(Checkbox {
71 true_val: kwargs.true_val.unwrap_or(Val::Bl(true)),
72 false_val: kwargs.false_val.unwrap_or(Val::Bl(false)),
73 text: kwargs.text,
74 state: kwargs.state,
75 })
76 };
77 let (start_row, end_row) = span.rows_start_end(&self.grid);
78
79 if let Err(e) = (|| -> Result<(), String> {
80 if kwargs.expand {
81 self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
82 }
83 for row in start_row..=end_row {
84 Self::acr_event_data_set_icheckbox(
85 &mut self.grid.index.cells,
86 row,
87 checkbox.clone(),
88 &mut event_data,
89 )?;
90 }
91 Ok(())
92 })() {
93 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
94 return Err(e);
95 }
96
97 self.cr_finalize_event_if_any_non_selection_change(
98 event_data,
99 kwargs.undo,
100 kwargs.emit,
101 true,
102 )
103 }
104
105 pub fn checkbox_h(
106 &mut self,
107 kwargs: Option<CheckboxArgs>,
108 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
109 let kwargs: CheckboxArgs = kwargs.unwrap_or_default();
110 let span = self.cr_key_to_span(kwargs.key)?;
111 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
112 let checkbox = if kwargs.del {
113 None
114 } else {
115 Some(Checkbox {
116 true_val: kwargs.true_val.unwrap_or(Val::Bl(true)),
117 false_val: kwargs.false_val.unwrap_or(Val::Bl(false)),
118 text: kwargs.text,
119 state: kwargs.state,
120 })
121 };
122 let (start_col, end_col) = span.cols_start_end(&self.grid);
123
124 if let Err(e) = (|| -> Result<(), String> {
125 if kwargs.expand {
126 self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
127 }
128 for col in start_col..=end_col {
129 Self::acr_event_data_set_hcheckbox(
130 &mut self.grid.header.cells,
131 col,
132 checkbox.clone(),
133 &mut event_data,
134 )?;
135 }
136 Ok(())
137 })() {
138 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
139 return Err(e);
140 }
141
142 self.cr_finalize_event_if_any_non_selection_change(
143 event_data,
144 kwargs.undo,
145 kwargs.emit,
146 true,
147 )
148 }
149
150 pub fn set_checkbox(
151 &mut self,
152 kwargs: Option<SetCheckboxArgs>,
153 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
154 let kwargs = kwargs.unwrap_or_default();
155 let span = self.cr_key_to_span(kwargs.key)?;
156 let mut event_data = self.cr_new_event(kwargs.save_selection);
157 let (start_row, end_row) = span.rows_start_end(&self.grid);
158 let (start_col, end_col) = span.cols_start_end(&self.grid);
159 let empty_val = &self.opts.empty_val;
160
161 if let Err(e) = (|| -> Result<(), String> {
162 for row in start_row..=end_row {
163 for col in start_col..=end_col {
164 if let Some(true_val) = &kwargs.true_val {
165 Self::acr_event_data_set_tcheckbox_true_val(
166 &mut self.grid.index.cells,
167 row,
168 col,
169 true_val.clone(),
170 empty_val,
171 &mut event_data,
172 )?;
173 }
174 if let Some(false_val) = &kwargs.false_val {
175 Self::acr_event_data_set_tcheckbox_false_val(
176 &mut self.grid.index.cells,
177 row,
178 col,
179 false_val.clone(),
180 empty_val,
181 &mut event_data,
182 )?;
183 }
184 if let Some(text) = &kwargs.text {
185 Self::acr_event_data_set_tcheckbox_text(
186 &mut self.grid.index.cells,
187 row,
188 col,
189 text.clone(),
190 empty_val,
191 &mut event_data,
192 )?;
193 }
194 if let Some(state) = kwargs.state {
195 Self::acr_event_data_set_tcheckbox_state(
196 &mut self.grid.index.cells,
197 row,
198 col,
199 state,
200 empty_val,
201 &mut event_data,
202 )?;
203 }
204 }
205 }
206 Ok(())
207 })() {
208 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
209 return Err(e);
210 }
211
212 self.cr_finalize_event_if_any_non_selection_change(
213 event_data,
214 kwargs.undo,
215 kwargs.emit,
216 true,
217 )
218 }
219
220 pub fn set_checkbox_i(
221 &mut self,
222 kwargs: Option<SetCheckboxArgs>,
223 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
224 let kwargs = kwargs.unwrap_or_default();
225 let span = self.cr_key_to_span(kwargs.key)?;
226 let mut event_data = self.cr_new_event(kwargs.save_selection);
227 let (start_row, end_row) = span.rows_start_end(&self.grid);
228
229 if let Err(e) = (|| -> Result<(), String> {
230 for row in start_row..=end_row {
231 if let Some(true_val) = &kwargs.true_val {
232 Self::acr_event_data_set_icheckbox_true_val(
233 &mut self.grid.index.cells,
234 row,
235 true_val.clone(),
236 &mut event_data,
237 )?;
238 }
239 if let Some(false_val) = &kwargs.false_val {
240 Self::acr_event_data_set_icheckbox_false_val(
241 &mut self.grid.index.cells,
242 row,
243 false_val.clone(),
244 &mut event_data,
245 )?;
246 }
247 if let Some(text) = &kwargs.text {
248 Self::acr_event_data_set_icheckbox_text(
249 &mut self.grid.index.cells,
250 row,
251 text.clone(),
252 &mut event_data,
253 )?;
254 }
255 if let Some(state) = kwargs.state {
256 Self::acr_event_data_set_icheckbox_state(
257 &mut self.grid.index.cells,
258 row,
259 state,
260 &mut event_data,
261 )?;
262 }
263 }
264 Ok(())
265 })() {
266 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
267 return Err(e);
268 }
269 self.cr_finalize_event_if_any_non_selection_change(
270 event_data,
271 kwargs.undo,
272 kwargs.emit,
273 true,
274 )
275 }
276
277 pub fn set_checkbox_h(
278 &mut self,
279 kwargs: Option<SetCheckboxArgs>,
280 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
281 let kwargs = kwargs.unwrap_or_default();
282 let span = self.cr_key_to_span(kwargs.key)?;
283 let mut event_data = self.cr_new_event(kwargs.save_selection);
284 let (start_col, end_col) = span.cols_start_end(&self.grid);
285
286 if let Err(e) = (|| -> Result<(), String> {
287 for col in start_col..=end_col {
288 if let Some(true_val) = &kwargs.true_val {
289 Self::acr_event_data_set_hcheckbox_true_val(
290 &mut self.grid.header.cells,
291 col,
292 true_val.clone(),
293 &mut event_data,
294 )?;
295 }
296 if let Some(false_val) = &kwargs.false_val {
297 Self::acr_event_data_set_hcheckbox_false_val(
298 &mut self.grid.header.cells,
299 col,
300 false_val.clone(),
301 &mut event_data,
302 )?;
303 }
304 if let Some(text) = &kwargs.text {
305 Self::acr_event_data_set_hcheckbox_text(
306 &mut self.grid.header.cells,
307 col,
308 text.clone(),
309 &mut event_data,
310 )?;
311 }
312 if let Some(state) = kwargs.state {
313 Self::acr_event_data_set_hcheckbox_state(
314 &mut self.grid.header.cells,
315 col,
316 state,
317 &mut event_data,
318 )?;
319 }
320 }
321 Ok(())
322 })() {
323 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
324 return Err(e);
325 }
326 self.cr_finalize_event_if_any_non_selection_change(
327 event_data,
328 kwargs.undo,
329 kwargs.emit,
330 true,
331 )
332 }
333}