diff --git a/data/resources/stylesheet/_room_history.scss b/data/resources/stylesheet/_room_history.scss index 28b5ebb0..e4513b5e 100644 --- a/data/resources/stylesheet/_room_history.scss +++ b/data/resources/stylesheet/_room_history.scss @@ -99,43 +99,30 @@ room-title { } } } -} - -sender-avatar { - padding: 5px; - border-radius: 100%; - @include vendor.focus-ring(); + button.sender-avatar { + padding: 5px; - &:hover { - background-color: vendor.$hover_color; + /* @include vendor.focus-ring(); */ - image { - filter: brightness(1.07) ; + &:hover { + image { + filter: brightness(1.07) ; + } } - } - - &:active { - background-color: vendor.$active_color; - image { - filter: brightness(1.16) ; + &:active { + image { + filter: brightness(1.16) ; + } } - } - - &:checked { - background-color: vendor.$selected_color; - image { - filter: brightness(1.1) ; + &:checked { + image { + filter: brightness(1.1) ; + } } } - - popover button.text-button { - padding-left: 10px; - padding-right: 10px; - font-weight: 400; - } } message-sender { diff --git a/po/POTFILES.in b/po/POTFILES.in index 89f13282..a66e12f5 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -162,6 +162,7 @@ src/session/view/content/room_history/message_row/location.rs src/session/view/content/room_history/message_row/location.ui src/session/view/content/room_history/message_row/message_state_stack.ui src/session/view/content/room_history/message_row/mod.rs +src/session/view/content/room_history/message_row/mod.ui src/session/view/content/room_history/message_row/reaction/mod.rs src/session/view/content/room_history/message_row/reaction_list.ui src/session/view/content/room_history/message_row/reply.ui @@ -177,8 +178,6 @@ src/session/view/content/room_history/member_timestamp/row.rs src/session/view/content/room_history/mod.rs src/session/view/content/room_history/mod.ui src/session/view/content/room_history/read_receipts_list/mod.rs -src/session/view/content/room_history/sender_avatar/mod.rs -src/session/view/content/room_history/sender_avatar/mod.ui src/session/view/content/room_history/state/content.rs src/session/view/content/room_history/state/creation.rs src/session/view/content/room_history/state/creation.ui diff --git a/src/session/view/content/room_history/message_row/mod.rs b/src/session/view/content/room_history/message_row/mod.rs index fda85340..701efecf 100644 --- a/src/session/view/content/room_history/message_row/mod.rs +++ b/src/session/view/content/room_history/message_row/mod.rs @@ -1,5 +1,6 @@ use adw::{prelude::*, subclass::prelude::*}; use gtk::{CompositeTemplate, gdk, glib, glib::clone}; +use tracing::error; mod audio; mod caption; @@ -19,11 +20,13 @@ use self::{ message_state_stack::MessageStateStack, reaction_list::MessageReactionList, sender_name::MessageSenderName, }; -use super::{ReadReceiptsList, SenderAvatar}; +use super::ReadReceiptsList; use crate::{ - Application, gettext_f, + Application, + components::UserProfileDialog, + gettext_f, prelude::*, - session::model::{Event, EventHeaderState}, + session::model::{Event, EventHeaderState, Member}, system_settings::ClockFormat, utils::BoundObject, }; @@ -42,7 +45,7 @@ mod imp { #[properties(wrapper_type = super::MessageRow)] pub struct MessageRow { #[template_child] - avatar: TemplateChild, + avatar_button: TemplateChild, #[template_child] header: TemplateChild, #[template_child] @@ -62,6 +65,9 @@ mod imp { /// The event that is presented. #[property(get, set = Self::set_event, explicit_notify)] event: BoundObject, + /// The sender of the event that is presented. + #[property(get = Self::sender)] + sender: PhantomData>, /// The texture of the image preview displayed by the descendant of this /// widget, if any. #[property(get = Self::texture)] @@ -76,6 +82,7 @@ mod imp { fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); + Self::bind_template_callbacks(klass); } fn instance_init(obj: &InitializingObject) { @@ -133,6 +140,7 @@ mod imp { impl WidgetImpl for MessageRow {} impl BinImpl for MessageRow {} + #[gtk::template_callbacks] impl MessageRow { /// Set the event that is presented. fn set_event(&self, event: Event) { @@ -145,7 +153,6 @@ mod imp { } let sender = event.sender(); - self.avatar.set_sender(Some(sender.clone())); self.display_name.set_sender(Some(sender)); let state_binding = event @@ -193,12 +200,18 @@ mod imp { ], ); obj.notify_event(); + obj.notify_sender(); self.update_content(); self.update_header(); self.update_timestamp(); } + /// The sender of the event that is presented. + fn sender(&self) -> Option { + self.event.obj().map(|event| event.sender()) + } + /// Update the header for the current event. fn update_header(&self) { let Some(event) = self.event.obj() else { @@ -209,7 +222,7 @@ mod imp { let avatar_name_visible = header_state == EventHeaderState::Full; let header_visible = header_state != EventHeaderState::Hidden; - self.avatar.set_visible(avatar_name_visible); + self.avatar_button.set_visible(avatar_name_visible); self.display_name.set_visible(avatar_name_visible); self.header.set_visible(header_visible); @@ -258,6 +271,19 @@ mod imp { pub(super) fn texture(&self) -> Option { self.content.texture() } + + /// View the profile of the sender. + #[template_callback] + fn view_sender_profile(&self) { + let Some(sender) = self.sender() else { + error!("Could not open profile for missing sender"); + return; + }; + + let dialog = UserProfileDialog::new(); + dialog.set_room_member(sender); + dialog.present(Some(&*self.obj())); + } } } diff --git a/src/session/view/content/room_history/message_row/mod.ui b/src/session/view/content/room_history/message_row/mod.ui index 1922cc3c..1e46d5e2 100644 --- a/src/session/view/content/room_history/message_row/mod.ui +++ b/src/session/view/content/room_history/message_row/mod.ui @@ -8,7 +8,26 @@ 8 - + + View Sender Profile + start + + + 36 + presentation + + + ContentMessageRow + + + + + + 0 0 diff --git a/src/session/view/content/room_history/mod.rs b/src/session/view/content/room_history/mod.rs index ee6c5926..48678ee3 100644 --- a/src/session/view/content/room_history/mod.rs +++ b/src/session/view/content/room_history/mod.rs @@ -19,7 +19,6 @@ mod member_timestamp; mod message_row; mod message_toolbar; mod read_receipts_list; -mod sender_avatar; mod state; mod title; mod typing_row; @@ -32,7 +31,6 @@ use self::{ message_row::MessageRow, message_toolbar::MessageToolbar, read_receipts_list::ReadReceiptsList, - sender_avatar::SenderAvatar, state::{StateGroupRow, StateRow}, title::RoomHistoryTitle, typing_row::TypingRow, @@ -71,8 +69,6 @@ mod imp { #[template(resource = "/org/gnome/Fractal/ui/session/view/content/room_history/mod.ui")] #[properties(wrapper_type = super::RoomHistory)] pub struct RoomHistory { - #[template_child] - sender_menu_model: TemplateChild, #[template_child] pub(super) header_bar: TemplateChild, #[template_child] @@ -103,7 +99,6 @@ mod imp { drag_overlay: TemplateChild, /// The context menu for rows presenting an [`Event`]. event_context_menu: OnceCell, - sender_context_menu: OnceCell, /// The timeline currently displayed. #[property(get, set = Self::set_timeline, explicit_notify, nullable)] timeline: BoundObject, @@ -1127,21 +1122,6 @@ mod imp { self.event_context_menu.get_or_init(Default::default) } - /// The context menu for the sender avatars. - pub(super) fn sender_context_menu(&self) -> >k::PopoverMenu { - self.sender_context_menu.get_or_init(|| { - let popover = gtk::PopoverMenu::builder() - .has_arrow(false) - .halign(gtk::Align::Start) - .menu_model(&*self.sender_menu_model) - .build(); - popover.update_property(&[gtk::accessible::Property::Label(&gettext( - "Sender Context Menu", - ))]); - popover - }) - } - /// Opens the room details with the given initial view. fn open_room_details(&self, initial_view: room_details::InitialView) { let Some(room) = self.room() else { @@ -1205,11 +1185,6 @@ impl RoomHistory { fn event_context_menu(&self) -> &EventActionsContextMenu { self.imp().event_context_menu() } - - /// The context menu for the sender avatars. - fn sender_context_menu(&self) -> >k::PopoverMenu { - self.imp().sender_context_menu() - } } /// Set the proper child of the given `GtkListItem` for the given diff --git a/src/session/view/content/room_history/mod.ui b/src/session/view/content/room_history/mod.ui index 64959569..5016802a 100644 --- a/src/session/view/content/room_history/mod.ui +++ b/src/session/view/content/room_history/mod.ui @@ -31,93 +31,6 @@ - -
- - user-id - -
-
- - - _Mention - sender-avatar.mention - action-disabled - - - - _Open Direct Chat - sender-avatar.open-direct-chat - action-disabled - - - Copy _Link - sender-avatar.permalink - -
-
- - - _Invite - sender-avatar.invite - action-disabled - - - Revoke _Invite - sender-avatar.revoke-invite - action-disabled - - - - M_ute - sender-avatar.mute - action-disabled - - - _Unmute - sender-avatar.unmute - action-disabled - - - - _Kick - sender-avatar.kick - action-disabled - - - - _Ban - sender-avatar.ban - action-disabled - - - Un_ban - sender-avatar.unban - action-disabled - - - _Remove Messages - sender-avatar.remove-messages - action-disabled - - - I_gnore - sender-avatar.ignore - action-disabled - - - Stop I_gnoring - sender-avatar.stop-ignoring - action-disabled - -
-
- - _View Details - sender-avatar.view-details - -
-