refactor(multiverse): Simplify the selected read receipt rendering
This patch simplifies the selected read receipt rendering by the fact that we can simply fetch the selected timeline item instead of the event ID and then do a search for the selected item. Co-authored-by: Benjamin Bouvier <benjamin@bouvier.cc> Signed-off-by: Damir Jelić <poljar@termina.org.uk>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use matrix_sdk::{ruma::EventId, Room};
|
||||
use matrix_sdk::Room;
|
||||
use matrix_sdk_base::read_receipts::RoomReadReceipts;
|
||||
use matrix_sdk_ui::timeline::TimelineItem;
|
||||
use ratatui::{
|
||||
@@ -38,31 +38,16 @@ fn render_room_stats(room: &Room, area: Rect, buf: &mut Buffer) {
|
||||
.render(area, buf);
|
||||
}
|
||||
|
||||
fn find_selected_event(item: &TimelineItem, selected_event: &EventId) -> bool {
|
||||
match item.as_event() {
|
||||
Some(event) => event.event_id() == Some(selected_event),
|
||||
None => false,
|
||||
}
|
||||
}
|
||||
|
||||
impl Widget for &mut ReadReceipts<'_> {
|
||||
fn render(self, area: Rect, buf: &mut Buffer)
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
match self.state.selected_room {
|
||||
Some(room) => match (self.state.timeline_items, self.state.selected_event.as_deref()) {
|
||||
(None, None) | (None, Some(_)) | (Some(_), None) => {
|
||||
render_room_stats(room, area, buf)
|
||||
}
|
||||
(Some(items), Some(selected_event)) => {
|
||||
let item =
|
||||
items.into_iter().find(|&item| find_selected_event(item, selected_event));
|
||||
|
||||
if let Some(item) = item.and_then(|i| format_timeline_item(i)) {
|
||||
let second_item = ListItem::from(selected_event.to_string());
|
||||
|
||||
let list = List::new(vec![second_item, item])
|
||||
if let Some(room) = self.state.selected_room {
|
||||
match self.state.selected_item.as_deref() {
|
||||
Some(selected_event) => {
|
||||
if let Some(item) = format_timeline_item(selected_event) {
|
||||
let list = List::new(vec![item])
|
||||
.highlight_spacing(HighlightSpacing::Always)
|
||||
.highlight_symbol(">")
|
||||
.highlight_style(SELECTED_STYLE_FG);
|
||||
@@ -74,11 +59,11 @@ impl Widget for &mut ReadReceipts<'_> {
|
||||
render_room_stats(room, area, buf);
|
||||
}
|
||||
}
|
||||
},
|
||||
None => {
|
||||
let content = "(room disappeared in the room list service)";
|
||||
Paragraph::new(content).fg(TEXT_COLOR).wrap(Wrap { trim: false }).render(area, buf);
|
||||
None => render_room_stats(room, area, buf),
|
||||
}
|
||||
} else {
|
||||
let content = "(room disappeared in the room list service)";
|
||||
Paragraph::new(content).fg(TEXT_COLOR).wrap(Wrap { trim: false }).render(area, buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,8 +41,7 @@ const DEFAULT_TILING_DIRECTION: Direction = Direction::Horizontal;
|
||||
|
||||
pub struct DetailsState<'a> {
|
||||
selected_room: Option<&'a Room>,
|
||||
timeline_items: Option<&'a Vector<Arc<TimelineItem>>>,
|
||||
selected_event: Option<OwnedEventId>,
|
||||
selected_item: Option<Arc<TimelineItem>>,
|
||||
}
|
||||
|
||||
enum Mode {
|
||||
@@ -579,16 +578,10 @@ impl RoomView {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_selected_event_id(&self) -> Option<OwnedEventId> {
|
||||
fn get_selected_event(&self) -> Option<Arc<TimelineItem>> {
|
||||
let selected = self.timeline_list.selected()?;
|
||||
let selected_room = self.room_id()?;
|
||||
|
||||
let timelines = self.timelines.lock();
|
||||
let current_timeline = timelines.get(selected_room)?;
|
||||
let items = current_timeline.items.lock();
|
||||
let item = items.get(selected)?;
|
||||
|
||||
item.as_event()?.event_id().map(|e| e.to_owned())
|
||||
let items = self.get_selected_timeline_items()?;
|
||||
items.get(selected).cloned()
|
||||
}
|
||||
|
||||
fn update(&mut self) {
|
||||
@@ -642,13 +635,11 @@ impl Widget for &mut RoomView {
|
||||
.render(middle_area, buf);
|
||||
};
|
||||
|
||||
let selected_event = self.get_selected_event_id();
|
||||
|
||||
if let Some(room_id) = self.room_id() {
|
||||
let maybe_room = self.client.get_room(room_id);
|
||||
let mut maybe_room = maybe_room.as_ref();
|
||||
|
||||
let items = self.get_selected_timeline_items();
|
||||
let selected_event = self.get_selected_event();
|
||||
|
||||
let timeline_area = match &mut self.mode {
|
||||
Mode::Normal { invited_room_view } => {
|
||||
@@ -670,23 +661,10 @@ impl Widget for &mut RoomView {
|
||||
let [timeline_area, details_area] = vertical.areas(middle_area);
|
||||
Clear.render(details_area, buf);
|
||||
|
||||
if let Some(items) = items {
|
||||
let mut state = DetailsState {
|
||||
selected_room: maybe_room,
|
||||
timeline_items: Some(&items),
|
||||
selected_event,
|
||||
};
|
||||
let mut state =
|
||||
DetailsState { selected_room: maybe_room, selected_item: selected_event };
|
||||
|
||||
view.render(details_area, buf, &mut state);
|
||||
} else {
|
||||
let mut state = DetailsState {
|
||||
selected_room: maybe_room,
|
||||
timeline_items: None,
|
||||
selected_event,
|
||||
};
|
||||
|
||||
view.render(details_area, buf, &mut state);
|
||||
}
|
||||
view.render(details_area, buf, &mut state);
|
||||
|
||||
Some(timeline_area)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user