diff --git a/po/POTFILES b/po/POTFILES index 99529a2..eb1a914 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -8,7 +8,7 @@ src/DBus/SessionInterface.vala src/DBus/SystemInterface.vala src/DBus/UserInterface.vala src/Services/UserManager.vala -src/Widgets/CurrentUser.vala +src/Widgets/AvatarButton.vala src/Widgets/DarkModeToggle.vala src/Widgets/EndSessionDialog.vala src/Widgets/PreventSleepToggle.vala diff --git a/src/PopoverWidget.vala b/src/PopoverWidget.vala index 88bb9c2..9dd331c 100644 --- a/src/PopoverWidget.vala +++ b/src/PopoverWidget.vala @@ -54,7 +54,7 @@ public class QuickSettings.PopoverWidget : Gtk.Box { var scale_box = new Gtk.Box (VERTICAL, 0); - var current_user = new CurrentUser.avatar_only (); + var current_user = new AvatarButton (); current_user_button = new Gtk.Button () { child = current_user diff --git a/src/Widgets/AvatarButton.vala b/src/Widgets/AvatarButton.vala new file mode 100644 index 0000000..aaccf4e --- /dev/null +++ b/src/Widgets/AvatarButton.vala @@ -0,0 +1,73 @@ +/* + * SPDX-License-Identifier: GPL-3.0-or-later + * SPDX-FileCopyrightText: 2024 elementary, Inc. (https://elementary.io) + */ + + public class QuickSettings.AvatarButton : Gtk.Box { + private Act.User? user = null; + private Hdy.Avatar avatar; + + construct { + avatar = new Hdy.Avatar (32, null, true); + + // We want to use the user's accent, not a random color + avatar.get_style_context ().remove_class ("color1"); + avatar.get_style_context ().remove_class ("color2"); + avatar.get_style_context ().remove_class ("color3"); + avatar.get_style_context ().remove_class ("color4"); + avatar.get_style_context ().remove_class ("color5"); + avatar.get_style_context ().remove_class ("color6"); + avatar.get_style_context ().remove_class ("color7"); + avatar.get_style_context ().remove_class ("color8"); + avatar.get_style_context ().remove_class ("color9"); + avatar.get_style_context ().remove_class ("color10"); + avatar.get_style_context ().remove_class ("color11"); + avatar.get_style_context ().remove_class ("color12"); + avatar.get_style_context ().remove_class ("color13"); + avatar.get_style_context ().remove_class ("color14"); + + child = avatar; + + if (UserManager.get_usermanager ().is_loaded) { + update_current_user (); + } else { + UserManager.get_usermanager ().notify["is-loaded"].connect (() => { + update_current_user (); + }); + } + + UserManager.get_usermanager ().user_is_logged_in_changed.connect (() => { + update_current_user (); + }); + } + + private void update_current_user () { + user = UserManager.get_current_user (); + + if (user != null) { + user.changed.connect (() => { + update (); + }); + + update (); + } + } + + private GLib.LoadableIcon? get_avatar_icon () { + var file = File.new_for_path (user.get_icon_file ()); + if (file.query_exists ()) { + return new FileIcon (file); + } + + return null; + } + + private void update () { + if (user == null) { + return; + } + + avatar.text = user.real_name; + avatar.set_loadable_icon (get_avatar_icon ()); + } + } diff --git a/src/Widgets/CurrentUser.vala b/src/Widgets/CurrentUser.vala deleted file mode 100644 index eb84e5b..0000000 --- a/src/Widgets/CurrentUser.vala +++ /dev/null @@ -1,171 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-3.0-or-later - * SPDX-FileCopyrightText: 2024 elementary, Inc. (https://elementary.io) - */ - - public class QuickSettings.CurrentUser : Gtk.Box { - public bool minimal { get; construct; } - public Act.User? user { get; set; default = null; } - - private Hdy.Avatar avatar; - private Gtk.Label fullname_label; - private Gtk.Label status_label; - private Gtk.Button logout_button; - - public signal void logout (); - - public bool is_guest { - get { - return user == null; - } - } - - public CurrentUser.avatar_only () { - Object (minimal: true); - } - - public CurrentUser () { - Object (minimal: false); - } - - construct { - avatar = new Hdy.Avatar (minimal ? 32 : 48, null, true); - - // We want to use the user's accent, not a random color - unowned Gtk.StyleContext avatar_context = avatar.get_style_context (); - avatar_context.remove_class ("color1"); - avatar_context.remove_class ("color2"); - avatar_context.remove_class ("color3"); - avatar_context.remove_class ("color4"); - avatar_context.remove_class ("color5"); - avatar_context.remove_class ("color6"); - avatar_context.remove_class ("color7"); - avatar_context.remove_class ("color8"); - avatar_context.remove_class ("color9"); - avatar_context.remove_class ("color10"); - avatar_context.remove_class ("color11"); - avatar_context.remove_class ("color12"); - avatar_context.remove_class ("color13"); - avatar_context.remove_class ("color14"); - - fullname_label = new Gtk.Label (null) { - valign = Gtk.Align.END, - halign = Gtk.Align.START - }; - fullname_label.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL); - - status_label = new Gtk.Label (null) { - valign = Gtk.Align.START, - halign = Gtk.Align.START - }; - status_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL); - status_label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL); - - logout_button = new Gtk.Button.from_icon_name ("system-log-out-symbolic") { - tooltip_text = _("Log Out…"), - hexpand = true, - halign = END, - valign = CENTER - }; - logout_button.get_style_context ().add_class ("circular"); - - if (minimal) { - add (avatar); - } else { - var grid = new Gtk.Grid () { - column_spacing = 12 - }; - grid.attach (avatar, 0, 0, 1, 2); - grid.attach (fullname_label, 1, 0, 1, 1); - grid.attach (status_label, 1, 1, 1, 1); - grid.attach (logout_button, 2, 0, 2, 2); - grid.show_all (); - - get_style_context ().add_class ("menuitem"); - - add (grid); - } - - if (UserManager.get_usermanager ().is_loaded) { - update_current_user (); - } else { - UserManager.get_usermanager ().notify["is-loaded"].connect (() => { - update_current_user (); - }); - } - - UserManager.get_usermanager ().user_is_logged_in_changed.connect (() => { - update_current_user (); - }); - - var keybinding_settings = new Settings ("org.gnome.settings-daemon.plugins.media-keys"); - - logout_button.tooltip_markup = Granite.markup_accel_tooltip ( - keybinding_settings.get_strv ("logout"), _("Log Out…") - ); - - keybinding_settings.changed["logout"].connect (() => { - logout_button.tooltip_markup = Granite.markup_accel_tooltip ( - keybinding_settings.get_strv ("logout"), _("Log Out…") - ); - }); - - logout_button.clicked.connect (() => { - logout (); - }); - } - - public void update_current_user () { - user = UserManager.get_current_user (); - - if (user == null) { - fullname_label.label = _("Guest"); - update_state.begin (); - } else { - user.changed.connect (() => { - update (); - update_state.begin (); - }); - - update (); - update_state.begin (); - } - } - - private GLib.LoadableIcon? get_avatar_icon () { - var file = File.new_for_path (user.get_icon_file ()); - if (file.query_exists ()) { - return new FileIcon (file); - } - - return null; - } - - public async void update_state () { - UserState state = yield get_user_state (); - - if (state == UserState.ACTIVE || state == UserState.ONLINE) { - status_label.label = _("Logged in"); - } else { - status_label.label = _("Logged out"); - } - } - - public async UserState get_user_state () { - if (is_guest) { - return yield UserManager.get_guest_state (); - } else { - return yield UserManager.get_user_state (user.get_uid ()); - } - } - - private void update () { - if (user == null) { - return; - } - - fullname_label.label = user.real_name; - avatar.text = user.real_name; - avatar.set_loadable_icon (get_avatar_icon ()); - } - } diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 8384f38..d14b965 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -24,7 +24,8 @@ }, (k1, k2) => { return k1 == k2; }); - var current_user = new CurrentUser (); + + var current_user = new UserRow (UserManager.get_current_user ()); listbox = new Gtk.ListBox () { hexpand = true @@ -185,7 +186,7 @@ return; } - user_map[GUEST_USER_UID] = new UserRow.guest (); + user_map[GUEST_USER_UID] = new UserRow (null); user_map[GUEST_USER_UID].show (); listbox.add (user_map[GUEST_USER_UID]); diff --git a/src/Widgets/UserRow.vala b/src/Widgets/UserRow.vala index 87fdd40..a3f6202 100644 --- a/src/Widgets/UserRow.vala +++ b/src/Widgets/UserRow.vala @@ -4,7 +4,7 @@ */ public class QuickSettings.UserRow : Gtk.ListBoxRow { - private const int ICON_SIZE = 32; + public signal void logout (); public Act.User? user { get; construct; default = null; } public string fullname { get; construct set; } @@ -20,16 +20,8 @@ public class QuickSettings.UserRow : Gtk.ListBoxRow { private Gtk.Label fullname_label; private Gtk.Label status_label; - public UserRow (Act.User user) { - Object ( - user: user - ); - } - - public UserRow.guest () { - Object ( - fullname: _("Guest") - ); + public UserRow (Act.User? user) { + Object (user: user); } construct { @@ -46,27 +38,28 @@ public class QuickSettings.UserRow : Gtk.ListBoxRow { status_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL); status_label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL); + var pixel_size = user == UserManager.get_current_user () ? 48 : 32; + if (user == null) { - avatar = new Hdy.Avatar (ICON_SIZE, null, false); + avatar = new Hdy.Avatar (pixel_size, null, false); // We want to use the user's accent, not a random color - unowned Gtk.StyleContext avatar_context = avatar.get_style_context (); - avatar_context.remove_class ("color1"); - avatar_context.remove_class ("color2"); - avatar_context.remove_class ("color3"); - avatar_context.remove_class ("color4"); - avatar_context.remove_class ("color5"); - avatar_context.remove_class ("color6"); - avatar_context.remove_class ("color7"); - avatar_context.remove_class ("color8"); - avatar_context.remove_class ("color9"); - avatar_context.remove_class ("color10"); - avatar_context.remove_class ("color11"); - avatar_context.remove_class ("color12"); - avatar_context.remove_class ("color13"); - avatar_context.remove_class ("color14"); + avatar.get_style_context ().remove_class ("color1"); + avatar.get_style_context ().remove_class ("color2"); + avatar.get_style_context ().remove_class ("color3"); + avatar.get_style_context ().remove_class ("color4"); + avatar.get_style_context ().remove_class ("color5"); + avatar.get_style_context ().remove_class ("color6"); + avatar.get_style_context ().remove_class ("color7"); + avatar.get_style_context ().remove_class ("color8"); + avatar.get_style_context ().remove_class ("color9"); + avatar.get_style_context ().remove_class ("color10"); + avatar.get_style_context ().remove_class ("color11"); + avatar.get_style_context ().remove_class ("color12"); + avatar.get_style_context ().remove_class ("color13"); + avatar.get_style_context ().remove_class ("color14"); } else { - avatar = new Hdy.Avatar (ICON_SIZE, fullname, true); + avatar = new Hdy.Avatar (pixel_size, fullname, true); avatar.set_loadable_icon (get_avatar_icon ()); user.changed.connect (() => { @@ -78,13 +71,41 @@ public class QuickSettings.UserRow : Gtk.ListBoxRow { column_spacing = 12 }; grid.attach (avatar, 0, 0, 1, 2); - grid.attach (fullname_label, 1, 0, 1, 1); - grid.attach (status_label, 1, 1, 1, 1); - grid.show_all (); + grid.attach (fullname_label, 1, 0); + grid.attach (status_label, 1, 1); get_style_context ().add_class ("menuitem"); child = grid; + if (user == UserManager.get_current_user ()) { + var logout_button = new Gtk.Button.from_icon_name ("system-log-out-symbolic") { + tooltip_text = _("Log Out…"), + hexpand = true, + halign = END, + valign = CENTER + }; + logout_button.get_style_context ().add_class ("circular"); + + grid.attach (logout_button, 2, 0, 2, 2); + + var keybinding_settings = new Settings ("org.gnome.settings-daemon.plugins.media-keys"); + + logout_button.tooltip_markup = Granite.markup_accel_tooltip ( + keybinding_settings.get_strv ("logout"), _("Log Out…") + ); + + keybinding_settings.changed["logout"].connect (() => { + logout_button.tooltip_markup = Granite.markup_accel_tooltip ( + keybinding_settings.get_strv ("logout"), _("Log Out…") + ); + }); + + logout_button.clicked.connect (() => { + logout (); + }); + } + + show_all (); update_state.begin (); } @@ -111,7 +132,7 @@ public class QuickSettings.UserRow : Gtk.ListBoxRow { selectable = state != UserState.ACTIVE; activatable = state != UserState.ACTIVE; - if (state == UserState.ACTIVE || state == UserState.ONLINE) { + if (state == UserState.ACTIVE || state == UserState.ONLINE || UserManager.get_current_user () == null) { status_label.label = _("Logged in"); } else { status_label.label = _("Logged out"); @@ -126,6 +147,8 @@ public class QuickSettings.UserRow : Gtk.ListBoxRow { if (user.locked) { status_label.label = _("Locked"); } + } else { + fullname_label.label = _("Guest"); } ((Gtk.ListBox) parent).invalidate_sort (); diff --git a/src/meson.build b/src/meson.build index f4becd8..7a0cd82 100644 --- a/src/meson.build +++ b/src/meson.build @@ -18,7 +18,7 @@ sources = [ 'DBus' / 'SystemInterface.vala', 'DBus' / 'UserInterface.vala', 'Services' / 'UserManager.vala', - 'Widgets' / 'CurrentUser.vala', + 'Widgets' / 'AvatarButton.vala', 'Widgets' / 'DarkModeToggle.vala', 'Widgets' / 'EndSessionDialog.vala', 'Widgets' / 'PreventSleepToggle.vala',