[gtk/wip/otte/sortlistmodel2: 27/27] gtk-demo: Add a progress bar when the colors demo resorts



commit 0777105682c75fe2c3597f572a2743fd2fe89070
Author: Benjamin Otte <otte redhat com>
Date:   Wed Jul 22 03:18:33 2020 +0200

    gtk-demo: Add a progress bar when the colors demo resorts

 demos/gtk-demo/listview_colors.c | 64 +++++++++++++++++++++++++---------------
 1 file changed, 40 insertions(+), 24 deletions(-)
---
diff --git a/demos/gtk-demo/listview_colors.c b/demos/gtk-demo/listview_colors.c
index 21f03e0be0..b735fd2a1c 100644
--- a/demos/gtk-demo/listview_colors.c
+++ b/demos/gtk-demo/listview_colors.c
@@ -662,8 +662,6 @@ create_color_grid (void)
 {
   GtkWidget *gridview;
   GtkListItemFactory *factory;
-  GListModel *selection;
-  GtkSortListModel *sort_model;
 
   gridview = gtk_grid_view_new ();
   gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
@@ -677,14 +675,6 @@ create_color_grid (void)
   gtk_grid_view_set_max_columns (GTK_GRID_VIEW (gridview), 24);
   gtk_grid_view_set_enable_rubberband (GTK_GRID_VIEW (gridview), TRUE);
 
-  sort_model = gtk_sort_list_model_new (gtk_color_list_new (0), NULL);
-  gtk_sort_list_model_set_incremental (sort_model, TRUE);
-
-  selection = G_LIST_MODEL (gtk_multi_selection_new (G_LIST_MODEL (sort_model)));
-  gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), selection);
-  g_object_unref (selection);
-  g_object_unref (sort_model);
-
   return gridview;
 }
 
@@ -837,6 +827,22 @@ update_selection_average (GListModel *model,
   g_object_unref (color);
 }
 
+static void
+update_progress_cb (GtkSortListModel *model,
+                    GParamSpec       *pspec,
+                    GtkProgressBar   *progress)
+{
+  guint total;
+  guint pending;
+
+  total = g_list_model_get_n_items (G_LIST_MODEL (model));
+  total = MAX (total, 1); /* avoid div by 0 below */
+  pending = gtk_sort_list_model_get_pending (model);
+
+  gtk_widget_set_visible (GTK_WIDGET (progress), pending != 0);
+  gtk_progress_bar_set_fraction (progress, (total - pending) / (double) total);
+}
+
 static GtkWidget *window = NULL;
 
 GtkWidget *
@@ -844,10 +850,11 @@ do_listview_colors (GtkWidget *do_widget)
 {
   if (window == NULL)
     {
-      GtkWidget *header, *gridview, *sw, *box, *dropdown;
+      GtkMultiSelection *selection;
+      GtkSortListModel *sort_model;
+      GtkWidget *header, *overlay, *gridview, *sw, *box, *dropdown;
       GtkListItemFactory *factory;
       GListStore *factories;
-      GListModel *model;
       GtkSorter *sorter;
       GtkSorter *multi_sorter;
       GListStore *sorters;
@@ -865,6 +872,7 @@ do_listview_colors (GtkWidget *do_widget)
       GtkWidget *selection_average_picture;
       GtkWidget *selection_info_toggle;
       GtkWidget *selection_info_revealer;
+      GtkWidget *progress;
       GtkCssProvider *provider;
 
       provider = gtk_css_provider_new ();
@@ -874,6 +882,10 @@ do_listview_colors (GtkWidget *do_widget)
                                                   800);
       g_object_unref (provider);
 
+      sort_model = gtk_sort_list_model_new (gtk_color_list_new (0), NULL);
+      gtk_sort_list_model_set_incremental (sort_model, TRUE);
+      selection = GTK_MULTI_SELECTION (gtk_multi_selection_new (G_LIST_MODEL (sort_model)));
+
       window = gtk_window_new ();
       gtk_window_set_title (GTK_WINDOW (window), "Colors");
       header = gtk_header_bar_new ();
@@ -884,8 +896,17 @@ do_listview_colors (GtkWidget *do_widget)
                               gtk_widget_get_display (do_widget));
       g_object_add_weak_pointer (G_OBJECT (window), (gpointer*)&window);
 
+      overlay = gtk_overlay_new ();
+      gtk_window_set_child (GTK_WINDOW (window), overlay);
+
       box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-      gtk_window_set_child (GTK_WINDOW (window), box);
