use crate::_private::NonExhaustive;
use crate::TableSelection;
use crate::derive::derive_table_widget_state;
use crate::event::{DoubleClickOutcome, TableOutcome};
use crate::table::TableState;
use rat_cursor::HasScreenCursor;
use rat_event::crossterm::event::Event;
use rat_event::{DoubleClick, HandleEvent, MouseOnly, Regular};
use rat_focus::{FocusBuilder, FocusFlag, HasFocus};
use rat_ftable::selection::{CellSelection, NoSelection, RowSelection, RowSetSelection};
use rat_reloc::RelocatableState;
use ratatui_core::layout::Rect;
use std::collections::HashSet;
pub struct TableVecState<T, Selection = RowSelection> {
pub table: TableState<Selection>,
pub data: Vec<T>,
pub non_exhaustive: NonExhaustive,
}
impl<T, Selection: Default> Default for TableVecState<T, Selection> {
fn default() -> Self {
Self {
table: TableState::default(),
data: Default::default(),
non_exhaustive: NonExhaustive,
}
}
}
impl<T: Clone, Selection: Clone> Clone for TableVecState<T, Selection> {
fn clone(&self) -> Self {
Self {
table: self.table.clone(),
data: self.data.clone(),
non_exhaustive: NonExhaustive,
}
}
}
impl<T, Selection> HasFocus for TableVecState<T, Selection> {
fn build(&self, builder: &mut FocusBuilder) {
builder.leaf_widget(self);
}
#[inline]
fn focus(&self) -> FocusFlag {
self.table.focus.clone()
}
#[inline]
fn area(&self) -> Rect {
self.table.area
}
}
impl<T, Selection> HasScreenCursor for TableVecState<T, Selection> {
fn screen_cursor(&self) -> Option<(u16, u16)> {
None
}
}
impl<T, Selection> RelocatableState for TableVecState<T, Selection> {
fn relocate(&mut self, shift: (i16, i16), clip: Rect) {
self.table.relocate(shift, clip);
}
}
impl<T, Selection> TableVecState<T, Selection>
where
Selection: Default,
{
pub fn new() -> Self {
Self::default()
}
pub fn named(name: &str) -> Self {
Self {
table: TableState::named(name),
..Self::default()
}
}
pub fn with(mut self, data: impl IntoIterator<Item = T>) -> Self {
self.data.extend(data.into_iter());
self
}
}
impl<T, Selection> TableVecState<T, Selection> {
derive_table_widget_state!(BASE);
}
impl<T, Selection> TableVecState<T, Selection> {
derive_table_widget_state!(AREAS);
}
impl<T, Selection: TableSelection> TableVecState<T, Selection> {
derive_table_widget_state!(OFFSET);
}
impl<T, Selection: TableSelection> TableVecState<T, Selection> {
derive_table_widget_state!(SELECTION);
}
impl<T, Selection: TableSelection> TableVecState<T, Selection> {
#[inline]
pub fn clear(&mut self) {
self.table.clear_offset();
self.table.clear_selection();
self.data.clear();
}
#[inline]
pub fn rows_changed(&mut self) {
self.table.rows_changed(self.data.len());
}
#[inline]
pub fn set_value(&mut self, data: Vec<T>) {
self.data = data;
self.table.rows_changed(self.data.len());
}
#[inline]
pub fn value(&self) -> &Vec<T> {
&self.data
}
#[inline]
pub fn append_row(&mut self, value: T) {
let n = self.data.len();
self.data.push(value);
self.table.items_added(n, 1);
}
#[inline]
pub fn insert_row(&mut self, row: usize, value: T) {
self.data.insert(row, value);
self.table.items_added(row, 1);
}
#[inline]
pub fn remove_row(&mut self, row: usize) -> T {
let r = self.data.remove(row);
self.table.items_removed(row, 1);
r
}
}
impl<T> TableVecState<T, RowSelection> {
derive_table_widget_state!(ROWSELECTION);
}
impl<T> TableVecState<T, RowSetSelection> {
derive_table_widget_state!(ROWSETSELECTION);
}
impl<T> TableVecState<T, CellSelection> {
derive_table_widget_state!(CELLSELECTION);
}
impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, CellSelection> {
fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
self.table.handle(event, Regular)
}
}
impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, CellSelection> {
fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
self.table.handle(event, MouseOnly)
}
}
impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, NoSelection> {
fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
self.table.handle(event, Regular)
}
}
impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, NoSelection> {
fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
self.table.handle(event, MouseOnly)
}
}
impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, RowSelection> {
fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
self.table.handle(event, Regular)
}
}
impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, RowSelection> {
fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
self.table.handle(event, MouseOnly)
}
}
impl<T> HandleEvent<Event, Regular, TableOutcome> for TableVecState<T, RowSetSelection> {
fn handle(&mut self, event: &Event, _: Regular) -> TableOutcome {
self.table.handle(event, Regular)
}
}
impl<T> HandleEvent<Event, MouseOnly, TableOutcome> for TableVecState<T, RowSetSelection> {
fn handle(&mut self, event: &Event, _: MouseOnly) -> TableOutcome {
self.table.handle(event, MouseOnly)
}
}
impl<T, Selection> HandleEvent<Event, DoubleClick, DoubleClickOutcome>
for TableVecState<T, Selection>
{
fn handle(&mut self, event: &Event, _keymap: DoubleClick) -> DoubleClickOutcome {
self.table.handle(event, DoubleClick)
}
}