From 03e96d4452b4bf2dac249c0e52031d256861ae65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Fri, 15 Sep 2023 17:06:17 +0200 Subject: [PATCH] timeline-item: Use the sender ID instead of a Member Do not expect that the members list of a room is always available. --- src/session/model/room/event/mod.rs | 4 +-- src/session/model/room/timeline/mod.rs | 4 +-- .../model/room/timeline/timeline_item.rs | 31 +++++++++++-------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/session/model/room/event/mod.rs b/src/session/model/room/event/mod.rs index a9aa0332..d09defa6 100644 --- a/src/session/model/room/event/mod.rs +++ b/src/session/model/room/event/mod.rs @@ -160,8 +160,8 @@ mod imp { } } - fn event_sender(&self) -> Option { - Some(self.obj().sender()) + fn event_sender_id(&self) -> Option { + Some(self.obj().sender_id()) } fn selectable(&self) -> bool { diff --git a/src/session/model/room/timeline/mod.rs b/src/session/model/room/timeline/mod.rs index 7213f6d7..76b36688 100644 --- a/src/session/model/room/timeline/mod.rs +++ b/src/session/model/room/timeline/mod.rs @@ -311,7 +311,7 @@ impl Timeline { .item(pos - 1) .and_downcast::() .filter(|item| item.can_hide_header()) - .and_then(|item| item.event_sender()) + .and_then(|item| item.event_sender_id()) } else { None }; @@ -322,7 +322,7 @@ impl Timeline { break; }; - let current_sender = current.event_sender(); + let current_sender = current.event_sender_id(); if !current.can_hide_header() { current.set_show_header(false); diff --git a/src/session/model/room/timeline/timeline_item.rs b/src/session/model/room/timeline/timeline_item.rs index 6a37cd73..71cb358d 100644 --- a/src/session/model/room/timeline/timeline_item.rs +++ b/src/session/model/room/timeline/timeline_item.rs @@ -1,8 +1,9 @@ use gtk::{glib, prelude::*, subclass::prelude::*}; use matrix_sdk_ui::timeline::{TimelineItem as SdkTimelineItem, TimelineItemKind}; +use ruma::OwnedUserId; use super::VirtualItem; -use crate::session::model::{Event, Member, Room}; +use crate::session::model::{Event, Room}; mod imp { use std::cell::Cell; @@ -17,7 +18,7 @@ mod imp { pub id: fn(&super::TimelineItem) -> String, pub selectable: fn(&super::TimelineItem) -> bool, pub can_hide_header: fn(&super::TimelineItem) -> bool, - pub event_sender: fn(&super::TimelineItem) -> Option, + pub event_sender_id: fn(&super::TimelineItem) -> Option, } unsafe impl ClassStruct for TimelineItemClass { @@ -39,9 +40,9 @@ mod imp { (klass.as_ref().can_hide_header)(this) } - pub(super) fn timeline_item_event_sender(this: &super::TimelineItem) -> Option { + pub(super) fn timeline_item_event_sender_id(this: &super::TimelineItem) -> Option { let klass = this.class(); - (klass.as_ref().event_sender)(this) + (klass.as_ref().event_sender_id)(this) } #[derive(Debug, Default)] @@ -71,7 +72,7 @@ mod imp { glib::ParamSpecBoolean::builder("can-hide-header") .read_only() .build(), - glib::ParamSpecObject::builder::("event-sender") + glib::ParamSpecString::builder("event-sender-id") .read_only() .build(), ] @@ -95,7 +96,11 @@ mod imp { "selectable" => obj.selectable().to_value(), "show-header" => obj.show_header().to_value(), "can-hide-header" => obj.can_hide_header().to_value(), - "event-sender" => obj.event_sender().to_value(), + "event-sender-id" => obj + .event_sender_id() + .as_ref() + .map(|u| u.as_str()) + .to_value(), _ => unimplemented!(), } } @@ -170,7 +175,7 @@ pub trait TimelineItemExt: 'static { /// If this is a Matrix event, the sender of the event. /// /// Defaults to `None`. - fn event_sender(&self) -> Option; + fn event_sender_id(&self) -> Option; } impl> TimelineItemExt for O { @@ -201,8 +206,8 @@ impl> TimelineItemExt for O { imp::timeline_item_can_hide_header(self.upcast_ref()) } - fn event_sender(&self) -> Option { - imp::timeline_item_event_sender(self.upcast_ref()) + fn event_sender_id(&self) -> Option { + imp::timeline_item_event_sender_id(self.upcast_ref()) } } @@ -222,7 +227,7 @@ pub trait TimelineItemImpl: ObjectImpl { false } - fn event_sender(&self) -> Option { + fn event_sender_id(&self) -> Option { None } } @@ -241,7 +246,7 @@ where klass.id = id_trampoline::; klass.selectable = selectable_trampoline::; klass.can_hide_header = can_hide_header_trampoline::; - klass.event_sender = event_sender_trampoline::; + klass.event_sender_id = event_sender_id_trampoline::; } } @@ -273,11 +278,11 @@ where this.imp().can_hide_header() } -fn event_sender_trampoline(this: &TimelineItem) -> Option +fn event_sender_id_trampoline(this: &TimelineItem) -> Option where T: ObjectSubclass + TimelineItemImpl, T::Type: IsA, { let this = this.downcast_ref::().unwrap(); - this.imp().event_sender() + this.imp().event_sender_id() }