From 1c389b1f246794495ee673ea67558771288342e2 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 22 Dec 2019 12:27:30 -0500 Subject: [PATCH] gtk-demo: Add more scrolling benchmarks Add a listview and gridview to the scrolling benchmarks. --- demos/gtk-demo/iconscroll.c | 51 ++++++++++++++++++++++++++++++- demos/gtk-demo/listview_colors.c | 44 ++++++++++++++++++-------- demos/gtk-demo/listview_weather.c | 36 +++++++++++++--------- 3 files changed, 104 insertions(+), 27 deletions(-) diff --git a/demos/gtk-demo/iconscroll.c b/demos/gtk-demo/iconscroll.c index 7f9a43d20b..a8518b81ec 100644 --- a/demos/gtk-demo/iconscroll.c +++ b/demos/gtk-demo/iconscroll.c @@ -12,7 +12,7 @@ static GtkWidget *window = NULL; static GtkWidget *scrolledwindow; static int selected; -#define N_WIDGET_TYPES 4 +#define N_WIDGET_TYPES 6 static int hincrement = 5; @@ -64,6 +64,7 @@ populate_icons (void) gtk_grid_attach (GTK_GRID (grid), create_icon (), left, top, 1, 1); hincrement = 0; + vincrement = 5; gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_NEVER, @@ -100,6 +101,7 @@ populate_text (gboolean hilight) gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer); hincrement = 0; + vincrement = 5; gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_NEVER, @@ -124,6 +126,7 @@ populate_image (void) gtk_picture_set_can_shrink (GTK_PICTURE (image), FALSE); hincrement = 5; + vincrement = 5; gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, @@ -131,6 +134,42 @@ populate_image (void) gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), image); } +extern GtkWidget *create_weather_view (void); + +static void +populate_list (void) +{ + GtkWidget *list; + + list = create_weather_view (); + + hincrement = 5; + vincrement = 0; + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list); +} + +extern GtkWidget *create_color_grid (void); + +static void +populate_grid (void) +{ + GtkWidget *list; + + list = create_color_grid (); + + hincrement = 0; + vincrement = 5; + + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (scrolledwindow), list); +} + static void set_widget_type (int type) { @@ -164,6 +203,16 @@ set_widget_type (int type) populate_image (); break; + case 4: + gtk_window_set_title (GTK_WINDOW (window), "Scrolling a list"); + populate_list (); + break; + + case 5: + gtk_window_set_title (GTK_WINDOW (window), "Scrolling a grid"); + populate_grid (); + break; + default: g_assert_not_reached (); } diff --git a/demos/gtk-demo/listview_colors.c b/demos/gtk-demo/listview_colors.c index 97bb5a0264..233d11af5d 100644 --- a/demos/gtk-demo/listview_colors.c +++ b/demos/gtk-demo/listview_colors.c @@ -310,6 +310,7 @@ setup_simple_listitem_cb (GtkListItemFactory *factory, color_expression = gtk_property_expression_new (GTK_TYPE_LIST_ITEM, expression, "item"); picture = gtk_picture_new (); + gtk_widget_set_size_request (picture, 32, 32); gtk_expression_bind (color_expression, picture, "paintable", NULL); gtk_list_item_set_child (list_item, picture); @@ -404,6 +405,33 @@ set_item (GBinding *binding, return TRUE; } +GtkWidget * +create_color_grid (void) +{ + GtkWidget *gridview; + GtkListItemFactory *factory; + GListModel *model, *selection; + + gridview = gtk_grid_view_new (); + gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); + gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_simple_listitem_cb), NULL); + gtk_grid_view_set_factory (GTK_GRID_VIEW (gridview), factory); + g_object_unref (factory); + + gtk_grid_view_set_max_columns (GTK_GRID_VIEW (gridview), 24); + + model = G_LIST_MODEL (gtk_sort_list_model_new (create_colors_model (), NULL)); + selection = G_LIST_MODEL (gtk_no_selection_new (model)); + gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), selection); + g_object_unref (selection); + g_object_unref (model); + + return gridview; +} + static GtkWidget *window = NULL; GtkWidget * @@ -415,7 +443,7 @@ do_listview_colors (GtkWidget *do_widget) GtkListItemFactory *factory; GListStore *factories; GListModel *model; - GtkNoSelection *selection; + GtkSorter *sorter; GtkSorter *multi_sorter; GListStore *sorters; @@ -435,17 +463,10 @@ do_listview_colors (GtkWidget *do_widget) sw = gtk_scrolled_window_new (NULL, NULL); gtk_window_set_child (GTK_WINDOW (window), sw); - gridview = gtk_grid_view_new (); - gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); - gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); - - gtk_grid_view_set_max_columns (GTK_GRID_VIEW (gridview), 24); - - model = G_LIST_MODEL (gtk_sort_list_model_new (create_colors_model (), NULL)); - selection = gtk_no_selection_new (model); - gtk_grid_view_set_model (GTK_GRID_VIEW (gridview), G_LIST_MODEL (selection)); + gridview = create_color_grid (); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), gridview); - g_object_unref (selection); + model = gtk_grid_view_get_model (GTK_GRID_VIEW (gridview)); + g_object_get (model, "model", &model, NULL); sorters = g_list_store_new (GTK_TYPE_SORTER); @@ -559,7 +580,6 @@ do_listview_colors (GtkWidget *do_widget) G_BINDING_SYNC_CREATE, set_item, NULL, NULL, NULL); - g_object_unref (model); } diff --git a/demos/gtk-demo/listview_weather.c b/demos/gtk-demo/listview_weather.c index 4dbd16e37f..b5a02a2cb1 100644 --- a/demos/gtk-demo/listview_weather.c +++ b/demos/gtk-demo/listview_weather.c @@ -275,13 +275,33 @@ bind_widget (GtkListItem *list_item, static GtkWidget *window = NULL; +GtkWidget * +create_weather_view (void) +{ + GtkWidget *listview; + GListModel *model, *selection; + + listview = gtk_list_view_new_with_factory ( + gtk_functions_list_item_factory_new (setup_widget, + bind_widget, + NULL, NULL)); + gtk_orientable_set_orientation (GTK_ORIENTABLE (listview), GTK_ORIENTATION_HORIZONTAL); + gtk_list_view_set_show_separators (GTK_LIST_VIEW (listview), TRUE); + model = create_weather_model (); + selection = G_LIST_MODEL (gtk_no_selection_new (model)); + gtk_list_view_set_model (GTK_LIST_VIEW (listview), selection); + g_object_unref (selection); + g_object_unref (model); + + return listview; +} + GtkWidget * do_listview_weather (GtkWidget *do_widget) { if (window == NULL) { GtkWidget *listview, *sw;; - GListModel *model, *selection; window = gtk_window_new (); gtk_window_set_default_size (GTK_WINDOW (window), 600, 400); @@ -293,19 +313,7 @@ do_listview_weather (GtkWidget *do_widget) sw = gtk_scrolled_window_new (NULL, NULL); gtk_window_set_child (GTK_WINDOW (window), sw); - - listview = gtk_list_view_new_with_factory ( - gtk_functions_list_item_factory_new (setup_widget, - bind_widget, - NULL, NULL)); - gtk_orientable_set_orientation (GTK_ORIENTABLE (listview), GTK_ORIENTATION_HORIZONTAL); - gtk_list_view_set_show_separators (GTK_LIST_VIEW (listview), TRUE); - model = create_weather_model (); - selection = G_LIST_MODEL (gtk_no_selection_new (model)); - gtk_list_view_set_model (GTK_LIST_VIEW (listview), selection); - g_object_unref (selection); - g_object_unref (model); - + listview = create_weather_view (); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), listview); }