Radish alpha
r
rad:z39mP9rQAaGmERfUMPULfPUi473tY
Radicle terminal user interface
Radicle
Git
bin: De-clutter widget code
Merged did:key:z6MkgFq6...nBGz opened 2 years ago
3 files changed +222 -230 5e71e1d7 d54f20f1
modified bin/commands/inbox/select/ui.rs
@@ -116,69 +116,6 @@ pub struct BrowsePage<'a> {
    shortcuts: BoxedWidget,
}

-
impl<'a> BrowsePage<'a> {
-
    fn build_footer(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
-
        let search = Line::from(vec![
-
            span::default(" Search ").cyan().dim().reversed(),
-
            span::default(" "),
-
            span::default(&props.search.to_string()).gray().dim(),
-
        ]);
-

-
        let seen = Line::from(vec![
-
            span::positive(&props.stats.get("Seen").unwrap_or(&0).to_string()).dim(),
-
            span::default(" Seen").dim(),
-
        ]);
-
        let unseen = Line::from(vec![
-
            span::positive(&props.stats.get("Unseen").unwrap_or(&0).to_string())
-
                .magenta()
-
                .dim(),
-
            span::default(" Unseen").dim(),
-
        ]);
-

-
        let progress = selected
-
            .map(|selected| {
-
                TableUtils::progress(selected, props.notifications.len(), props.page_size)
-
            })
-
            .unwrap_or_default();
-
        let progress = span::default(&format!("{}%", progress)).dim();
-

-
        match NotificationItemFilter::from_str(&props.search)
-
            .unwrap_or_default()
-
            .state()
-
        {
-
            Some(state) => {
-
                let block = match state {
-
                    NotificationState::Seen => seen,
-
                    NotificationState::Unseen => unseen,
-
                };
-

-
                [
-
                    Column::new(Text::from(search), Constraint::Fill(1)),
-
                    Column::new(
-
                        Text::from(block.clone()),
-
                        Constraint::Min(block.width() as u16),
-
                    ),
-
                    Column::new(Text::from(progress), Constraint::Min(4)),
-
                ]
-
                .to_vec()
-
            }
-
            None => [
-
                Column::new(Text::from(search), Constraint::Fill(1)),
-
                Column::new(
-
                    Text::from(seen.clone()),
-
                    Constraint::Min(seen.width() as u16),
-
                ),
-
                Column::new(
-
                    Text::from(unseen.clone()),
-
                    Constraint::Min(unseen.width() as u16),
-
                ),
-
                Column::new(Text::from(progress), Constraint::Min(4)),
-
            ]
-
            .to_vec(),
-
        }
-
    }
-
}
-

impl<'a: 'static> Widget for BrowsePage<'a> {
    type Action = Action;
    type State = State;
@@ -241,7 +178,7 @@ impl<'a: 'static> Widget for BrowsePage<'a> {
                            let props = BrowsePageProps::from(state);

                            FooterProps::default()
-
                                .columns(Self::build_footer(&props, props.selected))
+
                                .columns(browse_footer(&props, props.selected))
                                .to_boxed()
                        })
                        .to_boxed(),
@@ -617,6 +554,65 @@ impl<'a: 'static> Widget for HelpPage<'a> {
    }
}

+
fn browse_footer<'a>(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
+
    let search = Line::from(vec![
+
        span::default(" Search ").cyan().dim().reversed(),
+
        span::default(" "),
+
        span::default(&props.search.to_string()).gray().dim(),
+
    ]);
+

+
    let seen = Line::from(vec![
+
        span::positive(&props.stats.get("Seen").unwrap_or(&0).to_string()).dim(),
+
        span::default(" Seen").dim(),
+
    ]);
+
    let unseen = Line::from(vec![
+
        span::positive(&props.stats.get("Unseen").unwrap_or(&0).to_string())
+
            .magenta()
+
            .dim(),
+
        span::default(" Unseen").dim(),
+
    ]);
+

+
    let progress = selected
+
        .map(|selected| TableUtils::progress(selected, props.notifications.len(), props.page_size))
+
        .unwrap_or_default();
+
    let progress = span::default(&format!("{}%", progress)).dim();
+

+
    match NotificationItemFilter::from_str(&props.search)
+
        .unwrap_or_default()
+
        .state()
