[gtk/wip/otte/sortlistmodel2: 27/27] gtk-demo: Add a progress bar when the colors demo resorts
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/sortlistmodel2: 27/27] gtk-demo: Add a progress bar when the colors demo resorts
- Date: Wed, 22 Jul 2020 12:08:51 +0000 (UTC)
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]