diff --git a/radicle-tui/src/ui/widget/common/container.rs b/radicle-tui/src/ui/widget/common/container.rs index 16653fd3..c8740be3 100644 --- a/radicle-tui/src/ui/widget/common/container.rs +++ b/radicle-tui/src/ui/widget/common/container.rs @@ -1,18 +1,19 @@ use tuirealm::command::{Cmd, CmdResult}; use tuirealm::props::{ - AttrValue, Attribute, BorderSides, BorderType, Color, PropPayload, PropValue, Props, Style, - TextModifiers, + AttrValue, Attribute, BorderSides, BorderType, Color, Props, Style, TextModifiers, }; use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect}; -use tuirealm::tui::widgets::{Block, Cell, Row}; +use tuirealm::tui::widgets::{Block, Row}; use tuirealm::{Frame, MockComponent, State, StateValue}; use crate::ui::ext::HeaderBlock; use crate::ui::layout; use crate::ui::state::TabState; +use crate::ui::theme::Theme; use crate::ui::widget::{Widget, WidgetComponent}; use super::label::Label; +use super::list::{Table, TableItem, TableModel}; /// Some user events need to be handled globally (e.g. user presses key `q` to quit /// the application). This component can be used in conjunction with SubEventClause @@ -127,47 +128,31 @@ impl WidgetComponent for Tabs { } /// A labeled container header. -#[derive(Default)] -pub struct Header; +pub struct Header +where + V: TableItem, +{ + model: TableModel, + theme: Theme, +} -impl Header { - fn content<'a>(spans: Vec) -> Row<'a> { - Row::new( - spans - .iter() - .map(|span| Cell::from(span.clone().unwrap_text_span().content)) - .collect::>(), - ) - } - - fn widths(widths: Vec) -> Vec { - widths - .iter() - .map(|prop| Constraint::Percentage(prop.clone().unwrap_u16())) - .collect() +impl Header +where + V: TableItem, +{ + pub fn new(model: TableModel, theme: Theme) -> Self { + Self { model, theme } } } -impl WidgetComponent for Header { +impl WidgetComponent for Header +where + V: TableItem + Clone, +{ fn view(&mut self, properties: &Props, frame: &mut Frame, area: Rect) { let display = properties .get_or(Attribute::Display, AttrValue::Flag(true)) .unwrap_flag(); - let content = properties - .get_or( - Attribute::Content, - AttrValue::Payload(PropPayload::Vec(vec![])), - ) - .unwrap_payload() - .unwrap_vec(); - let widths = properties - .get_or( - Attribute::Custom("widths"), - AttrValue::Payload(PropPayload::Vec(vec![])), - ) - .unwrap_payload() - .unwrap_vec(); - if display { let block = HeaderBlock::default() .borders(BorderSides::all()) @@ -182,11 +167,12 @@ impl WidgetComponent for Header { .horizontal_margin(1) .split(area); - let header = Self::content(content); - let widths = Self::widths(widths); + let widths = + Table::::widths(area, self.model.widths(), self.theme.tables.spacing); + let header: Row<'_> = Row::new(self.model.header(&self.theme)); let table = tuirealm::tui::widgets::Table::new(vec![]) - .column_spacing(3u16) + .column_spacing(self.theme.tables.spacing) .header(header) .widths(&widths); frame.render_widget(table, layout[0]); @@ -203,12 +189,12 @@ impl WidgetComponent for Header { } pub struct LabeledContainer { - header: Widget
, + header: Widget>, component: Box, } impl LabeledContainer { - pub fn new(header: Widget
, component: Box) -> Self { + pub fn new(header: Widget>, component: Box) -> Self { Self { header, component } } }