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