Skip to main content

tree_table/api/
checkbox.rs

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}