fractal/session/view/content/room_details/permissions/
select_member_row.rs1use adw::subclass::prelude::BinImpl;
2use gtk::{glib, prelude::*, subclass::prelude::*, CompositeTemplate};
3
4use crate::{session::model::Member, utils::bool_to_accessible_tristate};
5
6mod imp {
7 use std::cell::{Cell, RefCell};
8
9 use glib::subclass::InitializingObject;
10
11 use super::*;
12
13 #[derive(Debug, Default, CompositeTemplate, glib::Properties)]
14 #[template(
15 resource = "/org/gnome/Fractal/ui/session/view/content/room_details/permissions/select_member_row.ui"
16 )]
17 #[properties(wrapper_type = super::PermissionsSelectMemberRow)]
18 pub struct PermissionsSelectMemberRow {
19 #[property(get, set = Self::set_member, explicit_notify, nullable)]
21 member: RefCell<Option<Member>>,
22 #[property(get, set = Self::set_selected, explicit_notify)]
24 selected: Cell<bool>,
25 }
26
27 #[glib::object_subclass]
28 impl ObjectSubclass for PermissionsSelectMemberRow {
29 const NAME: &'static str = "RoomDetailsPermissionsSelectMemberRow";
30 type Type = super::PermissionsSelectMemberRow;
31 type ParentType = adw::Bin;
32
33 fn class_init(klass: &mut Self::Class) {
34 Self::bind_template(klass);
35 }
36
37 fn instance_init(obj: &InitializingObject<Self>) {
38 obj.init_template();
39 }
40 }
41
42 #[glib::derived_properties]
43 impl ObjectImpl for PermissionsSelectMemberRow {}
44
45 impl WidgetImpl for PermissionsSelectMemberRow {}
46 impl BinImpl for PermissionsSelectMemberRow {}
47
48 impl PermissionsSelectMemberRow {
49 fn set_member(&self, member: Option<Member>) {
51 if *self.member.borrow() == member {
52 return;
53 }
54
55 self.member.replace(member);
56 self.obj().notify_member();
57 }
58
59 fn set_selected(&self, selected: bool) {
61 if self.selected.get() == selected {
62 return;
63 }
64
65 self.selected.set(selected);
66
67 let obj = self.obj();
68 obj.update_state(&[gtk::accessible::State::Checked(
69 bool_to_accessible_tristate(selected),
70 )]);
71 obj.notify_selected();
72 }
73 }
74}
75
76glib::wrapper! {
77 pub struct PermissionsSelectMemberRow(ObjectSubclass<imp::PermissionsSelectMemberRow>)
79 @extends gtk::Widget, adw::Bin, @implements gtk::Accessible;
80}
81
82impl PermissionsSelectMemberRow {
83 pub fn new() -> Self {
84 glib::Object::new()
85 }
86}