From 80b8a6d8cc33bb010eed618f7c6e7d541783a896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Jeli=C4=87?= Date: Wed, 4 Jun 2025 11:13:45 +0200 Subject: [PATCH] feat(multiverse): Allow timeline items to be selected --- labs/multiverse/src/widgets/room_view/mod.rs | 14 +++++++++++++- labs/multiverse/src/widgets/room_view/timeline.rs | 15 +++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/labs/multiverse/src/widgets/room_view/mod.rs b/labs/multiverse/src/widgets/room_view/mod.rs index 5f0479204..61e29d727 100644 --- a/labs/multiverse/src/widgets/room_view/mod.rs +++ b/labs/multiverse/src/widgets/room_view/mod.rs @@ -48,6 +48,8 @@ pub struct RoomView { mode: Mode, + timeline_list: ListState, + input: Input, } @@ -61,6 +63,7 @@ impl RoomView { current_pagination: Default::default(), mode: Mode::Normal { invited_room_view: None }, input: Input::new(), + timeline_list: ListState::default(), } } @@ -125,6 +128,14 @@ impl RoomView { } } + (_, Down) | (KeyModifiers::CONTROL, Char('n')) => { + self.timeline_list.select_next() + } + (_, Up) | (KeyModifiers::CONTROL, Char('p')) => { + self.timeline_list.select_previous() + } + (_, Esc) => self.timeline_list.select(None), + _ => self.input.handle_key_press(key), } } @@ -197,6 +208,7 @@ impl RoomView { } } + self.timeline_list = ListState::default(); self.selected_room = room; } @@ -458,7 +470,7 @@ impl Widget for &mut RoomView { let items = items.lock(); let mut timeline = TimelineView::new(items.deref()); - timeline.render(timeline_area, buf); + timeline.render(timeline_area, buf, &mut self.timeline_list); } } } else { diff --git a/labs/multiverse/src/widgets/room_view/timeline.rs b/labs/multiverse/src/widgets/room_view/timeline.rs index f22a4853e..1aa490020 100644 --- a/labs/multiverse/src/widgets/room_view/timeline.rs +++ b/labs/multiverse/src/widgets/room_view/timeline.rs @@ -20,8 +20,10 @@ impl<'a> TimelineView<'a> { } } -impl Widget for &mut TimelineView<'_> { - fn render(self, area: Rect, buf: &mut Buffer) +impl StatefulWidget for &mut TimelineView<'_> { + type State = ListState; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) where Self: Sized, { @@ -139,10 +141,11 @@ impl Widget for &mut TimelineView<'_> { }) .collect::>(); - let list = List::new(list_items).highlight_spacing(HighlightSpacing::Always); + let list = List::new(list_items) + .highlight_spacing(HighlightSpacing::Always) + .highlight_symbol(">") + .highlight_style(SELECTED_STYLE_FG); - let mut dummy_list_state = ListState::default(); - - StatefulWidget::render(list, area, buf, &mut dummy_list_state); + StatefulWidget::render(list, area, buf, state); } }