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