Browse Source

room-details: Refactor PermissionsMembersSubpage

pipelines/767384
Kévin Commaille 1 year ago
parent
commit
df8a020776
No known key found for this signature in database
GPG Key ID: C971D9DBC9D678D
  1. 83
      src/session/view/content/room_details/permissions/member_row.rs
  2. 19
      src/session/view/content/room_details/permissions/members_subpage.rs

83
src/session/view/content/room_details/permissions/member_row.rs

@ -25,13 +25,13 @@ mod imp {
#[template_child]
arrow_box: TemplateChild<gtk::Box>,
#[template_child]
pub popover: TemplateChild<PowerLevelSelectionPopover>,
popover: TemplateChild<PowerLevelSelectionPopover>,
/// The permissions of the room.
#[property(get, set = Self::set_permissions, construct_only)]
pub permissions: OnceCell<Permissions>,
permissions: OnceCell<Permissions>,
/// The room member presented by this row.
#[property(get, set = Self::set_member, explicit_notify, nullable)]
pub member: BoundObject<MemberPowerLevel>,
member: BoundObject<MemberPowerLevel>,
}
#[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);
}
}

19
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<gtk::SearchBar>,
search_bar: TemplateChild<gtk::SearchBar>,
#[template_child]
pub search_entry: TemplateChild<gtk::SearchEntry>,
search_entry: TemplateChild<gtk::SearchEntry>,
#[template_child]
pub list_view: TemplateChild<gtk::ListView>,
pub filtered_model: gtk::FilterListModel,
list_view: TemplateChild<gtk::ListView>,
filtered_model: gtk::FilterListModel,
/// The list used for this view.
#[property(get = Self::list, set = Self::set_list, explicit_notify, nullable)]
pub list: PhantomData<Option<PrivilegedMembers>>,
list: PhantomData<Option<PrivilegedMembers>>,
/// Whether our own user can change the power levels in this room.
#[property(get, set = Self::set_editable, explicit_notify)]
pub editable: Cell<bool>,
editable: Cell<bool>,
}
#[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::<gtk::ListItem>() 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);

Loading…
Cancel
Save