lib: UI improvements

This commit is contained in:
Erik Kundt
2024-01-15 15:33:26 +01:00
parent 48b7bb4c05
commit 3d5e2c3121
5 changed files with 83 additions and 71 deletions
+11 -11
View File
@@ -48,24 +48,24 @@ pub fn browse_context(context: &Context, _theme: &Theme, progress: Progress) ->
}
}
let context = label::badge(" Patches ");
let divider = label::default_reversed(" | ");
let context = label::default("");
let divider = label::default(" | ");
let draft_n = label::default(&format!("{draft}")).style(style::gray_default_reversed());
let draft = label::default_reversed(" Draft");
let draft_n = label::default(&format!("{draft}")).style(style::gray_dim());
let draft = label::default(" Draft");
let open_n = label::default(&format!("{open}")).style(style::green_default_reversed());
let open = label::default_reversed(" Open");
let open_n = label::default(&format!("{open}")).style(style::green());
let open = label::default(" Open");
let archived_n = label::default(&format!("{archived}")).style(style::yellow_default_reversed());
let archived = label::default_reversed(" Archived");
let archived_n = label::default(&format!("{archived}")).style(style::yellow());
let archived = label::default(" Archived");
let merged_n = label::default(&format!("{merged}")).style(style::cyan_default_reversed());
let merged = label::default_reversed(" Merged ");
let merged_n = label::default(&format!("{merged}")).style(style::cyan());
let merged = label::default(" Merged ");
let progress =
label::default(&format!(" {} ", progress.to_string())).style(style::magenta_reversed());
let spacer = label::default_reversed("");
let spacer = label::default("");
let context_bar = ContextBar::new(
label::group(&[context]),
+45 -25
View File
@@ -144,36 +144,56 @@ impl TryFrom<(&Profile, &Repository, PatchId, Patch)> for PatchItem {
}
impl TableItem<8> for PatchItem {
fn row(&self, _theme: &Theme) -> [Cell; 8] {
fn row(&self, _theme: &Theme, highlight: bool) -> [Cell; 8] {
let (icon, color) = format_patch_state(&self.state);
let state = label::default(&icon)
.style(Style::default().fg(color))
if highlight {
let state = label::reversed(&icon).into();
let id = label::reversed(&format::cob(&self.id)).into();
let title = label::reversed(&self.title.clone()).into();
let author = label::reversed(&format_author(
&self.author.did,
&self.author.alias,
self.author.is_you,
))
.into();
let id = label::id(&format::cob(&self.id)).into();
let title = label::default(&self.title.clone()).into();
let author = match &self.author.alias {
Some(_) => label::alias(&format_author(
&self.author.did,
&self.author.alias,
self.author.is_you,
))
.into(),
None => label::did(&format_author(
&self.author.did,
&self.author.alias,
self.author.is_you,
))
.into(),
};
let head = label::reversed(&format::oid(self.head)).into();
let added = label::reversed(&format!("+{}", self.added)).into();
let removed = label::reversed(&format!("-{}", self.removed)).into();
let updated = label::reversed(&format::timestamp(&self.timestamp)).into();
let head = label::oid(&format::oid(self.head)).into();
let added = label::positive(&format!("+{}", self.added)).into();
let removed = label::negative(&format!("-{}", self.removed)).into();
let updated = label::timestamp(&format::timestamp(&self.timestamp)).into();
[state, id, title, author, head, added, removed, updated]
} else {
let state = label::default(&icon)
.style(Style::default().fg(color))
.into();
let id = label::id(&format::cob(&self.id)).into();
let title = label::default(&self.title.clone()).into();
[state, id, title, author, head, added, removed, updated]
let author = match &self.author.alias {
Some(_) => label::alias(&format_author(
&self.author.did,
&self.author.alias,
self.author.is_you,
))
.into(),
None => label::did(&format_author(
&self.author.did,
&self.author.alias,
self.author.is_you,
))
.into(),
};
let head = label::oid(&format::oid(self.head)).into();
let added = label::positive(&format!("+{}", self.added)).into();
let removed = label::negative(&format!("-{}", self.removed)).into();
let updated = label::timestamp(&format::timestamp(&self.timestamp)).into();
[state, id, title, author, head, added, removed, updated]
}
}
}
@@ -258,7 +278,7 @@ impl From<(&Profile, &Repository, IssueId, Issue)> for IssueItem {
}
impl TableItem<7> for IssueItem {
fn row(&self, _theme: &Theme) -> [Cell; 7] {
fn row(&self, _theme: &Theme, _highlight: bool) -> [Cell; 7] {
let (icon, color) = format_issue_state(&self.state);
let state = label::default(&icon)
+11 -32
View File
@@ -102,49 +102,26 @@ pub mod style {
Style::default().fg(Color::DarkGray)
}
pub fn reversed() -> Style {
Style::default().add_modifier(TextModifiers::REVERSED)
}
pub fn default_reversed() -> Style {
Style::default()
.fg(Color::Reset)
.bg(Color::DarkGray)
.add_modifier(TextModifiers::DIM)
.add_modifier(TextModifiers::REVERSED)
}
pub fn magenta_reversed() -> Style {
Style::default().fg(Color::DarkGray).bg(Color::Magenta)
Style::default()
.fg(Color::Magenta)
.add_modifier(TextModifiers::REVERSED)
}
pub fn yellow_reversed() -> Style {
Style::default().fg(Color::DarkGray).bg(Color::Yellow)
}
pub fn green_default_reversed() -> Style {
Style::default()
.fg(Color::Green)
.bg(Color::DarkGray)
.add_modifier(TextModifiers::DIM)
}
pub fn yellow_default_reversed() -> Style {
Style::default()
.fg(Color::Yellow)
.bg(Color::DarkGray)
.add_modifier(TextModifiers::DIM)
}
pub fn cyan_default_reversed() -> Style {
Style::default()
.fg(Color::Cyan)
.bg(Color::DarkGray)
.add_modifier(TextModifiers::DIM)
}
pub fn gray_default_reversed() -> Style {
Style::default()
.fg(Color::Gray)
.bg(Color::DarkGray)
.add_modifier(TextModifiers::DIM)
}
pub fn border(focus: bool) -> Style {
if focus {
gray_dim()
@@ -154,6 +131,8 @@ pub mod style {
}
pub fn highlight() -> Style {
Style::default().bg(Color::DarkGray)
Style::default()
.fg(Color::Cyan)
.add_modifier(TextModifiers::REVERSED)
}
}
+5 -1
View File
@@ -18,6 +18,10 @@ pub fn default(content: &str) -> Widget<Label> {
.width(width)
}
pub fn reversed(content: &str) -> Widget<Label> {
default(content).style(style::reversed())
}
pub fn default_reversed(content: &str) -> Widget<Label> {
default(content).style(style::default_reversed())
}
@@ -82,7 +86,7 @@ pub fn oid(content: &str) -> Widget<Label> {
}
pub fn timestamp(content: &str) -> Widget<Label> {
default(content).style(style::gray())
default(content).style(style::gray_dim())
}
pub fn positive(content: &str) -> Widget<Label> {
+11 -2
View File
@@ -15,7 +15,7 @@ use super::label::{self, Label};
/// A generic item that can be displayed in a table with [`const W: usize`] columns.
pub trait TableItem<const W: usize> {
/// Should return fields as table cells.
fn row(&self, theme: &Theme) -> [Cell; W];
fn row(&self, theme: &Theme, highlight: bool) -> [Cell; W];
}
/// A generic item that can be displayed in a list.
@@ -239,7 +239,16 @@ where
let rows: Vec<Row<'_>> = self
.items
.iter()
.map(|item| Row::new(item.row(&self.theme)))
.enumerate()
.map(|(index, item)| {
Row::new(item.row(
&self.theme,
match self.state.selected() {
Some(selected) => index == selected,
None => false,
},
))
})
.collect();
let table = tuirealm::tui::widgets::Table::new(rows)