Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
lib: UI improvements
Erik Kundt committed 2 years ago
commit 3d5e2c312110313d197f8887a2e8b61adc635c7b
parent 48b7bb4c055d5af9e235e68b629c21ff9067f5e5
5 files changed +81 -69
modified bin/commands/patch/select/ui.rs
@@ -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]),
modified src/ui/cob.rs
@@ -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))
-
            .into();
-
        let id = label::id(&format::cob(&self.id)).into();
-
        let title = label::default(&self.title.clone()).into();
+
        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 = 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(
+
            let author = label::reversed(&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();
+
            .into();

-
        [state, id, title, author, head, added, removed, updated]
+
            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();
+

+
            [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();
+

+
            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)
modified src/ui/theme.rs
@@ -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)
    }
}
modified src/ui/widget/label.rs
@@ -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> {
modified src/ui/widget/list.rs
@@ -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)