Skip to main content

rat_ftable2/vec/
state.rs

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
15/// State for [TableVec][crate::TableVec].
16pub 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    /// Populate the table-data.
87    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
101// Offset related.
102impl<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    /// Clear
112    #[inline]
113    pub fn clear(&mut self) {
114        self.table.clear_offset();
115        self.table.clear_selection();
116        self.data.clear();
117    }
118
119    /// Data-vec changed.
120    #[inline]
121    pub fn rows_changed(&mut self) {
122        self.table.rows_changed(self.data.len());
123    }
124
125    /// Set the data-vec.
126    #[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    /// Get the table data.
133    #[inline]
134    pub fn value(&self) -> &Vec<T> {
135        &self.data
136    }
137
138    /// Add a row to the internal data-vec.
139    #[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    /// Insert a row to the internal data-vec.
147    #[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    /// Remove a row from the internal data-vec.
154    #[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    ///   Handles double-click events on the table.
226    fn handle(&mut self, event: &Event, _keymap: DoubleClick) -> DoubleClickOutcome {
227        self.table.handle(event, DoubleClick)
228    }
229}