Skip to main content

tree_table/api/
dropdown.rs

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