|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
use gtk::glib; |
|
|
|
|
use gtk::prelude::*; |
|
|
|
|
use gtk::subclass::prelude::*; |
|
|
|
|
use matrix_sdk::ruma::events::room::member::MemberEventContent; |
|
|
|
|
use matrix_sdk::ruma::events::{StrippedStateEvent, SyncStateEvent}; |
|
|
|
|
@ -10,9 +11,13 @@ use crate::session::{Room, User};
|
|
|
|
|
|
|
|
|
|
mod imp { |
|
|
|
|
use super::*; |
|
|
|
|
use once_cell::sync::Lazy; |
|
|
|
|
use std::cell::Cell; |
|
|
|
|
|
|
|
|
|
#[derive(Debug, Default)] |
|
|
|
|
pub struct Member {} |
|
|
|
|
pub struct Member { |
|
|
|
|
pub power_level: Cell<u32>, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[glib::object_subclass] |
|
|
|
|
impl ObjectSubclass for Member { |
|
|
|
|
@ -21,7 +26,30 @@ mod imp {
|
|
|
|
|
type ParentType = User; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
impl ObjectImpl for Member {} |
|
|
|
|
impl ObjectImpl for Member { |
|
|
|
|
fn properties() -> &'static [glib::ParamSpec] { |
|
|
|
|
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| { |
|
|
|
|
vec![glib::ParamSpec::new_uint( |
|
|
|
|
"power-level", |
|
|
|
|
"Power level", |
|
|
|
|
"Power level of the member in its room.", |
|
|
|
|
0, |
|
|
|
|
100, |
|
|
|
|
0, |
|
|
|
|
glib::ParamFlags::READABLE | glib::ParamFlags::EXPLICIT_NOTIFY, |
|
|
|
|
)] |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
PROPERTIES.as_ref() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn property(&self, obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { |
|
|
|
|
match pspec.name() { |
|
|
|
|
"power-level" => obj.power_level().to_value(), |
|
|
|
|
_ => unimplemented!(), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
glib::wrapper! { |
|
|
|
|
@ -36,6 +64,20 @@ impl Member {
|
|
|
|
|
.expect("Failed to create Member") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub fn power_level(&self) -> u32 { |
|
|
|
|
let priv_ = imp::Member::from_instance(self); |
|
|
|
|
priv_.power_level.get() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn set_power_level(&self, power_level: u32) { |
|
|
|
|
if self.power_level() == power_level { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
let priv_ = imp::Member::from_instance(self); |
|
|
|
|
priv_.power_level.replace(power_level); |
|
|
|
|
self.notify("power-level"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Update the user based on the the room member state event
|
|
|
|
|
pub fn update_from_room_member(&self, member: &RoomMember) { |
|
|
|
|
if member.user_id() != self.user_id() { |
|
|
|
|
@ -45,6 +87,7 @@ impl Member {
|
|
|
|
|
|
|
|
|
|
self.set_display_name(member.display_name().map(String::from)); |
|
|
|
|
self.avatar().set_url(member.avatar_url().cloned()); |
|
|
|
|
self.set_power_level(member.power_level().clamp(0, 100) as u32); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Update the user based on the the room member state event
|
|
|
|
|
|