1use crate::_private::NonExhaustive;
2use crate::TableSelection;
3use crate::derive::derive_table_widget_state;
4use crate::event::{DoubleClickOutcome, TableOutcome};
5use crate::table::TableState;
6use rat_cursor::HasScreenCursor;
7use rat_event::crossterm::event::Event;
8use rat_event::{DoubleClick, HandleEvent, MouseOnly, Regular};
9use rat_focus::{FocusBuilder, FocusFlag, HasFocus};
10use rat_ftable::selection::{CellSelection, NoSelection, RowSelection, RowSetSelection};
11use rat_reloc::RelocatableState;
12use ratatui_core::layout::Rect;
13use std::collections::HashSet;
14
15pub struct TableVecState<T, Selection = RowSelection> {
17 pub table: TableState<Selection>,
18 pub data: Vec<T>,
19
20 pub non_exhaustive: NonExhaustive,
21}
22
23impl<T, Selection: Default> Default for TableVecState<T, Selection> {
24 fn default() -> Self {
25 Self {
26 table: TableState::default(),
27 data: Default::default(),
28 non_exhaustive: NonExhaustive,
29 }
30 }
31}
32
33impl<T: Clone, Selection: Clone> Clone for TableVecState<T, Selection> {
34 fn clone(&self) -> Self {
35 Self {
36 table: self.table.clone(),
37 data: self.data.clone(),
38 non_exhaustive: NonExhaustive,
39 }
40 }
41}
42
43impl<T, Selection> HasFocus for TableVecState<T, Selection> {
44 fn build(&self, builder: &mut FocusBuilder) {
45 builder.leaf_widget(self);
46 }
47
48 #[inline]
49 fn focus(&self) -> FocusFlag {
50 self.table.focus.clone()
51 }
52
53 #[inline]
54 fn area(&self) -> Rect {
55 self.table.area
56 }
57}
58
59impl<T, Selection> HasScreenCursor for TableVecState<T, Selection> {
60 fn screen_cursor(&self) -> Option<(u16, u16)> {
61 None
62 }
63}
64
65impl<T, Selection> RelocatableState for TableVecState<T, Selection> {
66 fn relocate(&mut self, shift: (i16, i16), clip: Rect) {
67 self.table.relocate(shift, clip);
68 }
69}
70
71impl<T, Selection> TableVecState<T, Selection>
72where
73 Selection: Default,
74{
75 pub fn new() -> Self {
76 Self::default()
77 }
78
79 pub fn named(name: &str) -> Self {
80 Self {
81 table: TableState::named(name),
82 ..Self::default()
83 }
84 }
85
86 pub fn with(mut self, data: impl IntoIterator<Item = T>) -> Self {
88 self.data.extend(data.into_iter());
89 self
90 }
91}
92
93impl<T, Selection> TableVecState<T, Selection> {
94 derive_table_widget_state!(BASE);
95}
96
97impl<T, Selection> TableVecState<T, Selection> {
98 derive_table_widget_state!(AREAS);
99}
100
101impl<T, Selection: TableSelection> TableVecState<T, Selection> {
103 derive_table_widget_state!(OFFSET);
104}
105
106impl<T, Selection: TableSelection> TableVecState<T, Selection> {
107 derive_table_widget_state!(SELECTION);
108}
109
110impl<T, Selection: TableSelection> TableVecState<T, Selection> {
111 #[inline]
113 pub fn clear(&mut self) {
114 self.table.clear_offset();
115 self.table.clear_selection();
116 self.data.clear();
117 }
118
119 #[inline]
121 pub fn rows_changed(&mut self) {
122 self.table.rows_changed(self.data.len());
123 }
124
125 #[inline]
127 pub fn set_value(&mut self, data: Vec<T>) {
128 self.data = data;
129 self.table.rows_changed(self.data.len());
130 }
131
132 #[inline]
134 pub fn value(&self) -> &Vec<T> {
135 &self.data
136 }
137
138 #[inline]
140 pub fn append_row(&mut self, value: T) {
141 let n = self.data.len();
142 self.data.push(value);
143 self.table.items_added(n, 1);
144 }
145
146 #[inline]
148 pub fn insert_row(&mut self, row: usize, value: T) {
149 self.data.insert(row, value);
150 self.table.items_added(row, 1);
151 }
152
153 #[inline]
155 pub fn remove_row(&mut self, row: usize) -> T {
156 let r = self.data.remove(row);
157 self.table.items_removed(row, 1);
158 r
159 }
160}
161
162impl<T> TableVecState<T, RowSelection> {
163 derive_table_widget_state!(ROWSELECTION);
164}
165
166impl<T> TableVecState<T, RowSetSelection> {
167 derive_table_widget_state!(ROWSETSELECTION);
168}
169
170impl<T> TableVecState<T, CellSelection> {
171 derive_table_widget_state!(CELLSELECTION);
172}
173
174impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, CellSelection> {
175 fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
176 self.table.handle(event, Regular)
177 }
178}
179
180impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, CellSelection> {
181 fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
182 self.table.handle(event, MouseOnly)
183 }
184}
185
186impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, NoSelection> {
187 fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
188 self.table.handle(event, Regular)
189 }
190}
191
192impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, NoSelection> {
193 fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
194 self.table.handle(event, MouseOnly)
195 }
196}
197
198impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, RowSelection> {
199 fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
200 self.table.handle(event, Regular)
201 }
202}
203
204impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, RowSelection> {
205 fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
206 self.table.handle(event, MouseOnly)
207 }
208}
209
210impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, RowSetSelection> {
211 fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
212 self.table.handle(event, Regular)
213 }
214}
215
216impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, RowSetSelection> {
217 fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
218 self.table.handle(event, MouseOnly)
219 }
220}
221
222impl<T, Selection> HandleEvent<Event, DoubleClick, DoubleClickOutcome>
223 for TableVecState<T, Selection>
224{
225 fn handle(&mut self, event: &Event, _keymap: DoubleClick) -> DoubleClickOutcome {
227 self.table.handle(event, DoubleClick)
228 }
229}