tree_table/api/
highlight.rs1use 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}