[gtk/inclement-weather] Refine the colors demo



commit 0fb009235be94829a4fbee2f4e32a599196247f7
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jun 20 14:34:03 2020 -0400

    Refine the colors demo
    
    Make the repopulation triggered from the ui, show
    the current model size in the header, and do the
    incremental refilling a bit faster by not going
    one-item-per-frame, but use 4ms of each frame to
    add items.

 demos/gtk-demo/listview_colors.c | 134 ++++++++++++++++++++++++++++++---------
 1 file changed, 104 insertions(+), 30 deletions(-)
---
diff --git a/demos/gtk-demo/listview_colors.c b/demos/gtk-demo/listview_colors.c
index 443b704c69..420ddc7b38 100644
--- a/demos/gtk-demo/listview_colors.c
+++ b/demos/gtk-demo/listview_colors.c
@@ -244,6 +244,7 @@ gtk_color_new (const char *name,
 
 typedef struct
 {
+  GtkWidget *widget;
   GBytes *data;
   GListStore *store;
   char **lines;
@@ -256,6 +257,8 @@ free_color_data (gpointer data)
 {
   ColorData *cd = data;
 
+  if (cd->widget)
+    gtk_widget_set_sensitive (cd->widget, TRUE);
   g_bytes_unref (cd->data);
   g_object_unref (cd->store);
   g_strfreev (cd->lines);
@@ -263,9 +266,9 @@ free_color_data (gpointer data)
 }
 
 static gboolean
-add_one_color (GtkWidget     *widget,
-               GdkFrameClock *clock,
-               gpointer       data)
+add_color (GtkWidget     *widget,
+           GdkFrameClock *clock,
+           gpointer       data)
 {
   ColorData *cd = data;
   const char *name;
@@ -273,52 +276,90 @@ add_one_color (GtkWidget     *widget,
   int red, green, blue;
   int h, s, v;
   GtkColor *color;
+  guint64 start, now;
 
-  g_print ("%u/%u\n", cd->i, cd->n);
+  start = g_get_monotonic_time ();
 
-  if (cd->lines[cd->i][0] == '#' || cd->lines[cd->i][0] == '\0')
-    goto out;
+  while (cd->i < cd->n)
+    {
+      const char *line = cd->lines[cd->i];
+
+      cd->i++;
+
+      if (line[0] == '#' || line[0] == '\0')
+        continue;
+
+      fields = g_strsplit (line, " ", 0);
+      name = fields[1];
+      red = atoi (fields[3]);
+      green = atoi (fields[4]);
+      blue = atoi (fields[5]);
+      h = atoi (fields[9]);
+      s = atoi (fields[10]);
+      v = atoi (fields[11]);
+
+      color = gtk_color_new (name, red / 255., green / 255., blue / 255., h, s, v);
+      g_list_store_append (cd->store, color);
+      g_object_unref (color);
+
+      g_strfreev (fields);
+
+      now = g_get_monotonic_time ();
+      if (now > start + 4000)
+        return G_SOURCE_CONTINUE;
+    }
 
-  fields = g_strsplit (cd->lines[cd->i], " ", 0);
-  name = fields[1];
-  red = atoi (fields[3]);
-  green = atoi (fields[4]);
-  blue = atoi (fields[5]);
-  h = atoi (fields[9]);
-  s = atoi (fields[10]);
-  v = atoi (fields[11]);
+  return G_SOURCE_REMOVE;
+}
 
-  color = gtk_color_new (name, red / 255., green / 255., blue / 255., h, s, v);
-  g_list_store_append (cd->store, color);
-  g_object_unref (color);
+static void
+populate_colors_model (GtkWidget  *widget,
+                       GListStore *store)
+{
+  ColorData *cd;
 
-  g_strfreev (fields);
+  cd = g_new (ColorData, 1);
 
-out:
-  cd->i++;
+  gtk_widget_set_sensitive (widget, FALSE);
 
-  if (cd->i == cd->n)
-    return G_SOURCE_REMOVE;
+  cd->widget = widget;
+  cd->store = g_object_ref (store);
+  cd->data = g_resources_lookup_data ("/listview_colors/color.names.txt", 0, NULL);
+  cd->lines = g_strsplit (g_bytes_get_data (cd->data, NULL), "\n", 0);
+  cd->n = g_strv_length (cd->lines);
+  cd->i = 0;
 
-  return G_SOURCE_CONTINUE;
+  gtk_widget_add_tick_callback (widget, add_color, cd, free_color_data);
 }
 
-static GListModel *
-create_colors_model (GtkWidget *view)
+static void
+fill (GtkWidget *view,
+      GListStore *store)
 {
   ColorData *cd;
+  gboolean res;
 
   cd = g_new (ColorData, 1);
 
-  cd->store = g_list_store_new (GTK_TYPE_COLOR);
+  cd->widget = NULL;
+  cd->store = g_object_ref (store);
   cd->data = g_resources_lookup_data ("/listview_colors/color.names.txt", 0, NULL);
   cd->lines = g_strsplit (g_bytes_get_data (cd->data, NULL), "\n", 0);
   cd->n = g_strv_length (cd->lines);
   cd->i = 0;
 
-  gtk_widget_add_tick_callback (view, add_one_color, cd, free_color_data);
+  do {
+    res = add_color (view, NULL, cd);
+  } while (res == G_SOURCE_CONTINUE);
+  free_color_data (cd);
+}
 
-  return G_LIST_MODEL (g_object_ref (cd->store));
+static void
+refill (GtkWidget  *button,
+        GListStore *store)
+{
+  g_list_store_remove_all (store);
+  populate_colors_model (button, store);
 }
 
 static char *
@@ -459,6 +500,7 @@ create_color_grid (void)
   GtkWidget *gridview;
   GtkListItemFactory *factory;
   GListModel *model, *selection;
+  GListStore *store;
 
   gridview = gtk_grid_view_new ();
   gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
@@ -472,15 +514,34 @@ 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);
 
-  model = G_LIST_MODEL (gtk_sort_list_model_new (create_colors_model (gridview), NULL));
+  store = g_list_store_new (GTK_TYPE_COLOR);
+  fill (gridview, store);
+
+  model = G_LIST_MODEL (gtk_sort_list_model_new (G_LIST_MODEL (store), NULL));
   selection = G_LIST_MODEL (gtk_property_selection_new (model, "selected"));
   gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), selection);
   g_object_unref (selection);
   g_object_unref (model);
