tree_table/api/
data_format.rs1use alloc::{rc::Rc, string::String};
2use core::cell::RefCell;
3
4use crate::args::DataFormatArgs;
5use crate::{DataFormat, EventData, FormatSpec, Table, string_to_data_format};
6
7fn parse_format_spec(spec: Option<FormatSpec>) -> Result<Option<DataFormat>, String> {
8 match spec {
9 None => Ok(None),
10 Some(FormatSpec::Simple(s)) if !s.is_empty() => string_to_data_format(&s).map(Some),
11 Some(FormatSpec::Simple(_)) => Ok(None),
12 Some(FormatSpec::Rich(df)) => Ok(Some(df)),
13 }
14}
15
16impl Table {
17 pub fn data_format(
18 &mut self,
19 kwargs: Option<DataFormatArgs>,
20 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
21 let kwargs = kwargs.unwrap_or_default();
22 let span = self.cr_key_to_span(kwargs.key)?;
23 let fmt = parse_format_spec(kwargs.fmt)?;
24 let mut event_data = self.cr_new_event(kwargs.save_selection);
25 let normalize = kwargs.fmt_normalize;
26 let ignore_fmt_errs = kwargs.ignore_fmt_errs;
27 let set_vals = kwargs.set_vals;
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_tdata_format(
41 &mut self.grid.index.cells,
42 row,
43 col,
44 fmt.clone(),
45 empty_val,
46 &mut event_data,
47 )?;
48
49 if set_vals {
50 let cell = Self::acr_icell_mut(&mut self.grid.index.cells, row)?;
51 cell.event_data_apply_own_tformat(
52 row,
53 col,
54 empty_val,
55 &mut event_data,
56 normalize,
57 ignore_fmt_errs,
58 )?;
59 }
60 }
61 }
62 Ok(())
63 })() {
64 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
65 return Err(e);
66 }
67
68 self.cr_finalize_event_if_any_non_selection_change(
69 event_data,
70 kwargs.undo,
71 kwargs.emit,
72 true,
73 )
74 }
75
76 pub fn data_format_i(
77 &mut self,
78 kwargs: Option<DataFormatArgs>,
79 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
80 let kwargs: DataFormatArgs = kwargs.unwrap_or_default();
81 let span = self.cr_key_to_span(kwargs.key)?;
82 let fmt = parse_format_spec(kwargs.fmt)?;
83 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
84 let normalize = kwargs.fmt_normalize;
85 let ignore_fmt_errs = kwargs.ignore_fmt_errs;
86 let set_vals = kwargs.set_vals;
87 let (start_row, end_row) = span.rows_start_end(&self.grid);
88
89 if let Err(e) = (|| -> Result<(), String> {
90 if kwargs.expand {
91 self.cr_ensure_widget_nrows(span.max_row(&self.grid), &mut event_data, true)?;
92 }
93 for row in start_row..=end_row {
94 Self::acr_event_data_set_idata_format(
95 &mut self.grid.index.cells,
96 row,
97 fmt.clone(),
98 &mut event_data,
99 )?;
100 if set_vals {
101 let cell = Self::acr_icell_mut(&mut self.grid.index.cells, row)?;
102 cell.event_data_apply_own_iformat(
103 row,
104 &mut event_data,
105 normalize,
106 ignore_fmt_errs,
107 )?;
108 }
109 }
110 Ok(())
111 })() {
112 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
113 return Err(e);
114 }
115
116 self.cr_finalize_event_if_any_non_selection_change(
117 event_data,
118 kwargs.undo,
119 kwargs.emit,
120 true,
121 )
122 }
123
124 pub fn data_format_h(
125 &mut self,
126 kwargs: Option<DataFormatArgs>,
127 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
128 let kwargs: DataFormatArgs = kwargs.unwrap_or_default();
129 let span = self.cr_key_to_span(kwargs.key)?;
130 let fmt = parse_format_spec(kwargs.fmt)?;
131 let mut event_data: EventData = self.cr_new_event(kwargs.save_selection);
132 let normalize = kwargs.fmt_normalize;
133 let ignore_fmt_errs = kwargs.ignore_fmt_errs;
134 let set_vals = kwargs.set_vals;
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 for col in start_col..=end_col {
142 Self::acr_event_data_set_hdata_format(
143 &mut self.grid.header.cells,
144 col,
145 fmt.clone(),
146 &mut event_data,
147 )?;
148 if set_vals {
149 let cell = Self::acr_hcell_mut(&mut self.grid.header.cells, col)?;
150 cell.event_data_apply_own_hformat(
151 col,
152 &mut event_data,
153 normalize,
154 ignore_fmt_errs,
155 )?;
156 }
157 }
158 Ok(())
159 })() {
160 self.cr_roll_back(Rc::new(RefCell::new(event_data)));
161 return Err(e);
162 }
163
164 self.cr_finalize_event_if_any_non_selection_change(
165 event_data,
166 kwargs.undo,
167 kwargs.emit,
168 true,
169 )
170 }
171}