Skip to main content

tree_table/api/
data_format.rs

1use 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}