diff --git a/src/session/view/content/room_details/permissions/member_row.rs b/src/session/view/content/room_details/permissions/member_row.rs index 977c872a..5ec1adb5 100644 --- a/src/session/view/content/room_details/permissions/member_row.rs +++ b/src/session/view/content/room_details/permissions/member_row.rs @@ -25,13 +25,13 @@ mod imp { #[template_child] arrow_box: TemplateChild, #[template_child] - pub popover: TemplateChild, + popover: TemplateChild, /// The permissions of the room. #[property(get, set = Self::set_permissions, construct_only)] - pub permissions: OnceCell, + permissions: OnceCell, /// The room member presented by this row. #[property(get, set = Self::set_member, explicit_notify, nullable)] - pub member: BoundObject, + member: BoundObject, } #[glib::object_subclass] @@ -45,12 +45,12 @@ mod imp { RoleBadge::ensure_type(); Self::bind_template(klass); - Self::Type::bind_template_callbacks(klass); + Self::bind_template_callbacks(klass); klass.set_css_name("permissions-member-row"); klass.install_action("permissions-member.activate", None, |obj, _, _| { - obj.activate_row(); + obj.imp().activate_row(); }); add_activate_binding_action(klass, "permissions-member.activate"); @@ -78,6 +78,7 @@ mod imp { impl BoxImpl for PermissionsMemberRow {} + #[gtk::template_callbacks] impl PermissionsMemberRow { /// Set the permissions of the room. fn set_permissions(&self, permissions: Permissions) { @@ -145,6 +146,42 @@ mod imp { self.arrow_box.set_opacity(editable.into()); } + + /// The row was activated. + #[template_callback] + fn activate_row(&self) { + let Some(member) = self.member.obj() else { + return; + }; + + if member.editable() { + self.popover.popup(); + } + } + + /// The popover's visibility changed. + #[template_callback] + fn popover_visible(&self) { + let obj = self.obj(); + let is_visible = self.popover.is_visible(); + + if is_visible { + obj.add_css_class("has-open-popup"); + } else { + obj.remove_css_class("has-open-popup"); + } + } + + /// The popover's selected power level changed. + #[template_callback] + fn power_level_changed(&self) { + let Some(member) = self.member.obj() else { + return; + }; + + let pl = self.popover.selected_power_level(); + member.set_power_level(pl); + } } } @@ -154,46 +191,10 @@ glib::wrapper! { @extends gtk::Widget, gtk::Box, @implements gtk::Accessible; } -#[gtk::template_callbacks] impl PermissionsMemberRow { pub fn new(permissions: &Permissions) -> Self { glib::Object::builder() .property("permissions", permissions) .build() } - - /// The row was activated. - #[template_callback] - fn activate_row(&self) { - let Some(member) = self.member() else { - return; - }; - - if member.editable() { - self.imp().popover.popup(); - } - } - - /// The popover's visibility changed. - #[template_callback] - fn popover_visible(&self) { - let is_visible = self.imp().popover.is_visible(); - - if is_visible { - self.add_css_class("has-open-popup"); - } else { - self.remove_css_class("has-open-popup"); - } - } - - /// The popover's selected power level changed. - #[template_callback] - fn power_level_changed(&self) { - let Some(member) = self.member() else { - return; - }; - - let pl = self.imp().popover.selected_power_level(); - member.set_power_level(pl); - } } diff --git a/src/session/view/content/room_details/permissions/members_subpage.rs b/src/session/view/content/room_details/permissions/members_subpage.rs index 6f8e9ece..92730625 100644 --- a/src/session/view/content/room_details/permissions/members_subpage.rs +++ b/src/session/view/content/room_details/permissions/members_subpage.rs @@ -23,18 +23,18 @@ mod imp { #[properties(wrapper_type = super::PermissionsMembersSubpage)] pub struct PermissionsMembersSubpage { #[template_child] - pub search_bar: TemplateChild, + search_bar: TemplateChild, #[template_child] - pub search_entry: TemplateChild, + search_entry: TemplateChild, #[template_child] - pub list_view: TemplateChild, - pub filtered_model: gtk::FilterListModel, + list_view: TemplateChild, + filtered_model: gtk::FilterListModel, /// The list used for this view. #[property(get = Self::list, set = Self::set_list, explicit_notify, nullable)] - pub list: PhantomData>, + list: PhantomData>, /// Whether our own user can change the power levels in this room. #[property(get, set = Self::set_editable, explicit_notify)] - pub editable: Cell, + editable: Cell, } #[glib::object_subclass] @@ -56,7 +56,6 @@ mod imp { impl ObjectImpl for PermissionsMembersSubpage { fn constructed(&self) { self.parent_constructed(); - let obj = self.obj(); // Needed because the GtkSearchEntry is not the direct child of the // GtkSearchBar. @@ -112,14 +111,14 @@ mod imp { let factory = gtk::SignalListItemFactory::new(); factory.connect_setup(clone!( - #[weak] - obj, + #[weak(rename_to = imp)] + self, move |_, item| { let Some(item) = item.downcast_ref::() else { error!("List item factory did not receive a list item: {item:?}"); return; }; - let Some(permissions) = obj.list().and_then(|l| l.permissions()) else { + let Some(permissions) = imp.list().and_then(|l| l.permissions()) else { return; }; let row = PermissionsMemberRow::new(&permissions);