+      gtk_overlay_set_child (GTK_OVERLAY (overlay), box);
+
+      progress = gtk_progress_bar_new ();
+      gtk_widget_set_hexpand (progress, TRUE);
+      gtk_widget_set_valign (progress, GTK_ALIGN_START);
+      g_signal_connect (sort_model, "notify::pending", G_CALLBACK (update_progress_cb), progress);
+      gtk_overlay_add_overlay (GTK_OVERLAY (overlay), progress);
 
       selection_info_revealer = gtk_revealer_new ();
       gtk_box_append (GTK_BOX (box), selection_info_revealer);
@@ -938,12 +959,12 @@ do_listview_colors (GtkWidget *do_widget)
       gtk_box_append (GTK_BOX (box), sw);
 
       gridview = create_color_grid ();
+      gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), G_LIST_MODEL (selection));
       gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), gridview);
       gtk_widget_set_hexpand (sw, TRUE);
       gtk_widget_set_vexpand (sw, TRUE);
-      model = gtk_grid_view_get_model (GTK_GRID_VIEW (gridview));
 
-      selection_filter = G_LIST_MODEL (gtk_selection_filter_model_new (GTK_SELECTION_MODEL (model)));
+      selection_filter = G_LIST_MODEL (gtk_selection_filter_model_new (GTK_SELECTION_MODEL (selection)));
       g_signal_connect (selection_filter, "items-changed", G_CALLBACK (update_selection_count), 
selection_size_label);
       g_signal_connect (selection_filter, "items-changed", G_CALLBACK (update_selection_average), 
selection_average_picture);
 
@@ -952,9 +973,6 @@ do_listview_colors (GtkWidget *do_widget)
       g_object_unref (selection_filter);
       g_object_unref (no_selection);
 
-      model = gtk_multi_selection_get_model (GTK_MULTI_SELECTION (model));
-      g_object_ref (model);
-
       selection_info_toggle = gtk_toggle_button_new ();
       gtk_button_set_icon_name (GTK_BUTTON (selection_info_toggle), "emblem-important-symbolic");
       gtk_widget_set_tooltip_text (selection_info_toggle, "Show selection info");
@@ -967,7 +985,7 @@ do_listview_colors (GtkWidget *do_widget)
       button = gtk_button_new_with_mnemonic ("_Refill");
       g_signal_connect (button, "clicked",
                         G_CALLBACK (refill),
-                        gtk_sort_list_model_get_model (GTK_SORT_LIST_MODEL (model)));
+                        gtk_sort_list_model_get_model (sort_model));
 
       gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button);
 
@@ -982,15 +1000,14 @@ do_listview_colors (GtkWidget *do_widget)
       gtk_label_set_width_chars (GTK_LABEL (label), len + 2);
       gtk_label_set_xalign (GTK_LABEL (label), 1);
 
-      g_signal_connect (gtk_grid_view_get_model (GTK_GRID_VIEW (gridview)),
-                        "items-changed", G_CALLBACK (items_changed_cb), label);
+      g_signal_connect (selection, "items-changed", G_CALLBACK (items_changed_cb), label);
       gtk_header_bar_pack_start (GTK_HEADER_BAR (header), label);
 
       dropdown = gtk_drop_down_new ();
       gtk_drop_down_set_from_strings (GTK_DROP_DOWN (dropdown), (const char *[]) { "8", "64", "512", "4096", 
"32768", "262144", "2097152", "16777216", NULL });
       g_signal_connect (dropdown, "notify::selected",
                         G_CALLBACK (limit_changed_cb), 
-                        gtk_sort_list_model_get_model (GTK_SORT_LIST_MODEL (model)));
+                        gtk_sort_list_model_get_model (sort_model));
       g_signal_connect (dropdown, "notify::selected",
                         G_CALLBACK (limit_changed_cb2), 
                         label);
@@ -1082,7 +1099,7 @@ do_listview_colors (GtkWidget *do_widget)
       gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (sorters));
       g_object_unref (sorters);
 
-      g_object_bind_property (dropdown, "selected-item", model, "sorter", G_BINDING_SYNC_CREATE);
+      g_object_bind_property (dropdown, "selected-item", sort_model, "sorter", G_BINDING_SYNC_CREATE);
 
       factories = g_list_store_new (GTK_TYPE_LIST_ITEM_FACTORY);
 
@@ -1114,7 +1131,6 @@ do_listview_colors (GtkWidget *do_widget)
       g_object_unref (factories);
 
       g_object_bind_property (dropdown, "selected-item", gridview, "factory", G_BINDING_SYNC_CREATE);
-      g_object_unref (model);
     }
 
   if (!gtk_widget_get_visible (window))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]