+
    {
+
        Some(state) => {
+
            let block = match state {
+
                NotificationState::Seen => seen,
+
                NotificationState::Unseen => unseen,
+
            };
+

+
            [
+
                Column::new(Text::from(search), Constraint::Fill(1)),
+
                Column::new(
+
                    Text::from(block.clone()),
+
                    Constraint::Min(block.width() as u16),
+
                ),
+
                Column::new(Text::from(progress), Constraint::Min(4)),
+
            ]
+
            .to_vec()
+
        }
+
        None => [
+
            Column::new(Text::from(search), Constraint::Fill(1)),
+
            Column::new(
+
                Text::from(seen.clone()),
+
                Constraint::Min(seen.width() as u16),
+
            ),
+
            Column::new(
+
                Text::from(unseen.clone()),
+
                Constraint::Min(unseen.width() as u16),
+
            ),
+
            Column::new(Text::from(progress), Constraint::Min(4)),
+
        ]
+
        .to_vec(),
+
    }
+
}
+

fn help_text() -> Text<'static> {
    Text::from(
        [
modified bin/commands/issue/select/ui.rs
@@ -132,83 +132,6 @@ pub struct BrowsePage<'a> {
    shortcuts: BoxedWidget,
}

-
impl<'a> BrowsePage<'a> {
-
    fn build_footer(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
-
        let search = Line::from(vec![
-
            span::default(" Search ").cyan().dim().reversed(),
-
            span::default(" "),
-
            span::default(&props.search).gray().dim(),
-
        ]);
-

-
        let open = Line::from(vec![
-
            span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(),
-
            span::default(" Open").dim(),
-
        ]);
-
        let solved = Line::from(vec![
-
            span::default(&props.stats.get("Solved").unwrap_or(&0).to_string())
-
                .magenta()
-
                .dim(),
-
            span::default(" Solved").dim(),
-
        ]);
-
        let closed = Line::from(vec![
-
            span::default(&props.stats.get("Closed").unwrap_or(&0).to_string())
-
                .magenta()
-
                .dim(),
-
            span::default(" Closed").dim(),
-
        ]);
-
        let sum = Line::from(vec![
-
            span::default("Σ ").dim(),
-
            span::default(&props.issues.len().to_string()).dim(),
-
        ]);
-

-
        let progress = selected
-
            .map(|selected| TableUtils::progress(selected, props.issues.len(), props.page_size))
-
            .unwrap_or_default();
-
        let progress = span::default(&format!("{}%", progress)).dim();
-

-
        match IssueItemFilter::from_str(&props.search)
-
            .unwrap_or_default()
-
            .state()
-
        {
-
            Some(state) => {
-
                let block = match state {
-
                    issue::State::Open => open,
-
                    issue::State::Closed {
-
                        reason: issue::CloseReason::Other,
-
                    } => closed,
-
                    issue::State::Closed {
-
                        reason: issue::CloseReason::Solved,
-
                    } => solved,
-
                };
-

-
                [
-
                    Column::new(Text::from(search), Constraint::Fill(1)),
-
                    Column::new(
-
                        Text::from(block.clone()),
-
                        Constraint::Min(block.width() as u16),
-
                    ),
-
                    Column::new(Text::from(progress), Constraint::Min(4)),
-
                ]
-
                .to_vec()
-
            }
-
            None => [
-
                Column::new(Text::from(search), Constraint::Fill(1)),
-
                Column::new(
-
                    Text::from(open.clone()),
-
                    Constraint::Min(open.width() as u16),
-
                ),
-
                Column::new(
-
                    Text::from(closed.clone()),
-
                    Constraint::Min(closed.width() as u16),
-
                ),
-
                Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)),
-
                Column::new(Text::from(progress), Constraint::Min(4)),
-
            ]
-
            .to_vec(),
-
        }
-
    }
-
}
-

impl<'a: 'static> Widget for BrowsePage<'a> {
    type Action = Action;
    type State = State;
@@ -260,7 +183,7 @@ impl<'a: 'static> Widget for BrowsePage<'a> {
                            let props = BrowsePageProps::from(state);

                            FooterProps::default()
-
                                .columns(Self::build_footer(&props, props.selected))
+
                                .columns(browse_footer(&props, props.selected))
                                .to_boxed()
                        })
                        .to_boxed(),
@@ -638,6 +561,81 @@ impl<'a: 'static> Widget for HelpPage<'a> {
    }
}

+
fn browse_footer<'a>(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
+
    let search = Line::from(vec![
+
        span::default(" Search ").cyan().dim().reversed(),
+
        span::default(" "),
+
        span::default(&props.search).gray().dim(),
+
    ]);
+

+
    let open = Line::from(vec![
+
        span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(),
+
        span::default(" Open").dim(),
+
    ]);
