10 changed files with 248 additions and 2 deletions
@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<interface> |
||||
<template class="RoomDetails" parent="AdwPreferencesWindow"> |
||||
<property name="title" translatable="yes">Room Details</property> |
||||
<property name="search-enabled">False</property> |
||||
<child> |
||||
<object class="AdwPreferencesPage"> |
||||
<property name="icon-name">applications-system-symbolic</property> |
||||
<property name="title" translatable="yes">General</property> |
||||
<property name="name">general</property> |
||||
<child> |
||||
<object class="AdwPreferencesGroup"> |
||||
<style> |
||||
<class name="room-details-group" /> |
||||
</style> |
||||
<child> |
||||
<object class="ComponentsAvatar"> |
||||
<property name="size">128</property> |
||||
<binding name="item"> |
||||
<lookup name="avatar"> |
||||
<lookup name="room">RoomDetails</lookup> |
||||
</lookup> |
||||
</binding> |
||||
</object> |
||||
</child> |
||||
<child> |
||||
<object class="GtkEntry" id="room_name_entry"> |
||||
<property name="has-frame">True</property> |
||||
<property name="sensitive" bind-source="edit_toggle" bind-property="active" bind-flags="sync-create" /> |
||||
<property name="xalign">0.5</property> |
||||
<property name="buffer"> |
||||
<object class="GtkEntryBuffer" id="room_name_buffer"> |
||||
<binding name="text"> |
||||
<lookup name="display-name"> |
||||
<lookup name="room">RoomDetails</lookup> |
||||
</lookup> |
||||
</binding> |
||||
</object> |
||||
</property> |
||||
<style> |
||||
<class name="room-details-name" /> |
||||
</style> |
||||
</object> |
||||
</child> |
||||
<child> |
||||
<object class="CustomEntry"> |
||||
<property name="sensitive" bind-source="edit_toggle" bind-property="active" bind-flags="sync-create" /> |
||||
<child> |
||||
<object class="GtkTextView" id="room_topic_text_view"> |
||||
<property name="justification">center</property> |
||||
<property name="wrap-mode">word-char</property> |
||||
<property name="accepts-tab">False</property> |
||||
<property name="buffer"> |
||||
<object class="GtkTextBuffer" id="room_topic_buffer"> |
||||
<binding name="text"> |
||||
<lookup name="topic"> |
||||
<lookup name="room">RoomDetails</lookup> |
||||
</lookup> |
||||
</binding> |
||||
</object> |
||||
</property> |
||||
</object> |
||||
</child> |
||||
<style> |
||||
<class name="room-details-topic" /> |
||||
</style> |
||||
</object> |
||||
</child> |
||||
<child> |
||||
<object class="GtkToggleButton" id="edit_toggle"> |
||||
<property name="halign">center</property> |
||||
<property name="label" translatable="yes">Edit Details</property> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</object> |
||||
</child> |
||||
</template> |
||||
</interface> |
||||
@ -0,0 +1,3 @@
|
||||
mod room_details; |
||||
|
||||
pub use self::room_details::RoomDetails; |
||||
@ -0,0 +1,99 @@
|
||||
use adw::subclass::prelude::*; |
||||
use gtk::{glib, prelude::*, subclass::prelude::*, CompositeTemplate}; |
||||
|
||||
use crate::components::CustomEntry; |
||||
use crate::session::Room; |
||||
|
||||
mod imp { |
||||
use super::*; |
||||
use glib::subclass::InitializingObject; |
||||
use once_cell::unsync::OnceCell; |
||||
|
||||
#[derive(Debug, Default, CompositeTemplate)] |
||||
#[template(resource = "/org/gnome/FractalNext/content-room-details.ui")] |
||||
pub struct RoomDetails { |
||||
pub room: OnceCell<Room>, |
||||
} |
||||
|
||||
#[glib::object_subclass] |
||||
impl ObjectSubclass for RoomDetails { |
||||
const NAME: &'static str = "RoomDetails"; |
||||
type Type = super::RoomDetails; |
||||
type ParentType = adw::PreferencesWindow; |
||||
|
||||
fn class_init(klass: &mut Self::Class) { |
||||
CustomEntry::static_type(); |
||||
Self::bind_template(klass); |
||||
} |
||||
|
||||
fn instance_init(obj: &InitializingObject<Self>) { |
||||
obj.init_template(); |
||||
} |
||||
} |
||||
|
||||
impl ObjectImpl for RoomDetails { |
||||
fn properties() -> &'static [glib::ParamSpec] { |
||||
use once_cell::sync::Lazy; |
||||
static PROPERTIES: Lazy<Vec<glib::ParamSpec>> = Lazy::new(|| { |
||||
vec![glib::ParamSpec::new_object( |
||||
"room", |
||||
"Room", |
||||
"The room backing all details of the preference window", |
||||
Room::static_type(), |
||||
glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY, |
||||
)] |
||||
}); |
||||
|
||||
PROPERTIES.as_ref() |
||||
} |
||||
|
||||
fn set_property( |
||||
&self, |
||||
obj: &Self::Type, |
||||
_id: usize, |
||||
value: &glib::Value, |
||||
pspec: &glib::ParamSpec, |
||||
) { |
||||
match pspec.name() { |
||||
"room" => obj.set_room(value.get().unwrap()), |
||||
_ => unimplemented!(), |
||||
} |
||||
} |
||||
|
||||
fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { |
||||
match pspec.name() { |
||||
"room" => self.room.get().to_value(), |
||||
_ => unimplemented!(), |
||||
} |
||||
} |
||||
} |
||||
|
||||
impl WidgetImpl for RoomDetails {} |
||||
impl WindowImpl for RoomDetails {} |
||||
impl AdwWindowImpl for RoomDetails {} |
||||
impl PreferencesWindowImpl for RoomDetails {} |
||||
} |
||||
|
||||
glib::wrapper! { |
||||
/// Preference Window to display and update room details.
|
||||
pub struct RoomDetails(ObjectSubclass<imp::RoomDetails>) |
||||
@extends gtk::Widget, gtk::Window, adw::Window, adw::PreferencesWindow, @implements gtk::Accessible; |
||||
} |
||||
|
||||
impl RoomDetails { |
||||
pub fn new(parent_window: &Option<gtk::Window>, room: &Room) -> Self { |
||||
glib::Object::new(&[("transient-for", parent_window), ("room", room)]) |
||||
.expect("Failed to create RoomDetails") |
||||
} |
||||
|
||||
pub fn room(&self) -> &Room { |
||||
let priv_ = imp::RoomDetails::from_instance(self); |
||||
// Use unwrap because room property is CONSTRUCT_ONLY.
|
||||
priv_.room.get().unwrap() |
||||
} |
||||
|
||||
fn set_room(&self, room: Room) { |
||||
let priv_ = imp::RoomDetails::from_instance(self); |
||||
priv_.room.set(room).expect("Room already initialized"); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue