From 26f52eb29ee129f2157f0c8ad078376a50e0464c Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Thu, 22 Aug 2024 13:59:33 +0200 Subject: [PATCH] lib: Add columns widget to imUI --- src/im.rs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/im.rs b/src/im.rs index e339a437..86d61642 100644 --- a/src/im.rs +++ b/src/im.rs @@ -315,6 +315,15 @@ impl Ui { widget::Shortcuts::new(shortcuts, divider).ui(self, frame) } + pub fn columns<'a>( + &mut self, + frame: &mut Frame, + columns: Vec>, + border: Option, + ) -> Response { + widget::Columns::new(columns, border).ui(self, frame) + } + pub fn text_view( &mut self, frame: &mut Frame, @@ -669,6 +678,57 @@ pub mod widget { } } + pub struct Columns<'a> { + columns: Vec>, + border: Option, + } + + impl<'a> Columns<'a> { + pub fn new(columns: Vec>, border: Option) -> Self { + Self { columns, border } + } + } + + impl<'a> Widget for Columns<'a> { + fn ui(self, ui: &mut Ui, frame: &mut Frame) -> Response { + let area = ui.next_area().unwrap_or_default(); + let area = render_block(frame, area, self.border, ui.theme.border_style); + + let widths = self + .columns + .iter() + .map(|c| match c.width { + Constraint::Min(min) => Constraint::Length(min.saturating_add(3)), + _ => c.width, + }) + .collect::>(); + + // let layout = Layout::horizontal(widths).split(area); + // let cells = self + // .columns + // .iter() + // .map(|c| c.text.clone()) + // .zip(layout.iter()) + // .collect::>(); + + // let last = cells.len().saturating_sub(1); + // let len = cells.len(); + + let cells = self + .columns + .iter() + .map(|c| c.text.clone()) + .collect::>(); + + let table = ratatui::widgets::Table::default() + .header(Row::new(cells)) + .widths(widths); + frame.render_widget(table, area); + + Response::default() + } + } + pub struct TextView { text: String, border: Option,