Skip to main content

tree_table/api/
borders.rs

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