Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
lib: Use more label builders
Erik Kundt committed 2 years ago
commit 74b7a16b7fb2e98097ec72e1db9a57150c507557
parent ea91de73cc3f8f77fe480bbf789e6bbf68494a28
6 files changed +80 -62
modified bin/commands/issue/suite/ui.rs
@@ -35,13 +35,13 @@ pub struct IssueBrowser {
impl IssueBrowser {
    pub fn new(context: &Context, theme: &Theme, selected: Option<(IssueId, Issue)>) -> Self {
        let header = [
-
            label::default(" ● ").style(style::reset_dim()),
-
            label::default("ID").style(style::reset_dim()),
-
            label::default("Title").style(style::reset_dim()),
-
            label::default("Author").style(style::reset_dim()),
-
            label::default("Tags").style(style::reset_dim()),
-
            label::default("Assignees").style(style::reset_dim()),
-
            label::default("Opened").style(style::reset_dim()),
+
            label::header(" ● "),
+
            label::header("ID"),
+
            label::header("Title"),
+
            label::header("Author"),
+
            label::header("Tags"),
+
            label::header("Assignees"),
+
            label::header("Opened"),
        ];

        let widths = [
@@ -171,45 +171,38 @@ impl IssueHeader {
        let by_you = *author == context.profile().did();
        let item = IssueItem::from((context.profile(), repo, id, issue.clone()));

-
        let title = Property::new(
-
            label::default("Title").style(style::cyan()),
-
            label::default(item.title()).style(style::reset()),
-
        );
+
        let title = Property::new(label::property("Title"), label::default(item.title()));

-
        let author_style = match alias {
-
            Some(_) => style::magenta(),
-
            None => style::magenta_dim(),
+
        let author = match alias {
+
            Some(_) => label::alias(&cob::format_author(issue.author().id(), &alias, by_you)),
+
            None => label::did(&cob::format_author(issue.author().id(), &alias, by_you)),
        };
-

-
        let author = label::default(&cob::format_author(issue.author().id(), &alias, by_you))
-
            .style(author_style);
-
        let author = Property::new(label::default("Author").style(style::cyan()), author);
+
        let author = Property::new(label::property("Author"), author);

        let issue_id = Property::new(
-
            label::default("Issue").style(style::cyan()),
+
            label::property("Issue"),
            label::default(&id.to_string()).style(style::gray()),
        );

        let labels = Property::new(
-
            label::default("Labels").style(style::cyan()),
-
            label::default(&cob::format_labels(item.labels())).style(style::lightblue()),
+
            label::property("Labels"),
+
            label::labels(&cob::format_labels(item.labels())),
        );

        let assignees = Property::new(
-
            label::default("Assignees").style(style::cyan()),
-
            label::default(&cob::format_assignees(
+
            label::property("Assignees"),
+
            label::did(&cob::format_assignees(
                &item
                    .assignees()
                    .iter()
                    .map(|item| (item.did(), item.alias(), item.is_you()))
                    .collect::<Vec<_>>(),
-
            ))
-
            .style(author_style),
+
            )),
        );

        let state = Property::new(
-
            label::default("Status").style(style::cyan()),
-
            label::default(&item.state().to_string()).style(style::reset()),
+
            label::property("Status"),
+
            label::default(&item.state().to_string()),
        );

        let table = tui::ui::property_table(
modified bin/commands/patch/list/ui.rs
@@ -24,14 +24,14 @@ pub struct PatchBrowser {
impl PatchBrowser {
    pub fn new(context: &Context, theme: &Theme, selected: Option<(PatchId, Patch)>) -> Self {
        let header = [
-
            label::default(" ● ").style(style::reset_dim()),
-
            label::default("ID").style(style::reset_dim()),
-
            label::default("Title").style(style::reset_dim()),
-
            label::default("Author").style(style::reset_dim()),
-
            label::default("Head").style(style::reset_dim()),
-
            label::default("+").style(style::reset_dim()),
-
            label::default("-").style(style::reset_dim()),
-
            label::default("Updated").style(style::reset_dim()),
+
            label::header(" ● "),
+
            label::header("ID"),
+
            label::header("Title"),
+
            label::header("Author"),
+
            label::header("Head"),
+
            label::header("+"),
+
            label::header("-"),
+
            label::header("Updated"),
        ];

        let widths = [
@@ -130,24 +130,24 @@ pub fn browse_context(context: &Context, _theme: &Theme, progress: Progress) ->
        }
    }

-
    let context = label::default(" Patches ").style(style::magenta_reversed());
-
    let divider = label::default(" | ").style(style::default_reversed());
+
    let context = label::badge(" Patches ");
+
    let divider = label::default_reversed(" | ");

-
    let draft_n = label::default(&format!("{draft}")).style(style::default_reversed());
-
    let draft = label::default(" Draft").style(style::default_reversed());
+
    let draft_n = label::default_reversed(&format!("{draft}"));
+
    let draft = label::default_reversed(" Draft");

    let open_n = label::default(&format!("{open}")).style(style::green_default_reversed());
-
    let open = label::default(" Open").style(style::default_reversed());
+
    let open = label::default_reversed(" Open");

    let archived_n = label::default(&format!("{archived}")).style(style::yellow_default_reversed());
-
    let archived = label::default(" Archived").style(style::default_reversed());
+
    let archived = label::default_reversed(" Archived");

    let merged_n = label::default(&format!("{merged}")).style(style::cyan_default_reversed());
-
    let merged = label::default(" Merged ").style(style::default_reversed());
+
    let merged = label::default_reversed(" Merged ");

    let progress =
        label::default(&format!(" {} ", progress.to_string())).style(style::magenta_reversed());
-
    let spacer = label::default("").style(style::default_reversed());
+
    let spacer = label::default_reversed("");

    let context_bar = ContextBar::new(
        label::group(&[context]),
modified bin/commands/patch/suite/ui.rs
@@ -27,14 +27,14 @@ pub struct PatchBrowser {
impl PatchBrowser {
    pub fn new(context: &Context, theme: &Theme, selected: Option<(PatchId, Patch)>) -> Self {
        let header = [
-
            label::default(" ● ").style(style::reset_dim()),
-
            label::default("ID").style(style::reset_dim()),
-
            label::default("Title").style(style::reset_dim()),
-
            label::default("Author").style(style::reset_dim()),
-
            label::default("Head").style(style::reset_dim()),
-
            label::default("+").style(style::reset_dim()),
-
            label::default("-").style(style::reset_dim()),
-
            label::default("Updated").style(style::reset_dim()),
+
            label::header(" ● "),
+
            label::header("ID"),
+
            label::header("Title"),
+
            label::header("Author"),
+
            label::header("Head"),
+
            label::header("+"),
+
            label::header("-"),
+
            label::header("Updated"),
        ];

        let widths = [
modified src/ui.rs
@@ -42,10 +42,7 @@ pub fn labeled_container(
    title: &str,
    component: Box<dyn MockComponent>,
) -> Widget<LabeledContainer> {
-
    let header = container_header(
-
        theme,
-
        label::default(&format!(" {title} ")).style(style::reset()),
-
    );
+
    let header = container_header(theme, label::header(&format!(" {title} ")));
    let container = LabeledContainer::new(header, component, theme.clone());

    Widget::new(container)
@@ -76,9 +73,9 @@ pub fn shortcuts(theme: &Theme, shortcuts: Vec<Widget<Shortcut>>) -> Widget<Shor
}

pub fn property(theme: &Theme, name: &str, value: &str) -> Widget<Property> {
-
    let name = label::default(name).style(style::cyan());
+
    let name = label::property(name);
    let divider = label::default(&format!(" {} ", theme.icons.property_divider));
-
    let value = label::default(value).style(style::reset());
+
    let value = label::default(value);

    // TODO: Remove when size constraints are implemented
    let name_w = name.query(Attribute::Width).unwrap().unwrap_size();
modified src/ui/widget/context.rs
@@ -215,11 +215,11 @@ pub fn bar(
    label_3: &str,
    label_4: &str,
) -> Widget<ContextBar> {
-
    let label_0 = label::default(&format!(" {label_0} ")).style(style::magenta_reversed());
-
    let label_1 = label::default(&format!(" {label_1} ")).style(style::default_reversed());
-
    let label_2 = label::default(&format!(" {label_2} ")).style(style::default_reversed());
-
    let label_3 = label::default(&format!(" {label_3} ")).style(style::default_reversed());
-
    let label_4 = label::default(&format!(" {label_4} ")).style(style::default_reversed());
+
    let label_0 = label::badge(&format!(" {label_0} "));
+
    let label_1 = label::default_reversed(&format!(" {label_1} "));
+
    let label_2 = label::default_reversed(&format!(" {label_2} "));
+
    let label_3 = label::default_reversed(&format!(" {label_3} "));
+
    let label_4 = label::default_reversed(&format!(" {label_4} "));

    let label_0 = label::group(&[label_0]);
    let label_1 = label::group(&[label_1]);
modified src/ui/widget/label.rs
@@ -18,6 +18,10 @@ pub fn default(content: &str) -> Widget<Label> {
        .width(width)
}

+
pub fn default_reversed(content: &str) -> Widget<Label> {
+
    default(content).style(style::default_reversed())
+
}
+

pub fn group(labels: &[Widget<Label>]) -> Widget<LabelGroup> {
    let group = LabelGroup::new(labels);
    let width = labels.iter().fold(0, |total, label| {
@@ -37,6 +41,30 @@ pub fn reversable(content: &str) -> Widget<Label> {
    default(content)
}

+
pub fn header(content: &str) -> Widget<Label> {
+
    default(content).style(style::reset_dim())
+
}
+

+
pub fn property(content: &str) -> Widget<Label> {
+
    default(content).style(style::cyan())
+
}
+

+
pub fn badge(content: &str) -> Widget<Label> {
+
    default(content).style(style::magenta_reversed())
+
}
+

+
pub fn labels(content: &str) -> Widget<Label> {
+
    default(content).style(style::lightblue())
+
}
+

+
pub fn alias(content: &str) -> Widget<Label> {
+
    default(content).style(style::magenta())
+
}
+

+
pub fn did(content: &str) -> Widget<Label> {
+
    default(content).style(style::magenta_dim())
+
}
+

/// A label that can be styled using a foreground color and text modifiers.
/// Its height is fixed, its width depends on the length of the text it displays.
#[derive(Clone, Default)]