mirror of
https://seed.radicle.dev/rad:z39mP9rQAaGmERfUMPULfPUi473tY.git
synced 2026-11-15 07:50:39 +08:00
lib: UI improvements
This commit is contained in:
@@ -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
@@ -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
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user