+
    let solved = Line::from(vec![
+
        span::default(&props.stats.get("Solved").unwrap_or(&0).to_string())
+
            .magenta()
+
            .dim(),
+
        span::default(" Solved").dim(),
+
    ]);
+
    let closed = Line::from(vec![
+
        span::default(&props.stats.get("Closed").unwrap_or(&0).to_string())
+
            .magenta()
+
            .dim(),
+
        span::default(" Closed").dim(),
+
    ]);
+
    let sum = Line::from(vec![
+
        span::default("Σ ").dim(),
+
        span::default(&props.issues.len().to_string()).dim(),
+
    ]);
+

+
    let progress = selected
+
        .map(|selected| TableUtils::progress(selected, props.issues.len(), props.page_size))
+
        .unwrap_or_default();
+
    let progress = span::default(&format!("{}%", progress)).dim();
+

+
    match IssueItemFilter::from_str(&props.search)
+
        .unwrap_or_default()
+
        .state()
+
    {
+
        Some(state) => {
+
            let block = match state {
+
                issue::State::Open => open,
+
                issue::State::Closed {
+
                    reason: issue::CloseReason::Other,
+
                } => closed,
+
                issue::State::Closed {
+
                    reason: issue::CloseReason::Solved,
+
                } => solved,
+
            };
+

+
            [
+
                Column::new(Text::from(search), Constraint::Fill(1)),
+
                Column::new(
+
                    Text::from(block.clone()),
+
                    Constraint::Min(block.width() as u16),
+
                ),
+
                Column::new(Text::from(progress), Constraint::Min(4)),
+
            ]
+
            .to_vec()
+
        }
+
        None => [
+
            Column::new(Text::from(search), Constraint::Fill(1)),
+
            Column::new(
+
                Text::from(open.clone()),
+
                Constraint::Min(open.width() as u16),
+
            ),
+
            Column::new(
+
                Text::from(closed.clone()),
+
                Constraint::Min(closed.width() as u16),
+
            ),
+
            Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)),
+
            Column::new(Text::from(progress), Constraint::Min(4)),
+
        ]
+
        .to_vec(),
+
    }
+
}
+

fn help_text() -> Text<'static> {
    Text::from(
        [
modified bin/commands/patch/select/ui.rs
@@ -131,93 +131,6 @@ pub struct BrowsePage<'a> {
    shortcuts: BoxedWidget,
}

-
impl<'a> BrowsePage<'a> {
-
    fn build_footer(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
-
        let filter = PatchItemFilter::from_str(&props.search).unwrap_or_default();
-

-
        let search = Line::from(vec![
-
            span::default(" Search ").cyan().dim().reversed(),
-
            span::default(" "),
-
            span::default(&props.search.to_string()).gray().dim(),
-
        ]);
-

-
        let draft = Line::from(vec![
-
            span::default(&props.stats.get("Draft").unwrap_or(&0).to_string()).dim(),
-
            span::default(" Draft").dim(),
-
        ]);
-

-
        let open = Line::from(vec![
-
            span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(),
-
            span::default(" Open").dim(),
-
        ]);
-

-
        let merged = Line::from(vec![
-
            span::default(&props.stats.get("Merged").unwrap_or(&0).to_string())
-
                .magenta()
-
                .dim(),
-
            span::default(" Merged").dim(),
-
        ]);
-

-
        let archived = Line::from(vec![
-
            span::default(&props.stats.get("Archived").unwrap_or(&0).to_string())
-
                .yellow()
-
                .dim(),
-
            span::default(" Archived").dim(),
-
        ]);
-

-
        let sum = Line::from(vec![
-
            span::default("Σ ").dim(),
-
            span::default(&props.patches.len().to_string()).dim(),
-
        ]);
-

-
        let progress = selected
-
            .map(|selected| TableUtils::progress(selected, props.patches.len(), props.page_size))
-
            .unwrap_or_default();
-
        let progress = span::default(&format!("{}%", progress)).dim();
-

-
        match filter.status() {
-
            Some(state) => {
-
                let block = match state {
-
                    Status::Draft => draft,
-
                    Status::Open => open,
-
                    Status::Merged => merged,
-
                    Status::Archived => archived,
-
                };
-

-
                vec![
-
                    Column::new(Text::from(search), Constraint::Fill(1)),
-
                    Column::new(
-
                        Text::from(block.clone()),
-
                        Constraint::Min(block.width() as u16),
-
                    ),
-
                    Column::new(Text::from(progress), Constraint::Min(4)),
-
                ]
-
            }
-
            None => vec![
-
                Column::new(Text::from(search), Constraint::Fill(1)),
-
                Column::new(
-
                    Text::from(draft.clone()),
-
                    Constraint::Min(draft.width() as u16),
-
                ),
-
                Column::new(
-
                    Text::from(open.clone()),
-
                    Constraint::Min(open.width() as u16),
-
                ),
-
                Column::new(
-
                    Text::from(merged.clone()),
-
                    Constraint::Min(merged.width() as u16),
-
                ),
-
                Column::new(
-
                    Text::from(archived.clone()),
-
                    Constraint::Min(archived.width() as u16),
-
                ),
-
                Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)),
-
                Column::new(Text::from(progress), Constraint::Min(4)),
-
            ],
-
        }
-
    }
