fractal/session/view/content/room_details/permissions/
select_member_row.rs

1use 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        /// The room member displayed by this row.
20        #[property(get, set = Self::set_member, explicit_notify, nullable)]
21        member: RefCell<Option<Member>>,
22        /// Whether this row is selected.
23        #[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        /// Set the room member displayed by this row.
50        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        /// Set whether this row is selected.
60        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    /// A row presenting a room member that can be selected.
78    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}