use std::cell::{Cell, RefCell};
use std::rc::Rc;
use crate::geometry::Rect;
use super::config::{CellPainter, RowPredicate, RowsProvider, TableRows};
#[derive(Clone)]
pub(crate) struct TableState {
pub(crate) rows: Rc<RefCell<TableRows>>,
pub(crate) rows_provider: Rc<RefCell<Option<RowsProvider>>>,
pub(crate) content_w: Rc<Cell<f64>>,
pub(crate) h_offset: Rc<Cell<f64>>,
pub(crate) resizable: Rc<Cell<bool>>,
pub(crate) striped: Rc<Cell<bool>>,
pub(crate) overline_pred: Rc<RefCell<Option<RowPredicate>>>,
pub(crate) sense_click: Rc<Cell<bool>>,
pub(crate) selection_pred: Rc<RefCell<Option<RowPredicate>>>,
pub(crate) widths: Rc<RefCell<Vec<f64>>>,
pub(crate) column_overrides: Rc<RefCell<Vec<Option<f64>>>>,
pub(crate) viewport_cell: Rc<Cell<Rect>>,
pub(crate) scroll_offset: Rc<Cell<f64>>,
pub(crate) scroll_to_row: Rc<Cell<Option<usize>>>,
pub(crate) cell_painter: Rc<RefCell<Option<CellPainter>>>,
pub(crate) on_row_click: Rc<RefCell<Option<Box<dyn FnMut(usize, usize)>>>>,
pub(crate) hovered_row: Rc<Cell<Option<usize>>>,
}
impl TableState {
pub(crate) fn defaults() -> Self {
Self {
rows: Rc::new(RefCell::new(TableRows::Homogeneous {
count: 0,
height: 18.0,
})),
rows_provider: Rc::new(RefCell::new(None)),
content_w: Rc::new(Cell::new(0.0)),
h_offset: Rc::new(Cell::new(0.0)),
resizable: Rc::new(Cell::new(true)),
striped: Rc::new(Cell::new(false)),
overline_pred: Rc::new(RefCell::new(None)),
sense_click: Rc::new(Cell::new(false)),
selection_pred: Rc::new(RefCell::new(None)),
widths: Rc::new(RefCell::new(Vec::new())),
column_overrides: Rc::new(RefCell::new(Vec::new())),
viewport_cell: Rc::new(Cell::new(Rect::default())),
scroll_offset: Rc::new(Cell::new(0.0)),
scroll_to_row: Rc::new(Cell::new(None)),
cell_painter: Rc::new(RefCell::new(None)),
on_row_click: Rc::new(RefCell::new(None)),
hovered_row: Rc::new(Cell::new(None)),
}
}
}