diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-06-20 14:34:03 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-06-20 14:34:03 -0400 |
commit | 0fb009235be94829a4fbee2f4e32a599196247f7 (patch) | |
tree | bcd7d7b298b8f0a2e289c666ea49d91223d4abb2 | |
parent | a0fc293d1ec74173bfa08d0172547270f5b06fb0 (diff) | |
download | gtk+-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.c | 134 |
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")); |