Skip to main content

tree_table/api/
add_rows.rs

1use alloc::{rc::Rc, string::String, vec, vec::Vec};
2use core::cell::RefCell;
3use hashbrown::HashSet;
4
5use crate::args::{AddArgs, AddNumArgs};
6use crate::utils::consecutive_ranges::consecutive_ranges_owned;
7use crate::{Change, EventData, NO_END, Table, str_err};
8
9impl Table {
10    /// Add new rows with the provided item ids to the Table.
11    pub fn add_rows(
12        &mut self,
13        kwargs: Option<AddArgs>,
14    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
15        let kwargs: AddArgs = kwargs.unwrap_or_default();
16        let event_data = self.cr_new_event(false);
17        let pos = if let Some(pos) = kwargs.pos {
18            pos as usize
19        } else {
20            Self::acr_total_rows(&self.grid.index.cells)
21        };
22        let iids = kwargs.items.unwrap_or(vec![self.grid.index.new_iid()?]);
23        let mut iid_set = HashSet::new();
24        for iid in &iids {
25            if !iid_set.insert(iid.clone()) {
26                return Err(str_err!("Duplicate row iid: {}", iid));
27            }
28            if self.grid.index.iid_to_row.get(iid.as_str()).is_some() {
29                return Err(str_err!("Row iid already exists: {}", iid));
30            }
31        }
32        self._add_rows(
33            iids,
34            pos,
35            kwargs.inherit,
36            kwargs.vis,
37            kwargs.select,
38            kwargs.undo,
39            kwargs.emit,
40            kwargs.save_selection,
41            event_data,
42        )
43    }
44
45    /// Add a number of new rows with auto-generated item ids to the Table.
46    pub fn add_num_rows(
47        &mut self,
48        kwargs: Option<AddNumArgs>,
49    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
50        let kwargs: AddNumArgs = kwargs.unwrap_or_default();
51        let event_data = self.cr_new_event(false);
52        let pos = if let Some(pos) = kwargs.pos {
53            pos as usize
54        } else {
55            Self::acr_total_rows(&self.grid.index.cells)
56        };
57        let num = kwargs.num.unwrap_or(1);
58        let iids: Vec<String> = (0..num)
59            .map(|_| self.grid.index.new_iid())
60            .collect::<Result<_, _>>()?;
61        self._add_rows(
62            iids,
63            pos,
64            kwargs.inherit,
65            kwargs.vis,
66            kwargs.select,
67            kwargs.undo,
68            kwargs.emit,
69            kwargs.save_selection,
70            event_data,
71        )
72    }
73
74    #[inline]
75    fn _add_rows(
76        &mut self,
77        iids: Vec<String>,
78        pos: usize,
79        inherit: String,
80        vis: bool,
81        select: bool,
82        undo: bool,
83        emit: bool,
84        save_selection: bool,
85        mut event_data: EventData,
86    ) -> Result<Option<Rc<RefCell<EventData>>>, String> {
87        let show_new_rows = self.acr_compute_new_rows_visibility(pos, vis);
88
89        let (index, sorted_seq) =
90            self.cr_add_rows_get_args(iids.clone(), pos, inherit.as_str(), show_new_rows)?;
91
92        let num_visible_added = if show_new_rows { sorted_seq.len() } else { 0 };
93        let disp_insert_pos = Self::acr_compute_disp_insert_pos(&self.grid.disp_rows, pos);
94
95        self.cr_add_rows(index, sorted_seq, &mut event_data, true, true)?;
96        self.acr_adjust_selections_after_row_insert(disp_insert_pos, num_visible_added);
97
98        if select {
99            Self::acr_deselect_all(
100                &mut self.sel,
101                if save_selection {
102                    Some(&mut event_data)
103                } else {
104                    None
105                },
106            );
107            for (start, end) in consecutive_ranges_owned(
108                event_data
109                    .changes
110                    .iter()
111                    .filter_map(|change| match change {
112                        Change::AddRows(added) => Some(added.iter()),
113                        _ => None,
114                    })
115                    .flatten()
116                    .filter_map(|n| Self::acr_data_to_disp_opt(&self.grid.disp_rows, *n)),
117            ) {
118                Self::acr_add_selection_box(&mut self.sel, &self.grid, start, end, 0, NO_END, true);
119            }
120            if save_selection {
121                event_data.changes.push(Change::add_selection_boxes(
122                    self.sel.selection_boxes.len(),
123                    None,
124                ));
125            }
126        }
127
128        self.cr_finalize_event(event_data, undo, emit)
129    }
130}