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