Skip to main content

tree_table/api/
del_rows.rs

1use 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    /// Delete rows from the table.
13    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    /// Delete rows from the table using data positions (indices).
62    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}