From dcae4e16463f63dd60a1094508756f4ecd5a3292 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Tue, 17 Feb 2026 02:33:59 +0100 Subject: [PATCH 1/3] AppListUpdateView: Add a queue of working packages --- src/Core/FlatpakBackend.vala | 24 +++++++++++------------- src/Core/Package.vala | 3 +++ src/Views/AppListUpdateView.vala | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/Core/FlatpakBackend.vala b/src/Core/FlatpakBackend.vala index a5cc8e729..3a2ca09d4 100644 --- a/src/Core/FlatpakBackend.vala +++ b/src/Core/FlatpakBackend.vala @@ -90,9 +90,12 @@ public class AppCenterCore.FlatpakBackend : Object, Backend { // Right now only for runtime updates private GLib.ListStore additional_updates; - private Gtk.SortListModel _updatable_packages; + private Gtk.FilterListModel _updatable_packages; public ListModel updatable_packages { get { return _updatable_packages; } } + public ListModel working_packages { get; private set; } + + public bool has_working_packages { get { return working_packages.get_n_items () > 0; } } public bool has_updatable_packages { get { return _updatable_packages.n_items > 0; } } public uint n_updatable_packages { get { return _updatable_packages.n_items; } } public uint n_unpaid_updatable_packages { @@ -273,19 +276,8 @@ public class AppCenterCore.FlatpakBackend : Object, Backend { var flatten_model = new Gtk.FlattenListModel (updates_models); var updatable_filter = new Gtk.BoolFilter (update_available_expression); - var updating_filter = new Gtk.BoolFilter (updating_expression); - - var updatable_any_filter = new Gtk.AnyFilter (); - updatable_any_filter.append (updatable_filter); - updatable_any_filter.append (updating_filter); - var updatable_packages = new Gtk.FilterListModel (flatten_model, updatable_any_filter); - - var updating_sorter = new Gtk.NumericSorter (updating_expression) { - sort_order = DESCENDING - }; - - _updatable_packages = new Gtk.SortListModel (updatable_packages, updating_sorter); + _updatable_packages = new Gtk.FilterListModel (flatten_model, updatable_filter); _updatable_packages.items_changed.connect (() => { notify_property ("has-updatable-packages"); notify_property ("n-updatable-packages"); @@ -294,6 +286,12 @@ public class AppCenterCore.FlatpakBackend : Object, Backend { notify_property ("up-to-date"); }); + var working_expression = new Gtk.PropertyExpression (typeof (Package), null, "working"); + var working_filter = new Gtk.BoolFilter (working_expression); + + working_packages = new Gtk.FilterListModel (_sorted_packages, working_filter); + working_packages.items_changed.connect (() => notify_property ("has-working-packages")); + worker_thread = new Thread ("flatpak-worker", worker_func); user_appstream_pool = new AppStream.Pool (); user_appstream_pool.set_flags (AppStream.PoolFlags.LOAD_OS_CATALOG); diff --git a/src/Core/Package.vala b/src/Core/Package.vala index cc11a651a..7271b136c 100644 --- a/src/Core/Package.vala +++ b/src/Core/Package.vala @@ -103,6 +103,8 @@ public class AppCenterCore.Package : Object { public ChangeInformation change_information { public get; private set; } public State state { public get; private set; default = State.NOT_INSTALLED; } + public bool working { get { return state == INSTALLING || state == UPDATING || state == REMOVING; } } + public double progress { get { return change_information.progress; @@ -446,6 +448,7 @@ public class AppCenterCore.Package : Object { // Only trigger a notify if the state has changed, quite a lot of things listen to this if (state != new_state) { state = new_state; + notify_property ("working"); backend.notify_package_changed (this); } } diff --git a/src/Views/AppListUpdateView.vala b/src/Views/AppListUpdateView.vala index f05500928..ae1f6a3d6 100644 --- a/src/Views/AppListUpdateView.vala +++ b/src/Views/AppListUpdateView.vala @@ -20,6 +20,22 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { var update_manager = AppCenterCore.UpdateManager.get_default (); unowned var flatpak_backend = AppCenterCore.FlatpakBackend.get_default (); + var downloads_header = new Granite.HeaderLabel (_("Downloads")) { + margin_end = 12, + margin_start = 12 + }; + + var downloads_list = new Gtk.ListBox () { + activate_on_single_click = true, + hexpand = true, + }; + downloads_list.bind_model (flatpak_backend.working_packages, create_row_from_package); + + var downloads_section = new Granite.Box (VERTICAL, HALF); + downloads_section.append (downloads_header); + downloads_section.append (downloads_list); + flatpak_backend.bind_property ("has-working-packages", downloads_section, "visible", SYNC_CREATE); + var updatable_header_label = new Granite.HeaderLabel (_("Available Updates")) { hexpand = true, valign = CENTER @@ -93,6 +109,7 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { flatpak_backend.bind_property ("has-updated-packages", installed_section, "visible", SYNC_CREATE); var box = new Granite.Box (VERTICAL, SINGLE); + box.append (downloads_section); box.append (updatable_section); box.append (installed_section); From a6643c7ebc9bcdf55517d29d551ba23393bcec14 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 26 Feb 2026 16:39:16 +0100 Subject: [PATCH 2/3] Rename to in progress --- src/Views/AppListUpdateView.vala | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Views/AppListUpdateView.vala b/src/Views/AppListUpdateView.vala index ae1f6a3d6..624de84a9 100644 --- a/src/Views/AppListUpdateView.vala +++ b/src/Views/AppListUpdateView.vala @@ -20,21 +20,21 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { var update_manager = AppCenterCore.UpdateManager.get_default (); unowned var flatpak_backend = AppCenterCore.FlatpakBackend.get_default (); - var downloads_header = new Granite.HeaderLabel (_("Downloads")) { + var in_progress_header = new Granite.HeaderLabel (_("In Progress")) { margin_end = 12, margin_start = 12 }; - var downloads_list = new Gtk.ListBox () { + var in_progress_list = new Gtk.ListBox () { activate_on_single_click = true, hexpand = true, }; - downloads_list.bind_model (flatpak_backend.working_packages, create_row_from_package); + in_progress_list.bind_model (flatpak_backend.working_packages, create_row_from_package); - var downloads_section = new Granite.Box (VERTICAL, HALF); - downloads_section.append (downloads_header); - downloads_section.append (downloads_list); - flatpak_backend.bind_property ("has-working-packages", downloads_section, "visible", SYNC_CREATE); + var in_progress_section = new Granite.Box (VERTICAL, HALF); + in_progress_section.append (in_progress_header); + in_progress_section.append (in_progress_list); + flatpak_backend.bind_property ("has-working-packages", in_progress_section, "visible", SYNC_CREATE); var updatable_header_label = new Granite.HeaderLabel (_("Available Updates")) { hexpand = true, @@ -108,8 +108,8 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { installed_section.append (installed_flowbox); flatpak_backend.bind_property ("has-updated-packages", installed_section, "visible", SYNC_CREATE); - var box = new Granite.Box (VERTICAL, SINGLE); - box.append (downloads_section); + var box = new Granite.Box (VERTICAL, DOUBLE); + box.append (in_progress_section); box.append (updatable_section); box.append (installed_section); From c073367884979a215a4c795bb3443dad6c2c06e6 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 26 Feb 2026 19:37:42 +0100 Subject: [PATCH 3/3] Move in progress between available and installed --- src/Views/AppListUpdateView.vala | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Views/AppListUpdateView.vala b/src/Views/AppListUpdateView.vala index 624de84a9..c4350b5e1 100644 --- a/src/Views/AppListUpdateView.vala +++ b/src/Views/AppListUpdateView.vala @@ -20,22 +20,6 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { var update_manager = AppCenterCore.UpdateManager.get_default (); unowned var flatpak_backend = AppCenterCore.FlatpakBackend.get_default (); - var in_progress_header = new Granite.HeaderLabel (_("In Progress")) { - margin_end = 12, - margin_start = 12 - }; - - var in_progress_list = new Gtk.ListBox () { - activate_on_single_click = true, - hexpand = true, - }; - in_progress_list.bind_model (flatpak_backend.working_packages, create_row_from_package); - - var in_progress_section = new Granite.Box (VERTICAL, HALF); - in_progress_section.append (in_progress_header); - in_progress_section.append (in_progress_list); - flatpak_backend.bind_property ("has-working-packages", in_progress_section, "visible", SYNC_CREATE); - var updatable_header_label = new Granite.HeaderLabel (_("Available Updates")) { hexpand = true, valign = CENTER @@ -86,6 +70,22 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { updatable_section.append (list_box); flatpak_backend.bind_property ("has-updatable-packages", updatable_section, "visible", SYNC_CREATE); + var in_progress_header = new Granite.HeaderLabel (_("In Progress")) { + margin_end = 12, + margin_start = 12 + }; + + var in_progress_list = new Gtk.ListBox () { + activate_on_single_click = true, + hexpand = true, + }; + in_progress_list.bind_model (flatpak_backend.working_packages, create_row_from_package); + + var in_progress_section = new Granite.Box (VERTICAL, HALF); + in_progress_section.append (in_progress_header); + in_progress_section.append (in_progress_list); + flatpak_backend.bind_property ("has-working-packages", in_progress_section, "visible", SYNC_CREATE); + installed_header = new Granite.HeaderLabel (_("Up to Date")) { margin_end = 12, margin_start = 12 @@ -109,8 +109,8 @@ public class AppCenter.Views.AppListUpdateView : Adw.NavigationPage { flatpak_backend.bind_property ("has-updated-packages", installed_section, "visible", SYNC_CREATE); var box = new Granite.Box (VERTICAL, DOUBLE); - box.append (in_progress_section); box.append (updatable_section); + box.append (in_progress_section); box.append (installed_section); var clamp = new Adw.Clamp () {