diff --git a/src/Views/CategoryView.vala b/src/Views/CategoryView.vala
index b30f5ad56..500ad8391 100644
--- a/src/Views/CategoryView.vala
+++ b/src/Views/CategoryView.vala
@@ -15,11 +15,20 @@
* along with this program. If not, see .
*/
-public class AppCenter.CategoryView : Gtk.ScrolledWindow {
+public class AppCenter.CategoryView : Gtk.Stack {
public signal void show_app (AppCenterCore.Package package);
public AppStream.Category category { get; construct; }
+ private Gtk.ScrolledWindow scrolled;
+ private Gtk.Grid free_grid;
+ private Gtk.Grid grid;
+ private Gtk.Grid paid_grid;
+ private Gtk.Grid uncurated_grid;
+ private SubcategoryFlowbox free_flowbox;
+ private SubcategoryFlowbox paid_flowbox;
+ private SubcategoryFlowbox uncurated_flowbox;
+
public CategoryView (AppStream.Category category) {
Object (category: category);
}
@@ -30,9 +39,9 @@ public class AppCenter.CategoryView : Gtk.ScrolledWindow {
};
paid_header.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL);
- var paid_flowbox = new SubcategoryFlowbox ();
+ paid_flowbox = new SubcategoryFlowbox ();
- var paid_grid = new Gtk.Grid ();
+ paid_grid = new Gtk.Grid ();
paid_grid.attach (paid_header, 0, 0);
paid_grid.attach (paid_flowbox, 0, 1);
@@ -41,9 +50,9 @@ public class AppCenter.CategoryView : Gtk.ScrolledWindow {
};
free_header.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL);
- var free_flowbox = new SubcategoryFlowbox ();
+ free_flowbox = new SubcategoryFlowbox ();
- var free_grid = new Gtk.Grid ();
+ free_grid = new Gtk.Grid ();
free_grid.attach (free_header, 0, 0);
free_grid.attach (free_flowbox, 0, 1);
@@ -52,64 +61,37 @@ public class AppCenter.CategoryView : Gtk.ScrolledWindow {
};
uncurated_header.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL);
- var uncurated_flowbox = new SubcategoryFlowbox ();
+ uncurated_flowbox = new SubcategoryFlowbox ();
#if CURATED
- var uncurated_grid = new Gtk.Grid ();
+ uncurated_grid = new Gtk.Grid ();
uncurated_grid.attach (uncurated_header, 0, 0);
uncurated_grid.attach (uncurated_flowbox, 0, 1);
#endif
- unowned var client = AppCenterCore.Client.get_default ();
- foreach (var package in client.get_applications_for_category (category)) {
- // Don't show plugins or fonts in search and category views
- if (!package.is_plugin && !package.is_font) {
- var package_row = new AppCenter.Widgets.ListPackageRowGrid (package);
-
-#if CURATED
- if (package.is_native) {
- if (package.get_payments_key () != null && package.get_suggested_amount () != "0") {
- paid_flowbox.add (package_row);
- } else {
- free_flowbox.add (package_row);
- }
- } else {
- uncurated_flowbox.add (package_row);
- }
-#else
- uncurated_flowbox.add (package_row);
-#endif
-
- }
- }
-
- var grid = new Gtk.Grid () {
+ grid = new Gtk.Grid () {
margin = 12,
margin_bottom = 24,
orientation = Gtk.Orientation.VERTICAL,
row_spacing = 48
};
-#if CURATED
- if (paid_flowbox.get_child_at_index (0) != null) {
- grid.add (paid_grid);
- }
-
- if (free_flowbox.get_child_at_index (0) != null) {
- grid.add (free_grid);
- }
+ scrolled = new Gtk.ScrolledWindow (null, null) {
+ hscrollbar_policy = Gtk.PolicyType.NEVER
+ };
+ scrolled.add (grid);
- if (uncurated_flowbox.get_child_at_index (0) != null) {
- grid.add (uncurated_grid);
- }
-#else
- grid.add (uncurated_flowbox);
-#endif
- hscrollbar_policy = Gtk.PolicyType.NEVER;
- add (grid);
+ var spinner = new Gtk.Spinner () {
+ halign = Gtk.Align.CENTER
+ };
+ spinner.start ();
+ add (spinner);
+ add (scrolled);
show_all ();
+ populate ();
+
paid_flowbox.child_activated.connect ((child) => {
var row = (Widgets.ListPackageRowGrid) child.get_child ();
show_app (row.package);
@@ -124,6 +106,82 @@ public class AppCenter.CategoryView : Gtk.ScrolledWindow {
var row = (Widgets.ListPackageRowGrid) child.get_child ();
show_app (row.package);
});
+
+ AppCenterCore.Client.get_default ().installed_apps_changed.connect (() => {
+ populate ();
+ });
+ }
+
+ private void populate () {
+ get_packages.begin ((obj, res) => {
+ foreach (unowned var child in grid.get_children ()) {
+ grid.remove (child);
+ }
+
+ foreach (unowned var child in free_flowbox.get_children ()) {
+ child.destroy ();
+ }
+
+ foreach (unowned var child in paid_flowbox.get_children ()) {
+ child.destroy ();
+ }
+
+ foreach (unowned var child in uncurated_flowbox.get_children ()) {
+ child.destroy ();
+ }
+
+ var packages = get_packages.end (res);
+ foreach (var package in packages) {
+ if (!package.is_plugin && !package.is_font) {
+ var package_row = new AppCenter.Widgets.ListPackageRowGrid (package);
+#if CURATED
+ if (package.is_native) {
+ if (package.get_payments_key () != null && package.get_suggested_amount () != "0") {
+ paid_flowbox.add (package_row);
+ } else {
+ free_flowbox.add (package_row);
+ }
+ } else {
+ uncurated_flowbox.add (package_row);
+ }
+#else
+ uncurated_flowbox.add (package_row);
+#endif
+ }
+ }
+
+#if CURATED
+ if (paid_flowbox.get_child_at_index (0) != null) {
+ grid.add (paid_grid);
+ }
+
+ if (free_flowbox.get_child_at_index (0) != null) {
+ grid.add (free_grid);
+ }
+
+ if (uncurated_flowbox.get_child_at_index (0) != null) {
+ grid.add (uncurated_grid);
+ }
+#else
+ grid.add (uncurated_flowbox);
+#endif
+
+ show_all ();
+ visible_child = scrolled;
+ });
+ }
+
+ private async Gee.Collection get_packages () {
+ SourceFunc callback = get_packages.callback;
+
+ var packages = new Gee.TreeSet ();
+ new Thread ("get_packages", () => {
+ packages.add_all (AppCenterCore.Client.get_default ().get_applications_for_category (category));
+ Idle.add ((owned) callback);
+ });
+
+ yield;
+ return packages;
}
private class SubcategoryFlowbox : Gtk.FlowBox {
diff --git a/src/Views/Homepage.vala b/src/Views/Homepage.vala
index 482f6e367..457cad709 100644
--- a/src/Views/Homepage.vala
+++ b/src/Views/Homepage.vala
@@ -153,23 +153,6 @@ public class AppCenter.Homepage : AbstractView {
}
}
- // Remove any old cached category list views
- foreach (weak Gtk.Widget child in get_children ()) {
- if (child is Views.AppListView) {
- if (child != visible_child) {
- child.destroy ();
- } else {
- // If the category list view is visible, don't delete it, just make the package list right
- var list_view = child as Views.AppListView;
- list_view.clear ();
-
- unowned var client = AppCenterCore.Client.get_default ();
- var apps = client.get_applications_for_category (currently_viewed_category);
- list_view.add_packages (apps);
- }
- }
- }
-
return GLib.Source.REMOVE;
});
});