tree_table/api/
del_cols.rs1use alloc::string::ToString;
2use alloc::{rc::Rc, string::String, vec, vec::Vec};
3use core::cell::RefCell;
4
5use crate::args::DelArgs;
6use crate::args::args_del::DelPosArgs;
7use crate::statics::{
8 default_emit_event_for_api, default_save_selection_for_api, default_undo_for_api,
9};
10use crate::{EventData, Table};
11
12impl Table {
13 pub fn del_cols(
15 &mut self,
16 kwargs: Option<DelArgs>,
17 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
18 let num_cols = Self::acr_total_cols(&self.grid.header.cells);
19 if num_cols == 0 {
20 return Ok(None);
21 }
22
23 let kwargs = kwargs.unwrap_or(DelArgs {
24 items: Some(vec![
25 Self::acr_borrow_ciid(&self.grid.header.cells, num_cols.saturating_sub(1))?
26 .to_string(),
27 ]),
28 emit: default_emit_event_for_api(),
29 undo: default_undo_for_api(),
30 save_selection: default_save_selection_for_api(),
31 });
32
33 let items = kwargs.items.unwrap_or(vec![
34 Self::acr_borrow_ciid(&self.grid.header.cells, num_cols.saturating_sub(1))?.to_string(),
35 ]);
36
37 let mut event_data = self.cr_new_event(kwargs.save_selection);
38 let mut positions: Vec<usize> = Vec::new();
39
40 for iid in items.iter() {
41 positions.push(Self::acr_pos(&self.grid.header.iid_to_col, iid)?);
42 }
43
44 if positions.is_empty() {
45 return Ok(None);
46 }
47 positions.sort_unstable();
48 positions.dedup();
49
50 let deleted_disp = Self::acr_compute_deleted_disp_cols(&self.grid.disp_cols, &positions);
51 self.cr_del_cols(positions, &mut event_data)?;
52 self.cr_adjust_selections_after_col_delete(&deleted_disp);
53 self.cr_finalize_event(event_data, kwargs.undo, kwargs.emit)
54 }
55
56 pub fn del_cols_pos(
58 &mut self,
59 kwargs: Option<DelPosArgs>,
60 ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
61 let num_cols = Self::acr_total_cols(&self.grid.header.cells);
62 if num_cols == 0 {
63 return Ok(None);
64 }
65
66 let kwargs = kwargs.unwrap_or(DelPosArgs {
67 items: Some(vec![num_cols.saturating_sub(1)]),
68 emit: default_emit_event_for_api(),
69 undo: default_undo_for_api(),
70 save_selection: default_save_selection_for_api(),
71 });
72
73 let mut positions: Vec<usize> = if let Some(items) = kwargs.items {
74 items.into_iter().filter(|&p| p < num_cols).collect()
75 } else {
76 vec![num_cols.saturating_sub(1)]
77 };
78
79 if positions.is_empty() {
80 return Ok(None);
81 }
82 positions.sort_unstable();
83 positions.dedup();
84
85 let mut event_data = self.cr_new_event(kwargs.save_selection);
86 let deleted_disp = Self::acr_compute_deleted_disp_cols(&self.grid.disp_cols, &positions);
87 self.cr_del_cols(positions, &mut event_data)?;
88 self.cr_adjust_selections_after_col_delete(&deleted_disp);
89 self.cr_finalize_event(event_data, kwargs.undo, kwargs.emit)
90 }
91}
92
93