-
}
-

impl<'a: 'static> Widget for BrowsePage<'a> {
    type Action = Action;
    type State = State;
@@ -269,7 +182,7 @@ impl<'a: 'static> Widget for BrowsePage<'a> {
                            let props = BrowsePageProps::from(state);

                            FooterProps::default()
-
                                .columns(Self::build_footer(&props, props.selected))
+
                                .columns(browse_footer(&props, props.selected))
                                .to_boxed()
                        })
                        .to_boxed(),
@@ -664,6 +577,91 @@ impl<'a: 'static> Widget for HelpPage<'a> {
    }
}

+
fn browse_footer<'a>(props: &BrowsePageProps<'a>, selected: Option<usize>) -> Vec<Column<'a>> {
+
    let filter = PatchItemFilter::from_str(&props.search).unwrap_or_default();
+

+
    let search = Line::from(vec![
+
        span::default(" Search ").cyan().dim().reversed(),
+
        span::default(" "),
+
        span::default(&props.search.to_string()).gray().dim(),
+
    ]);
+

+
    let draft = Line::from(vec![
+
        span::default(&props.stats.get("Draft").unwrap_or(&0).to_string()).dim(),
+
        span::default(" Draft").dim(),
+
    ]);
+

+
    let open = Line::from(vec![
+
        span::positive(&props.stats.get("Open").unwrap_or(&0).to_string()).dim(),
+
        span::default(" Open").dim(),
+
    ]);
+

+
    let merged = Line::from(vec![
+
        span::default(&props.stats.get("Merged").unwrap_or(&0).to_string())
+
            .magenta()
+
            .dim(),
+
        span::default(" Merged").dim(),
+
    ]);
+

+
    let archived = Line::from(vec![
+
        span::default(&props.stats.get("Archived").unwrap_or(&0).to_string())
+
            .yellow()
+
            .dim(),
+
        span::default(" Archived").dim(),
+
    ]);
+

+
    let sum = Line::from(vec![
+
        span::default("Σ ").dim(),
+
        span::default(&props.patches.len().to_string()).dim(),
+
    ]);
+

+
    let progress = selected
+
        .map(|selected| TableUtils::progress(selected, props.patches.len(), props.page_size))
+
        .unwrap_or_default();
+
    let progress = span::default(&format!("{}%", progress)).dim();
+

+
    match filter.status() {
+
        Some(state) => {
+
            let block = match state {
+
                Status::Draft => draft,
+
                Status::Open => open,
+
                Status::Merged => merged,
+
                Status::Archived => archived,
+
            };
+

+
            vec![
+
                Column::new(Text::from(search), Constraint::Fill(1)),
+
                Column::new(
+
                    Text::from(block.clone()),
+
                    Constraint::Min(block.width() as u16),
+
                ),
+
                Column::new(Text::from(progress), Constraint::Min(4)),
+
            ]
+
        }
+
        None => vec![
+
            Column::new(Text::from(search), Constraint::Fill(1)),
+
            Column::new(
+
                Text::from(draft.clone()),
+
                Constraint::Min(draft.width() as u16),
+
            ),
+
            Column::new(
+
                Text::from(open.clone()),
+
                Constraint::Min(open.width() as u16),
+
            ),
+
            Column::new(
+
                Text::from(merged.clone()),
+
                Constraint::Min(merged.width() as u16),
+
            ),
+
            Column::new(
+
                Text::from(archived.clone()),
+
                Constraint::Min(archived.width() as u16),
+
            ),
+
            Column::new(Text::from(sum.clone()), Constraint::Min(sum.width() as u16)),
+
            Column::new(Text::from(progress), Constraint::Min(4)),
+
        ],
+
    }
+
}
+

fn help_text() -> Text<'static> {
    Text::from(
        [