[fractal/multi-account: 4/4] Account switcher: Show hints in account entry for visible session
- From: Alejandro Domínguez <aledomu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal/multi-account: 4/4] Account switcher: Show hints in account entry for visible session
- Date: Mon, 23 Aug 2021 12:50:45 +0000 (UTC)
commit 63ad21f6b13428657fbc0f8ff07baa232b5e3634
Author: Alejandro Domínguez <adomu net-c com>
Date: Mon Aug 16 05:41:05 2021 +0200
Account switcher: Show hints in account entry for visible session
data/resources/style.css | 10 +++++++++
src/components/avatar_overlaid.rs | 24 +++++++++++++++++++++-
src/session/sidebar/account_switcher/user_entry.rs | 24 ++++++++++++++++++++++
3 files changed, 57 insertions(+), 1 deletion(-)
---
diff --git a/data/resources/style.css b/data/resources/style.css
index 355cf490..86a33d03 100644
--- a/data/resources/style.css
+++ b/data/resources/style.css
@@ -18,6 +18,16 @@
background-color: alpha(@theme_bg_color, 0.2);
}
+.selected-avatar avatar {
+ border: 2px solid @accent_bg_color;
+}
+
+.blue-checkmark {
+ color: @accent_bg_color;
+ border-radius: 9999px;
+ background-color: white;
+}
+
/* Login */
.login {
min-width: 250px;
diff --git a/src/components/avatar_overlaid.rs b/src/components/avatar_overlaid.rs
index cf1e9257..9ed2ab22 100644
--- a/src/components/avatar_overlaid.rs
+++ b/src/components/avatar_overlaid.rs
@@ -62,13 +62,14 @@ mod imp {
fn set_property(
&self,
- _obj: &Self::Type,
+ obj: &Self::Type,
_id: usize,
value: &glib::Value,
pspec: &glib::ParamSpec,
) {
match pspec.name() {
"size" => self.child_avatar.set_size(value.get().unwrap()),
+ "selected" => obj.set_selected(value.get().unwrap()),
_ => unimplemented!(),
}
}
@@ -96,6 +97,27 @@ impl AvatarOverlaid {
glib::Object::new(&[]).expect("Failed to create AvatarOverlaid")
}
+ pub fn set_selected(&self, selected: bool) {
+ let priv_ = imp::AvatarOverlaid::from_instance(self);
+ let checkmark = priv_.checkmark.get_or_init(|| {
+ gtk::Image::builder()
+ .halign(gtk::Align::End)
+ .valign(gtk::Align::End)
+ .icon_name("emblem-default-symbolic")
+ .pixel_size(14)
+ .css_classes(vec!["blue-checkmark".into()])
+ .build()
+ });
+
+ if selected {
+ priv_.child_avatar.add_css_class("selected-avatar");
+ priv_.checkmark_overlay.add_overlay(checkmark);
+ } else {
+ priv_.child_avatar.remove_css_class("selected-avatar");
+ priv_.checkmark_overlay.remove_overlay(checkmark);
+ }
+ }
+
pub fn avatar(&self) -> &Avatar {
let priv_ = imp::AvatarOverlaid::from_instance(self);
&priv_.child_avatar
diff --git a/src/session/sidebar/account_switcher/user_entry.rs
b/src/session/sidebar/account_switcher/user_entry.rs
index 1b477360..1331c603 100644
--- a/src/session/sidebar/account_switcher/user_entry.rs
+++ b/src/session/sidebar/account_switcher/user_entry.rs
@@ -95,6 +95,10 @@ mod imp {
let user_id = value.get().unwrap();
obj.set_user_id(user_id);
}
+ "active" => {
+ let active = value.get().unwrap();
+ obj.set_active(active);
+ }
_ => unimplemented!(),
}
}
@@ -123,6 +127,15 @@ impl UserEntryRow {
glib::Object::new(&[]).expect("Failed to create AddAccountRow")
}
+ pub fn set_active(&self, active: bool) {
+ let priv_ = imp::UserEntryRow::from_instance(self);
+
+ priv_.avatar_component.set_selected(active);
+ priv_
+ .display_name
+ .set_css_classes(if active { &["bold"] } else { &[] });
+ }
+
pub fn set_avatar(&self, avatar_item: AvatarItem) {
let priv_ = imp::UserEntryRow::from_instance(self);
@@ -147,6 +160,17 @@ impl UserEntryRow {
pub fn bind_session_page(&self, session_page: >k::StackPage) {
let priv_ = imp::UserEntryRow::from_instance(self);
+ let active_exp = gtk::PropertyExpression::new::<gtk::PropertyExpression>(
+ gtk::StackPage::static_type(),
+ None,
+ "visible",
+ );
+ active_exp.bind::<glib::Object>(
+ self.upcast_ref(),
+ "active",
+ Some(session_page.upcast_ref()),
+ );
+
let session_exp = gtk::PropertyExpression::new::<gtk::PropertyExpression>(
gtk::StackPage::static_type(),
None,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]