summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-06-20 14:34:03 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-06-20 14:34:03 -0400
commit0fb009235be94829a4fbee2f4e32a599196247f7 (patch)
treebcd7d7b298b8f0a2e289c666ea49d91223d4abb2
parenta0fc293d1ec74173bfa08d0172547270f5b06fb0 (diff)
downloadgtk+-inclement-weather.tar.gz
Refine the colors demoinclement-weather
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.
-rw-r--r--demos/gtk-demo/listview_colors.c134
1 files 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"));