diff --git a/bin/commands/inbox/list.rs b/bin/commands/inbox/list.rs index b55e8b7a..2e422494 100644 --- a/bin/commands/inbox/list.rs +++ b/bin/commands/inbox/list.rs @@ -3,6 +3,7 @@ use std::sync::{Arc, Mutex}; use anyhow::Result; +use radicle_tui::ui::Spacing; use termion::event::Key; use ratatui::layout::Constraint; @@ -363,7 +364,12 @@ impl App { Layout::vertical([Constraint::Length(3), Constraint::Min(1)]), Some(1), |ui| { - ui.column_bar(frame, header.to_vec(), Some(Borders::Top)); + ui.column_bar( + frame, + header.to_vec(), + Spacing::default(), + Some(Borders::Top), + ); let table = ui.table( frame, @@ -544,7 +550,7 @@ impl App { } }; - ui.column_bar(frame, context, Some(Borders::None)); + ui.column_bar(frame, context, Spacing::from(0), Some(Borders::None)); } pub fn show_browser_shortcuts(&self, frame: &mut Frame, ui: &mut im::Ui) { @@ -580,6 +586,7 @@ impl App { Constraint::Fill(1), )] .to_vec(), + Spacing::from(0), Some(Borders::All), ); }, @@ -594,6 +601,7 @@ impl App { ui.column_bar( frame, [Column::new(Span::raw(" Help ").bold(), Constraint::Fill(1))].to_vec(), + Spacing::from(0), Some(Borders::Top), ); @@ -631,6 +639,7 @@ impl App { ), ] .to_vec(), + Spacing::from(0), Some(Borders::None), ); } diff --git a/bin/commands/patch/list.rs b/bin/commands/patch/list.rs index 43479891..3b7aefa5 100644 --- a/bin/commands/patch/list.rs +++ b/bin/commands/patch/list.rs @@ -22,8 +22,7 @@ use tui::ui::im; use tui::ui::im::widget::{PanesState, TableState, TextEditState, TextViewState, Window}; use tui::ui::im::Borders; use tui::ui::im::Show; -use tui::ui::BufferedValue; -use tui::ui::Column; +use tui::ui::{BufferedValue, Column, Spacing}; use tui::{Channel, Exit}; type Selection = tui::Selection; @@ -346,7 +345,12 @@ impl App { Layout::vertical([Constraint::Length(3), Constraint::Min(1)]), Some(1), |ui| { - ui.column_bar(frame, header.to_vec(), Some(Borders::Top)); + ui.column_bar( + frame, + header.to_vec(), + Spacing::default(), + Some(Borders::Top), + ); let table = ui.table( frame, @@ -569,7 +573,7 @@ impl App { } }; - ui.column_bar(frame, context, Some(Borders::None)); + ui.column_bar(frame, context, Spacing::from(0), Some(Borders::None)); } pub fn show_browser_shortcuts(&self, frame: &mut Frame, ui: &mut im::Ui) { @@ -595,6 +599,7 @@ impl App { ui.column_bar( frame, [Column::new(Span::raw(" Help ").bold(), Constraint::Fill(1))].to_vec(), + Spacing::from(0), Some(Borders::Top), ); @@ -632,6 +637,7 @@ impl App { ), ] .to_vec(), + Spacing::from(0), Some(Borders::None), ); } diff --git a/bin/commands/patch/review.rs b/bin/commands/patch/review.rs index 404b1a98..c63a2a5d 100644 --- a/bin/commands/patch/review.rs +++ b/bin/commands/patch/review.rs @@ -27,7 +27,7 @@ use tui::task::EmptyProcessors; use tui::ui::im::widget::{PanesState, TableState, TextViewState, Window}; use tui::ui::im::{Borders, Context, Show, Ui}; use tui::ui::span; -use tui::ui::Column; +use tui::ui::{Column, Spacing}; use tui::{Channel, Exit}; use crate::git::HunkState; @@ -342,7 +342,12 @@ impl App<'_> { Layout::vertical([Constraint::Length(3), Constraint::Min(1)]), Some(1), |ui| { - ui.column_bar(frame, header.to_vec(), Some(Borders::Top)); + ui.column_bar( + frame, + header.to_vec(), + Spacing::default(), + Some(Borders::Top), + ); let table = ui.table( frame, @@ -375,7 +380,12 @@ impl App<'_> { .unwrap_or_default(); ui.container(layout::container(), 1, |ui| { - ui.column_bar(frame, hunk.inner().header(), Some(Borders::Top)); + ui.column_bar( + frame, + hunk.inner().header(), + Spacing::from(0), + Some(Borders::Top), + ); if let Some(text) = hunk.inner().hunk_text() { let diff = ui.text_view(frame, text, &mut cursor, Some(Borders::BottomSides)); @@ -458,6 +468,7 @@ impl App<'_> { ), ] .to_vec(), + Spacing::from(0), Some(Borders::None), ); } @@ -541,7 +552,7 @@ impl Show for App<'_> { }; let header = [Column::new(" Help ", Constraint::Fill(1))].to_vec(); - ui.column_bar(frame, header, Some(Borders::Top)); + ui.column_bar(frame, header, Spacing::from(0), Some(Borders::Top)); let help = ui.text_view( frame, help_text().to_string(), diff --git a/bin/ui/im.rs b/bin/ui/im.rs index 129fc0f5..25216909 100644 --- a/bin/ui/im.rs +++ b/bin/ui/im.rs @@ -1,3 +1,4 @@ +use radicle_tui::ui::Spacing; use termion::event::Key; use ratatui::layout::{Constraint, Layout}; @@ -124,7 +125,12 @@ where ]), Some(1), |ui| { - ui.column_bar(frame, self.header.clone().to_vec(), Some(Borders::Top)); + ui.column_bar( + frame, + self.header.clone().to_vec(), + Spacing::default(), + Some(Borders::Top), + ); let table = ui.table( frame, @@ -151,7 +157,12 @@ where self.search.write(TextEditState { text, cursor }); response.changed |= text_edit.changed; } else { - ui.column_bar(frame, self.footer.clone().to_vec(), Some(Borders::Bottom)); + ui.column_bar( + frame, + self.footer.clone().to_vec(), + Spacing::from(0), + Some(Borders::Bottom), + ); } }, ); diff --git a/examples/selection.rs b/examples/selection.rs index e6e5c295..93948904 100644 --- a/examples/selection.rs +++ b/examples/selection.rs @@ -2,6 +2,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use anyhow::Result; +use radicle_tui::ui::Spacing; use termion::event::Key; use ratatui::layout::{Constraint, Layout}; @@ -96,7 +97,12 @@ impl Show for App { .to_vec(); let mut selected = self.selector.selected(); - ui.column_bar(frame, columns.clone(), Some(Borders::None)); + ui.column_bar( + frame, + columns.clone(), + Spacing::default(), + Some(Borders::None), + ); let table = ui.table( frame, diff --git a/src/ui.rs b/src/ui.rs index 267acdd7..de3c1cc5 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -95,6 +95,26 @@ impl<'a> Column<'a> { } } +pub struct Spacing(u16); + +impl From for Spacing { + fn from(value: u16) -> Self { + Self(value) + } +} + +impl Default for Spacing { + fn default() -> Self { + Self(0) + } +} + +impl From for u16 { + fn from(spacing: Spacing) -> Self { + spacing.0 + } +} + /// Needs to be implemented for items that are supposed to be rendered in tables. pub trait ToRow { fn to_row(&self) -> [Cell; W]; diff --git a/src/ui/im.rs b/src/ui/im.rs index 31934c83..08ba5602 100644 --- a/src/ui/im.rs +++ b/src/ui/im.rs @@ -21,7 +21,7 @@ use crate::event::Event; use crate::store::Update; use crate::terminal::Terminal; use crate::ui::theme::Theme; -use crate::ui::{Column, ToRow}; +use crate::ui::{Column, Spacing, ToRow}; use crate::Interrupted; use crate::ui::im::widget::Widget; @@ -574,9 +574,10 @@ where &mut self, frame: &mut Frame, columns: Vec>, + spacing: Spacing, borders: Option, ) -> Response { - widget::ColumnBar::new(columns, borders).ui(self, frame) + widget::ColumnBar::new(columns, spacing, borders).ui(self, frame) } pub fn text_view<'a>( diff --git a/src/ui/im/widget.rs b/src/ui/im/widget.rs index 6c5ffa5e..276aed19 100644 --- a/src/ui/im/widget.rs +++ b/src/ui/im/widget.rs @@ -11,7 +11,7 @@ use termion::event::Key; use crate::ui::ext::{FooterBlock, FooterBlockType, HeaderBlock}; use crate::ui::theme::style; -use crate::ui::{layout, span}; +use crate::ui::{layout, span, Spacing}; use crate::ui::{Column, ToRow}; use super::{Borders, Context, InnerResponse, Response, Ui}; @@ -533,12 +533,17 @@ where pub struct ColumnBar<'a> { columns: Vec>, + spacing: Spacing, borders: Option, } impl<'a> ColumnBar<'a> { - pub fn new(columns: Vec>, borders: Option) -> Self { - Self { columns, borders } + pub fn new(columns: Vec>, spacing: Spacing, borders: Option) -> Self { + Self { + columns, + spacing, + borders, + } } } @@ -581,7 +586,7 @@ impl Widget for ColumnBar<'_> { .collect::>(); let table = ratatui::widgets::Table::default() - .column_spacing(1) + .column_spacing(self.spacing.into()) .rows([Row::new(cells)]) .widths(widths); frame.render_widget(table, area);