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}