Skip to main content

tree_table/api/
highlight.rs

1use alloc::{rc::Rc, string::String};
2use core::cell::RefCell;
3
4use crate::args::HighlightArgs;
5use crate::{EventData, Highlight, Table, try_hex_to_color3};
6
7impl Table {
8    pub fn highlight(
9        &mut self,
10        kwargs: Option<HighlightArgs>,
11    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
12        let kwargs: HighlightArgs = 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 highlight = if kwargs.bg.is_none() && kwargs.fg.is_none() {
16            None
17        } else {
18            Some(Highlight {
19                bg: try_hex_to_color3(kwargs.bg)?,
20                fg: try_hex_to_color3(kwargs.fg)?,
21            })
22        };
23        let (start_row, end_row) = span.rows_start_end(&self.grid);
24        let (start_col, end_col) = span.cols_start_end(&self.grid);
25
26        if let Err(e) = (|| -> Result<(), String> {
27            if kwargs.expand {
28                self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
29                self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
30            }
31            let empty_val = &self.opts.empty_val;
32
33            for row in start_row..=end_row {
34                for col in start_col..=end_col {
35                    Self::acr_event_data_set_thighlight(
36                        &mut self.grid.index.cells,
37                        row,
38                        col,
39                        highlight.clone(),
40                        empty_val,
41                        &mut event_data,
42                    )?;
43                }
44            }
45            Ok(())
46        })() {
47            self.cr_roll_back(Rc::new(RefCell::new(event_data)));
48            return Err(e);
49        }
50
51        self.cr_finalize_event_if_any_non_selection_change(
52            event_data,
53            kwargs.undo,
54            kwargs.emit,
55            true,
56        )
57    }
58
59    pub fn highlight_i(
60        &mut self,
61        kwargs: Option<HighlightArgs>,
62    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
63        let kwargs: HighlightArgs = kwargs.unwrap_or_default();
64        let span = self.cr_key_to_span(kwargs.key)?;
65        let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
66        if kwargs.expand {
67            self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
68        }
69        let highlight = if kwargs.bg.is_none() && kwargs.fg.is_none() {
70            None
71        } else {
72            Some(Highlight {
73                bg: try_hex_to_color3(kwargs.bg)?,
74                fg: try_hex_to_color3(kwargs.fg)?,
75            })
76        };
77        let (start_row, end_row) = span.rows_start_end(&self.grid);
78        let mut error: Option<String> = None;
79
80        for row in start_row..=end_row {
81            if let Err(e) = Self::acr_event_data_set_ihighlight(
82                &mut self.grid.index.cells,
83                row,
84                highlight.clone(),
85                &mut event_data,
86            ) {
87                error = Some(e);
88                break;
89            }
90        }
91
92        if let Some(e) = error {
93            self.cr_roll_back(Rc::new(RefCell::new(event_data)));
94            return Err(e);
95        } else {
96            self.cr_finalize_event_if_any_non_selection_change(
97                event_data,
98                kwargs.undo,
99                kwargs.emit,
100                true,
101            )
102        }
103    }
104
105    pub fn highlight_h(
106        &mut self,
107        kwargs: Option<HighlightArgs>,
108    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
109        let kwargs: HighlightArgs = 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        if kwargs.expand {
113            self.cr_ensure_widget_ncols(span.max_col(&self.grid), &mut event_data, true)?;
114        }
115        let highlight = if kwargs.bg.is_none() && kwargs.fg.is_none() {
116            None
117        } else {
118            Some(Highlight {
119                bg: try_hex_to_color3(kwargs.bg)?,
120                fg: try_hex_to_color3(kwargs.fg)?,
121            })
122        };
123        let (start_col, end_col) = span.cols_start_end(&self.grid);
124        let mut error: Option<String> = None;
125
126        for col in start_col..=end_col {
127            if let Err(e) = Self::acr_event_data_set_hhighlight(
128                &mut self.grid.header.cells,
129                col,
130                highlight.clone(),
131                &mut event_data,
132            ) {
133                error = Some(e);
134                break;
135            }
136        }
137
138        if let Some(e) = error {
139            self.cr_roll_back(Rc::new(RefCell::new(event_data)));
140            return Err(e);
141        } else {
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}