From d97f425d99368358c3052dc4fe8271d698f0bb41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Tue, 4 May 2021 17:10:16 +0200 Subject: [PATCH] sidebar: Add selected-room property Bind it to Session's selected-room --- data/resources/ui/session.ui | 1 + src/session/sidebar/sidebar.rs | 36 +++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/data/resources/ui/session.ui b/data/resources/ui/session.ui index 4f5bcf58..a7784cd6 100644 --- a/data/resources/ui/session.ui +++ b/data/resources/ui/session.ui @@ -7,6 +7,7 @@ + diff --git a/src/session/sidebar/sidebar.rs b/src/session/sidebar/sidebar.rs index feba712c..020ebd65 100644 --- a/src/session/sidebar/sidebar.rs +++ b/src/session/sidebar/sidebar.rs @@ -11,12 +11,13 @@ mod imp { use super::*; use glib::subclass::InitializingObject; use once_cell::sync::Lazy; - use std::cell::Cell; + use std::cell::{Cell, RefCell}; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/org/gnome/FractalNext/sidebar.ui")] pub struct Sidebar { pub compact: Cell, + pub selected_room: RefCell>, #[template_child] pub headerbar: TemplateChild, #[template_child] @@ -60,6 +61,13 @@ mod imp { Categories::static_type(), glib::ParamFlags::WRITABLE, ), + glib::ParamSpec::new_object( + "selected-room", + "Selected Room", + "The selected room in this sidebar", + Room::static_type(), + glib::ParamFlags::READWRITE | glib::ParamFlags::EXPLICIT_NOTIFY, + ), ] }); @@ -82,13 +90,18 @@ mod imp { let categories = value.get().unwrap(); obj.set_categories(categories); } + "selected-room" => { + let selected_room = value.get().unwrap(); + obj.set_selected_room(selected_room); + } _ => unimplemented!(), } } - fn property(&self, _obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { + fn property(&self, obj: &Self::Type, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { match pspec.name() { "compact" => self.compact.get().to_value(), + "selected-room" => obj.selected_room().to_value(), _ => unimplemented!(), } } @@ -108,6 +121,11 @@ impl Sidebar { glib::Object::new(&[]).expect("Failed to create Sidebar") } + pub fn selected_room(&self) -> Option { + let priv_ = imp::Sidebar::from_instance(self); + priv_.selected_room.borrow().clone() + } + pub fn set_categories(&self, categories: Option) { let priv_ = imp::Sidebar::from_instance(self); @@ -147,7 +165,7 @@ impl Sidebar { let selection = gtk::SingleSelection::new(Some(&filter_model)); selection.connect_notify_local(Some("selected-item"), clone!(@weak self as obj => move |model, _| { if let Some(room) = model.selected_item().and_then(|row| row.downcast_ref::().unwrap().item()).and_then(|o| o.downcast::().ok()) { - obj.activate_action("session.show-room", Some(&room.matrix_room().room_id().as_str().to_variant())); + obj.set_selected_room(Some(room)); } })); @@ -156,4 +174,16 @@ impl Sidebar { priv_.listview.set_model(gtk::NONE_SELECTION_MODEL); } } + + fn set_selected_room(&self, selected_room: Option) { + let priv_ = imp::Sidebar::from_instance(self); + + if self.selected_room() == selected_room { + return; + } + + priv_.selected_room.replace(selected_room); + + self.notify("selected-room"); + } }