From c2b6fefb8e9cce9acb42563a68564129b0c7b573 Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Tue, 23 May 2023 18:47:19 +0200 Subject: [PATCH] tui: Select correct list item on issue page --- radicle-tui/src/app/page.rs | 4 ++-- radicle-tui/src/ui/cob.rs | 6 ++++++ radicle-tui/src/ui/state.rs | 7 ++----- radicle-tui/src/ui/widget/common/list.rs | 17 +++++++++++------ radicle-tui/src/ui/widget/issue.rs | 13 ++++++++----- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/radicle-tui/src/app/page.rs b/radicle-tui/src/app/page.rs index 0ae6e719..2490cadb 100644 --- a/radicle-tui/src/app/page.rs +++ b/radicle-tui/src/app/page.rs @@ -162,8 +162,8 @@ impl ViewPage for IssuePage { context: &Context, theme: &Theme, ) -> Result<()> { - let (id, issue) = &self.issue; - let list = widget::issue::list(context, theme, (*id, issue)).to_boxed(); + let (id, issue) = self.issue.clone(); + let list = widget::issue::list(context, theme, (id, issue)).to_boxed(); let shortcuts = widget::common::shortcuts( theme, vec![ diff --git a/radicle-tui/src/ui/cob.rs b/radicle-tui/src/ui/cob.rs index f7222062..9c6f206d 100644 --- a/radicle-tui/src/ui/cob.rs +++ b/radicle-tui/src/ui/cob.rs @@ -288,6 +288,12 @@ impl ListItem for IssueItem { } } +impl PartialEq for IssueItem { + fn eq(&self, other: &Self) -> bool { + self.id == other.id + } +} + pub fn format_patch_state(state: &PatchState) -> (String, Color) { match state { PatchState::Open { conflicts: _ } => (" ● ".into(), Color::Green), diff --git a/radicle-tui/src/ui/state.rs b/radicle-tui/src/ui/state.rs index f7218913..ddbf1387 100644 --- a/radicle-tui/src/ui/state.rs +++ b/radicle-tui/src/ui/state.rs @@ -25,11 +25,8 @@ pub struct ItemState { } impl ItemState { - pub fn new(len: usize) -> Self { - Self { - selected: Some(0), - len, - } + pub fn new(selected: Option, len: usize) -> Self { + Self { selected, len } } pub fn selected(&self) -> Option { diff --git a/radicle-tui/src/ui/widget/common/list.rs b/radicle-tui/src/ui/widget/common/list.rs index a1f79345..68c84b67 100644 --- a/radicle-tui/src/ui/widget/common/list.rs +++ b/radicle-tui/src/ui/widget/common/list.rs @@ -156,7 +156,7 @@ where items: items.to_vec(), header, widths, - state: ItemState::new(items.len()), + state: ItemState::new(Some(0), items.len()), theme, } } @@ -230,7 +230,7 @@ where /// A list component that can display [`ListItem`]'s. pub struct List where - V: ListItem + Clone, + V: ListItem + Clone + PartialEq, { /// Items held by this list. items: Vec, @@ -242,12 +242,17 @@ where impl List where - V: ListItem + Clone, + V: ListItem + Clone + PartialEq, { - pub fn new(items: &[V], theme: Theme) -> Self { + pub fn new(items: &[V], selected: Option, theme: Theme) -> Self { + let selected = match selected { + Some(item) => items.iter().position(|i| i == &item), + None => Some(0), + }; + Self { items: items.to_vec(), - state: ItemState::new(items.len()), + state: ItemState::new(selected, items.len()), theme, } } @@ -255,7 +260,7 @@ where impl WidgetComponent for List where - V: ListItem + Clone, + V: ListItem + Clone + PartialEq, { fn view(&mut self, properties: &Props, frame: &mut Frame, area: Rect) { use tuirealm::tui::widgets::{List, ListItem}; diff --git a/radicle-tui/src/ui/widget/issue.rs b/radicle-tui/src/ui/widget/issue.rs index c70f362c..c0b7e272 100644 --- a/radicle-tui/src/ui/widget/issue.rs +++ b/radicle-tui/src/ui/widget/issue.rs @@ -22,9 +22,9 @@ pub struct LargeList { } impl LargeList { - pub fn new(context: &Context, theme: &Theme) -> Self { + pub fn new(context: &Context, theme: &Theme, selected: Option<(IssueId, Issue)>) -> Self { let repo = context.repository(); - let issues = cob::issue::all(repo).unwrap_or(vec![]); + let issues = cob::issue::all(repo).unwrap_or_default(); let mut items = issues .iter() @@ -34,7 +34,10 @@ impl LargeList { items.sort_by(|a, b| b.timestamp().cmp(a.timestamp())); items.sort_by(|a, b| a.state().cmp(b.state())); - let list = Widget::new(List::new(&items, theme.clone())) + let selected = + selected.map(|(id, issue)| IssueItem::from((context.profile(), repo, id, issue))); + + let list = Widget::new(List::new(&items, selected, theme.clone())) .highlight(theme.colors.item_list_highlighted_bg); let container = common::labeled_container(theme, "Issues", list.to_boxed()); @@ -57,8 +60,8 @@ impl WidgetComponent for LargeList { } } -pub fn list(context: &Context, theme: &Theme, _issue: (IssueId, &Issue)) -> Widget { - let list = LargeList::new(context, theme); +pub fn list(context: &Context, theme: &Theme, issue: (IssueId, Issue)) -> Widget { + let list = LargeList::new(context, theme, Some(issue)); Widget::new(list) }