+  g_object_unref (store);
 
   return gridview;
 }
 
+static void
+items_changed_cb (GListModel *model,
+                  guint       position,
+                  guint       removed,
+                  guint       added,
+                  GtkWidget  *label)
+{
+  guint n = g_list_model_get_n_items (model);
+  char *text;
+
+  text = g_strdup_printf ("%u items", n);
+  gtk_label_set_label (GTK_LABEL (label), text);
+  g_free (text);
+}
+
 static GtkWidget *window = NULL;
 
 GtkWidget *
@@ -492,11 +553,12 @@ do_listview_colors (GtkWidget *do_widget)
       GtkListItemFactory *factory;
       GListStore *factories;
       GListModel *model;
-
       GtkSorter *sorter;
       GtkSorter *multi_sorter;
       GListStore *sorters;
       GtkExpression *expression;
+      GtkWidget *button;
+      GtkWidget *label;
 
       window = gtk_window_new ();
       gtk_window_set_title (GTK_WINDOW (window), "Colors");
@@ -517,6 +579,18 @@ do_listview_colors (GtkWidget *do_widget)
       model = gtk_grid_view_get_model (GTK_GRID_VIEW (gridview));
       g_object_get (model, "model", &model, NULL);
 
+      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_header_bar_pack_start (GTK_HEADER_BAR (header), button);
+
+      label = gtk_label_new ("0 items");
+      g_signal_connect (gtk_grid_view_get_model (GTK_GRID_VIEW (gridview)),
+                        "items-changed", G_CALLBACK (items_changed_cb), label);
+      gtk_header_bar_pack_start (GTK_HEADER_BAR (header), label);
+
       sorters = g_list_store_new (GTK_TYPE_SORTER);
 
       sorter = gtk_string_sorter_new (gtk_property_expression_new (GTK_TYPE_COLOR, NULL, "name"));


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