From 13c01b1424d1ab86ee775bd0752b5e8d339dd0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 3 Feb 2025 15:06:20 -0800 Subject: [PATCH 1/6] UserList: rewrite using listmodel --- src/Widgets/UserList.vala | 112 +++++++++++++++----------------------- 1 file changed, 45 insertions(+), 67 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 4db8018..7448c40 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -12,7 +12,7 @@ private const string DM_DBUS_ID = "org.freedesktop.DisplayManager"; - private Gee.HashMap user_map = new Gee.HashMap (); + private GLib.ListStore user_list; private const uint GUEST_USER_UID = 999; private const uint NOBODY_USER_UID = 65534; @@ -25,11 +25,12 @@ construct { var current_user = new CurrentUser (); + user_list = new GLib.ListStore (typeof (Act.User)); + listbox = new Gtk.ListBox () { hexpand = true }; - listbox.set_sort_func (sort_func); - listbox.set_filter_func (set_filter_func); + listbox.bind_model (user_list, create_widget_func); listbox_scrolled = new Gtk.ScrolledWindow (null, null) { hscrollbar_policy = NEVER, @@ -145,92 +146,77 @@ } private void init_users () { - foreach (Act.User user in UserManager.get_usermanager ().list_users ()) { + foreach (unowned var user in UserManager.get_usermanager ().list_users ()) { add_user (user); } } private void add_user (Act.User? user) { + // FIXME: is this not covered by is current? + // if (user_row.is_guest) { + // return UserManager.get_current_user () != null; + // } + + if (UserManager.is_current_user (user)) { + return; + } + // Don't add any of the system reserved users - var uid = user.get_uid (); - if (uid < RESERVED_UID_RANGE_END || - uid == NOBODY_USER_UID || - user_map.has_key (uid)) { + if (user.is_system_account ()) { return; } - user_map[uid] = new UserRow (user); - user_map[uid].show (); + uint pos = -1; + if (user_list.find_with_equal_func (user, equal_func, out pos)) { + return; + } - listbox.add (user_map[uid]); - listbox.invalidate_sort (); - enable_scroll_if_needed (); + user_list.insert_sorted (user, compare_func); } private void add_guest () { - if (user_map[GUEST_USER_UID] != null) { - return; - } + // if (user_map[GUEST_USER_UID] != null) { + // return; + // } - user_map[GUEST_USER_UID] = new UserRow.guest (); - user_map[GUEST_USER_UID].show (); + // user_map[GUEST_USER_UID] = new UserRow.guest (); + // user_map[GUEST_USER_UID].show (); - listbox.add (user_map[GUEST_USER_UID]); - listbox.invalidate_sort (); - enable_scroll_if_needed (); + // listbox.add (user_map[GUEST_USER_UID]); + // listbox.invalidate_sort (); + // enable_scroll_if_needed (); } private void remove_user (Act.User user) { - var uid = user.get_uid (); - var user_row = user_map[uid]; - if (user_row == null) { - return; + uint pos = -1; + if (user_list.find_with_equal_func (user, (EqualFunc) equal_func, out pos)) { + user_list.remove (pos); } - - user_map.unset (uid); - listbox.remove (user_row); - listbox.invalidate_sort (); - enable_scroll_if_needed (); } private void update_user (Act.User user) { - var userbox = user_map[user.get_uid ()]; - if (userbox == null) { - return; - } - - userbox.update_state.begin (); - listbox.invalidate_filter (); - enable_scroll_if_needed (); + // FIXME: Can we update instead of add/remove? + remove_user (user); + add_user (user); } - public void update_all () { - foreach (UserRow row in user_map.values) { - row.update_state.begin (); - } + private Gtk.Widget create_widget_func (Object object) { + var user = (Act.User) object; + + return new UserRow (user); } - public int sort_func (Gtk.ListBoxRow row1, Gtk.ListBoxRow row2) { - var userbox1 = (UserRow) row1; - var userbox2 = (UserRow) row2; + private int compare_func (Object a, Object b) { + var user_a = (Act.User) a; + var user_b = (Act.User) b; - if (userbox1.is_guest && !userbox2.is_guest) { - return 1; - } else if (!userbox1.is_guest && userbox2.is_guest) { - return -1; - } + //TODO: handle guest? - return userbox1.user.collate (userbox2.user); + return user_a.collate (user_b); } - public bool set_filter_func (Gtk.ListBoxRow row) { - var user_row = (UserRow) row; - - if (user_row.is_guest) { - return UserManager.get_current_user () != null; - } - - return !UserManager.is_current_user (user_row.user); + private static bool equal_func (Object a, Object b) { + return ((Act.User) a).uid == ((Act.User) b).uid; } private void show_settings () { @@ -240,12 +226,4 @@ warning ("%s\n", e.message); } } - - private void enable_scroll_if_needed () { - if (user_map.size > MAX_ITEMS_BEFORE_SCROLL + 1) { - listbox_scrolled.vscrollbar_policy = ALWAYS; - } else { - listbox_scrolled.vscrollbar_policy = NEVER; - } - } } From 06b4dfead7b1673ebfdc863dc3d1886819809506 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 3 Feb 2025 15:14:31 -0800 Subject: [PATCH 2/6] Some cleanups --- src/Widgets/UserList.vala | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 12ec90c..c4b0a34 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -4,30 +4,23 @@ */ public class QuickSettings.UserList : Gtk.Box { - private Gtk.ListBox listbox; - private Gtk.ScrolledWindow listbox_scrolled; - private Gtk.Popover? popover; - - private SeatInterface? dm_proxy = null; + public signal void switch_to_guest (); + public signal void switch_to_user (string username); private const string DM_DBUS_ID = "org.freedesktop.DisplayManager"; - - private GLib.ListStore user_list; - private const uint GUEST_USER_UID = 999; - private const uint NOBODY_USER_UID = 65534; - private const uint RESERVED_UID_RANGE_END = 1000; - private const uint MAX_ITEMS_BEFORE_SCROLL = 4; - public signal void switch_to_guest (); - public signal void switch_to_user (string username); + private GLib.ListStore user_list; + private Gtk.ScrolledWindow listbox_scrolled; + private Gtk.Popover? popover; + private SeatInterface? dm_proxy = null; construct { var current_user = new CurrentUser (); user_list = new GLib.ListStore (typeof (Act.User)); - listbox = new Gtk.ListBox () { + var listbox = new Gtk.ListBox () { hexpand = true }; listbox.bind_model (user_list, create_widget_func); @@ -45,11 +38,9 @@ var main_box = new Gtk.Box (VERTICAL, 0); main_box.add (current_user); - main_box.add (new Gtk.Separator (Gtk.Orientation.HORIZONTAL)); + main_box.add (new Gtk.Separator (HORIZONTAL)); main_box.add (listbox_scrolled); - main_box.add (new Gtk.Separator (Gtk.Orientation.HORIZONTAL) { - margin_top = 3 - }); + main_box.add (new Gtk.Separator (HORIZONTAL)); main_box.add (settings_button); add (main_box); @@ -64,7 +55,7 @@ UserManager.get_usermanager ().user_added.connect (add_user); UserManager.get_usermanager ().user_removed.connect (remove_user); - UserManager.get_usermanager ().user_is_logged_in_changed.connect (update_user); + UserManager.get_usermanager ().user_is_logged_in_changed.connect (current_user.update_current_user); var seat_path = Environment.get_variable ("XDG_SEAT_PATH"); var session_path = Environment.get_variable ("XDG_SESSION_PATH"); @@ -193,10 +184,6 @@ } } - private void update_user (Act.User user) { - // FIXME: I think this is only for the currently logged user so this isn't a list thing - } - private Gtk.Widget create_widget_func (Object object) { var user = (Act.User) object; From e17e00bd1149426a9e283eca867ed5e3d5367174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 3 Feb 2025 15:14:53 -0800 Subject: [PATCH 3/6] reduce scrolled scope --- src/Widgets/UserList.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index c4b0a34..7b691e0 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -11,7 +11,6 @@ private const uint GUEST_USER_UID = 999; private GLib.ListStore user_list; - private Gtk.ScrolledWindow listbox_scrolled; private Gtk.Popover? popover; private SeatInterface? dm_proxy = null; @@ -25,7 +24,7 @@ }; listbox.bind_model (user_list, create_widget_func); - listbox_scrolled = new Gtk.ScrolledWindow (null, null) { + var listbox_scrolled = new Gtk.ScrolledWindow (null, null) { hscrollbar_policy = NEVER, max_content_height = 200, propagate_natural_height = true, From 217f9bc8b04494bba76f42742ef6dc7afb4c438a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 3 Feb 2025 15:23:46 -0800 Subject: [PATCH 4/6] Remove commented code --- src/Widgets/UserList.vala | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 7b691e0..938e817 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -164,16 +164,7 @@ } private void add_guest () { - // if (user_map[GUEST_USER_UID] != null) { - // return; - // } - - // user_map[GUEST_USER_UID] = new UserRow.guest (); - // user_map[GUEST_USER_UID].show (); - - // listbox.add (user_map[GUEST_USER_UID]); - // listbox.invalidate_sort (); - // enable_scroll_if_needed (); + } private void remove_user (Act.User user) { @@ -186,6 +177,10 @@ private Gtk.Widget create_widget_func (Object object) { var user = (Act.User) object; + if (user.uid == GUEST_USER_UID) { + return new UserRow.guest (); + } + return new UserRow (user); } From 783f4765fc6b7dc51256384ba9f00ae6c3384006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 3 Feb 2025 15:26:51 -0800 Subject: [PATCH 5/6] Remove nested box --- src/Widgets/UserList.vala | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 938e817..3d75db5 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -35,14 +35,12 @@ text = _("User Accounts Settings…") }; - var main_box = new Gtk.Box (VERTICAL, 0); - main_box.add (current_user); - main_box.add (new Gtk.Separator (HORIZONTAL)); - main_box.add (listbox_scrolled); - main_box.add (new Gtk.Separator (HORIZONTAL)); - main_box.add (settings_button); - - add (main_box); + orientation = VERTICAL; + add (current_user); + add (new Gtk.Separator (HORIZONTAL)); + add (listbox_scrolled); + add (new Gtk.Separator (HORIZONTAL)); + add (settings_button); if (UserManager.get_usermanager ().is_loaded) { init_users (); From 416e894eb91ea770c4847cb43c8d424b3b497486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Mon, 24 Feb 2025 14:55:14 -0800 Subject: [PATCH 6/6] Handle guest --- src/Widgets/UserList.vala | 51 ++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/Widgets/UserList.vala b/src/Widgets/UserList.vala index 3d75db5..d15d68d 100644 --- a/src/Widgets/UserList.vala +++ b/src/Widgets/UserList.vala @@ -31,14 +31,24 @@ child = listbox }; + var guest_row = new UserRow.guest (); + + var guest_listbox = new Gtk.ListBox () { + hexpand = true + }; + guest_listbox.add (guest_row); + + var user_list_vbox = new Gtk.Box (VERTICAL, 0); + user_list_vbox.add (new Gtk.Separator (HORIZONTAL)); + user_list_vbox.add (listbox_scrolled); + var settings_button = new Gtk.ModelButton () { text = _("User Accounts Settings…") }; orientation = VERTICAL; add (current_user); - add (new Gtk.Separator (HORIZONTAL)); - add (listbox_scrolled); + add (user_list_vbox); add (new Gtk.Separator (HORIZONTAL)); add (settings_button); @@ -62,7 +72,7 @@ dm_proxy = Bus.get_proxy_sync (BusType.SYSTEM, DM_DBUS_ID, seat_path, DBusProxyFlags.NONE); if (dm_proxy.has_guest_account && UserManager.get_current_user () != null) { - add_guest (); + user_list_vbox.add (guest_listbox); } } catch (IOError e) { critical ("UserManager error: %s", e.message); @@ -95,13 +105,9 @@ popover.popdown (); - if (userbox.is_guest) { - switch_to_guest (); - } else { - var user = userbox.user; - if (user != null) { - switch_to_user (user.get_user_name ()); - } + var user = userbox.user; + if (user != null) { + switch_to_user (user.get_user_name ()); } }); @@ -130,6 +136,16 @@ }); }); }); + + guest_listbox.row_activated.connect (() => { + popover.popdown (); + switch_to_guest (); + }); + + user_list_vbox.visible = user_list.n_items > 0 || guest_listbox.parent != null; + user_list.items_changed.connect (() => { + user_list_vbox.visible = user_list.n_items > 0 || guest_listbox.parent != null; + }); } private void init_users () { @@ -139,11 +155,6 @@ } private void add_user (Act.User? user) { - // FIXME: is this not covered by is current? - // if (user_row.is_guest) { - // return UserManager.get_current_user () != null; - // } - if (UserManager.is_current_user (user)) { return; } @@ -161,10 +172,6 @@ user_list.insert_sorted (user, compare_func); } - private void add_guest () { - - } - private void remove_user (Act.User user) { uint pos = -1; if (user_list.find_with_equal_func (user, (EqualFunc) equal_func, out pos)) { @@ -175,10 +182,6 @@ private Gtk.Widget create_widget_func (Object object) { var user = (Act.User) object; - if (user.uid == GUEST_USER_UID) { - return new UserRow.guest (); - } - return new UserRow (user); } @@ -186,8 +189,6 @@ var user_a = (Act.User) a; var user_b = (Act.User) b; - //TODO: handle guest? - return user_a.collate (user_b); }