Skip to main content

tree_table/api/
readonly.rs

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