Struct rat_ftable::FTable
source · pub struct FTable<'a, Selection> { /* private fields */ }Expand description
FTable widget.
Can be used like a ratatui::Table, but the benefits only show if you use FTable::data to set the table data.
See FTable::data for a sample.
Implementations§
source§impl<'a, Selection> FTable<'a, Selection>
impl<'a, Selection> FTable<'a, Selection>
sourcepub fn new<R, C>(rows: R, widths: C) -> Selfwhere
R: IntoIterator,
R::Item: Into<Row<'a>>,
C: IntoIterator,
C::Item: Into<Constraint>,
Selection: Default,
pub fn new<R, C>(rows: R, widths: C) -> Selfwhere
R: IntoIterator,
R::Item: Into<Row<'a>>,
C: IntoIterator,
C::Item: Into<Constraint>,
Selection: Default,
Create a new FTable with preformatted data. For compatibility with ratatui.
Use of FTable::data is preferred.
sourcepub fn rows<T>(self, rows: T) -> Selfwhere
T: IntoIterator<Item = Row<'a>>,
pub fn rows<T>(self, rows: T) -> Selfwhere
T: IntoIterator<Item = Row<'a>>,
Set preformatted row-data. For compatibility with ratatui.
Use of FTable::data is preferred.
sourcepub fn data(self, data: &'a dyn TableData<'a>) -> Self
pub fn data(self, data: &'a dyn TableData<'a>) -> Self
Set a reference to the TableData facade to your data.
The way to go is to define a small struct that contains just a reference to your data. Then implement TableData for this struct.
use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::prelude::Style;
use ratatui::text::Span;
use ratatui::widgets::Widget;
use rat_ftable::{FTable, FTableState, TableData};
struct Data1<'a>(&'a [SampleRow]);
impl<'a> TableData<'a> for Data1<'a> {
// returns (cols, rows)
fn size(&self) -> (usize, usize) {
(5, self.0.len())
}
fn row_height(&self, row: usize) -> u16 {
// to some calculations ...
1
}
fn row_style(&self, row: usize) -> Style {
// to some calculations ...
Style::default()
}
fn render_cell(&self, column: usize, row: usize, area: Rect, buf: &mut Buffer) {
if let Some(data) = self.0.get(row) {
let rend = match column {
0 => Span::from("column1"),
1 => Span::from("column2"),
2 => Span::from("column3"),
_ => return
};
rend.render(area, buf);
}
}
}
// When you are creating the table widget you hand over a reference
// to the facade struct.
let my_data_somewhere_else = vec![SampleRow;999999];
let mut table_state_somewhere_else = FTableState::default();
// ...
let tabledata1 = Data1(&my_data_somewhere_else);
let table1 = FTable::default().data(&tabledata1);
table1.render(area, buf, &mut table_state_somewhere_else);sourcepub fn iter(self, data: &'a mut dyn TableDataIter<'a>) -> Self
pub fn iter(self, data: &'a mut dyn TableDataIter<'a>) -> Self
Alternative representation for the data as a kind of Iterator. It uses interior iteration, which fits quite nice for this and avoids handing out lifetime bound results of the actual iterator. Which is a bit nightmarish to get right.
Caution: If you can’t give the number of rows, the table will iterate over all the data.
use std::iter::{Enumerate};
use std::slice::Iter;
use format_num_pattern::NumberFormat;
use ratatui::buffer::Buffer;
use ratatui::layout::{Constraint, Rect};
use ratatui::prelude::Color;
use ratatui::style::{Style, Stylize};
use ratatui::text::Span;
use ratatui::widgets::Widget;
use rat_ftable::{FTable, TableDataIter};
struct Data {
table_data: Vec<Sample>
}
struct Sample {
pub text: String
}
let data = Data {
table_data: vec![],
};
struct RowIter1<'a> {
iter: Enumerate<Iter<'a, Sample>>,
item: Option<(usize, &'a Sample)>,
}
impl<'a> TableDataIter<'a> for RowIter1<'a> {
fn rows(&self) -> Option<usize> {
// If you can, give the length. Otherwise,
// the table will iterate all to find out a length.
None
// Some(100_000)
}
/// Select the nth element from the current position.
fn nth(&mut self, n: usize) -> bool {
self.item = self.iter.nth(n);
self.item.is_some()
}
/// Select the next element.
fn next(&mut self) -> bool {
self.item = self.iter.next();
self.item.is_some()
}
/// Row height.
fn row_height(&self) -> u16 {
1
}
/// Row style.
fn row_style(&self) -> Style {
Style::default()
}
/// Render one cell.
fn render_cell(&self, column: usize, area: Rect, buf: &mut Buffer) {
let row = self.item.expect("data");
match column {
0 => {
let row_fmt = NumberFormat::new("000000").expect("fmt");
let span = Span::from(row_fmt.fmt_u(row.0));
buf.set_style(area, Style::new().black().bg(Color::from_u32(0xe7c787)));
span.render(area, buf);
}
1 => {
let span = Span::from(&row.1.text);
span.render(area, buf);
}
_ => {}
}
}
}
let mut rit = RowIter1 {
iter: data.table_data.iter().enumerate(),
item: None,
};
let table1 = FTable::default()
.iter(&mut rit)
.widths([
Constraint::Length(6),
Constraint::Length(20)
]);
// table1.render(area, buf);Set the table-footer.
sourcepub fn column_spacing(self, spacing: u16) -> Self
pub fn column_spacing(self, spacing: u16) -> Self
Spacing between columns.
sourcepub fn layout_width(self, width: u16) -> Self
pub fn layout_width(self, width: u16) -> Self
Overrides the width of the rendering area for layout purposes. Layout uses this width, even if it means that some columns are not visible.
sourcepub fn styles(self, styles: FTableStyle) -> Self
pub fn styles(self, styles: FTableStyle) -> Self
Set all styles as a bundle.
sourcepub fn select_row_style<S: Into<Style>>(self, select_style: S) -> Self
pub fn select_row_style<S: Into<Style>>(self, select_style: S) -> Self
Style for a selected row. The chosen selection must support row-selection for this to take effect.
sourcepub fn select_column_style<S: Into<Style>>(self, select_style: S) -> Self
pub fn select_column_style<S: Into<Style>>(self, select_style: S) -> Self
Style for a selected column. The chosen selection must support column-selection for this to take effect.
sourcepub fn select_cell_style<S: Into<Style>>(self, select_style: S) -> Self
pub fn select_cell_style<S: Into<Style>>(self, select_style: S) -> Self
Style for a selected cell. The chosen selection must support cell-selection for this to take effect.
sourcepub fn select_header_style<S: Into<Style>>(self, select_style: S) -> Self
pub fn select_header_style<S: Into<Style>>(self, select_style: S) -> Self
Style for a selected header cell. The chosen selection must support column-selection for this to take effect.
Style for a selected footer cell. The chosen selection must support column-selection for this to take effect.
sourcepub fn focus_style<S: Into<Style>>(self, focus_style: S) -> Self
pub fn focus_style<S: Into<Style>>(self, focus_style: S) -> Self
This style will be patched onto the selection to indicate that the widget has the input focus.
The selection must support some kind of selection for this to be effective.
Trait Implementations§
source§impl<'a, Selection> StatefulWidget for FTable<'a, Selection>where
Selection: TableSelection,
impl<'a, Selection> StatefulWidget for FTable<'a, Selection>where
Selection: TableSelection,
Auto Trait Implementations§
impl<'a, Selection> Freeze for FTable<'a, Selection>
impl<'a, Selection> !RefUnwindSafe for FTable<'a, Selection>
impl<'a, Selection> !Send for FTable<'a, Selection>
impl<'a, Selection> !Sync for FTable<'a, Selection>
impl<'a, Selection> Unpin for FTable<'a, Selection>where
Selection: Unpin,
impl<'a, Selection> !UnwindSafe for FTable<'a, Selection>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
impl<'a, T, U> Stylize<'a, T> for Uwhere
U: Styled<Item = T>,
fn bg(self, color: Color) -> T
fn fg<S>(self, color: S) -> T
fn add_modifier(self, modifier: Modifier) -> T
fn remove_modifier(self, modifier: Modifier) -> T
fn reset(self) -> T
source§fn on_magenta(self) -> T
fn on_magenta(self) -> T
magenta.source§fn on_dark_gray(self) -> T
fn on_dark_gray(self) -> T
dark_gray.source§fn on_light_red(self) -> T
fn on_light_red(self) -> T
light_red.source§fn light_green(self) -> T
fn light_green(self) -> T
light_green.source§fn on_light_green(self) -> T
fn on_light_green(self) -> T
light_green.source§fn light_yellow(self) -> T
fn light_yellow(self) -> T
light_yellow.source§fn on_light_yellow(self) -> T
fn on_light_yellow(self) -> T
light_yellow.source§fn light_blue(self) -> T
fn light_blue(self) -> T
light_blue.source§fn on_light_blue(self) -> T
fn on_light_blue(self) -> T
light_blue.source§fn light_magenta(self) -> T
fn light_magenta(self) -> T
light_magenta.source§fn on_light_magenta(self) -> T
fn on_light_magenta(self) -> T
light_magenta.source§fn light_cyan(self) -> T
fn light_cyan(self) -> T
light_cyan.source§fn on_light_cyan(self) -> T
fn on_light_cyan(self) -> T
light_cyan.source§fn not_italic(self) -> T
fn not_italic(self) -> T
ITALIC modifier.source§fn underlined(self) -> T
fn underlined(self) -> T
UNDERLINED modifier.source§fn not_underlined(self) -> T
fn not_underlined(self) -> T
UNDERLINED modifier.source§fn slow_blink(self) -> T
fn slow_blink(self) -> T
SLOW_BLINK modifier.source§fn not_slow_blink(self) -> T
fn not_slow_blink(self) -> T
SLOW_BLINK modifier.source§fn rapid_blink(self) -> T
fn rapid_blink(self) -> T
RAPID_BLINK modifier.source§fn not_rapid_blink(self) -> T
fn not_rapid_blink(self) -> T
RAPID_BLINK modifier.source§fn not_reversed(self) -> T
fn not_reversed(self) -> T
REVERSED modifier.HIDDEN modifier.HIDDEN modifier.source§fn crossed_out(self) -> T
fn crossed_out(self) -> T
CROSSED_OUT modifier.source§fn not_crossed_out(self) -> T
fn not_crossed_out(self) -> T
CROSSED_OUT modifier.