diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-06-19 12:37:39 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-06-19 15:26:47 -0400 |
commit | 62800662077b532f1f6f684f0863aabfe4b1b052 (patch) | |
tree | 0aac433cef4afb788694f2144ab4f23dc6a7a3b9 /tests | |
parent | f054c317ee22d9c883570a8aaeae0b8d5643bd80 (diff) | |
download | gtk+-62800662077b532f1f6f684f0863aabfe4b1b052.tar.gz |
testlistdnd: Add a tree
This lets us test auto-expand of tree expanders.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/testlistdnd.c | 110 |
1 files changed, 104 insertions, 6 deletions
diff --git a/tests/testlistdnd.c b/tests/testlistdnd.c index 097f31c368..d988cd6e1a 100644 --- a/tests/testlistdnd.c +++ b/tests/testlistdnd.c @@ -7,11 +7,13 @@ struct _TestObject { GObject parent_instance; char *string; guint number; + gboolean allow_children; }; enum { PROP_STRING = 1, PROP_NUMBER, + PROP_ALLOW_CHILDREN, PROP_NUM_PROPERTIES }; @@ -51,6 +53,10 @@ test_object_set_property (GObject *object, obj->number = g_value_get_uint (value); break; + case PROP_ALLOW_CHILDREN: + obj->allow_children = g_value_get_boolean (value); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -75,6 +81,10 @@ test_object_get_property (GObject *object, g_value_set_uint (value, obj->number); break; + case PROP_ALLOW_CHILDREN: + g_value_set_boolean (value, obj->allow_children); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -99,15 +109,22 @@ test_object_class_init (TestObjectClass *class) g_param_spec_uint ("number", "Number", "Number", 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_ALLOW_CHILDREN, + g_param_spec_boolean ("allow-children", "Allow children", "Allow children", + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static TestObject * test_object_new (const char *string, - guint number) + guint number, + gboolean allow_children) { return g_object_new (TEST_TYPE_OBJECT, "string", string, "number", number, + "allow-children", allow_children, NULL); } @@ -123,6 +140,12 @@ test_object_get_number (TestObject *obj) return obj->number; } +static gboolean +test_object_get_allow_children (TestObject *obj) +{ + return obj->allow_children; +} + /* * * */ static GdkContentProvider * @@ -140,7 +163,8 @@ prepare_drag (GtkDragSource *source, static GListModel * create_model (guint base, guint n, - guint increment) + guint increment, + gboolean allow_children) { GListStore *store; guint i; @@ -154,7 +178,7 @@ create_model (guint base, number = base + i * increment; string = g_strdup_printf ("%u", number); - obj = test_object_new (string, number); + obj = test_object_new (string, number, allow_children); g_list_store_append (store, obj); g_object_unref (obj); g_free (string); @@ -163,6 +187,29 @@ create_model (guint base, return G_LIST_MODEL (store); } +static GListModel * +create_child_model (gpointer item, + gpointer user_data) +{ + guint size = GPOINTER_TO_UINT (user_data); + guint base = test_object_get_number (TEST_OBJECT (item)); + + if (test_object_get_allow_children (TEST_OBJECT (item))) + return create_model (base, size, 1, FALSE); + else + return NULL; +} + +static GListModel * +create_tree_model (guint n, guint m) +{ + return G_LIST_MODEL (gtk_tree_list_model_new (FALSE, + create_model (0, n, m, TRUE), + FALSE, + create_child_model, + GUINT_TO_POINTER (m), NULL)); +} + static void setup_item (GtkSignalListItemFactory *factory, GtkListItem *item) @@ -187,6 +234,37 @@ bind_item (GtkSignalListItemFactory *factory, gtk_editable_set_text (GTK_EDITABLE (entry), test_object_get_string (obj)); } +static void +setup_tree_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + GtkWidget *expander; + GtkWidget *entry; + + entry = gtk_entry_new (); + gtk_editable_set_width_chars (GTK_EDITABLE (entry), 3); + expander = gtk_tree_expander_new (); + gtk_tree_expander_set_child (GTK_TREE_EXPANDER (expander), entry); + gtk_list_item_set_child (item, expander); +} + +static void +bind_tree_item (GtkSignalListItemFactory *factory, + GtkListItem *item) +{ + TestObject *obj; + GtkTreeListRow *row; + GtkTreeExpander *expander; + GtkWidget *entry; + + row = gtk_list_item_get_item (item); + expander = GTK_TREE_EXPANDER (gtk_list_item_get_child (item)); + gtk_tree_expander_set_list_row (expander, row); + obj = gtk_tree_list_row_get_item (row); + entry = gtk_tree_expander_get_child (expander); + gtk_editable_set_text (GTK_EDITABLE (entry), test_object_get_string (obj)); +} + int main (int argc, char *argv[]) { @@ -245,7 +323,7 @@ main (int argc, char *argv[]) gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), grid); - model = create_model (0, 400, 1); + model = create_model (0, 400, 1, FALSE); gtk_grid_view_set_model (GTK_GRID_VIEW (grid), model); g_object_unref (model); @@ -264,7 +342,7 @@ main (int argc, char *argv[]) list = gtk_list_view_new (); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), list); - model = create_model (0, 400, 1); + model = create_model (0, 400, 1, FALSE); gtk_list_view_set_model (GTK_LIST_VIEW (list), model); g_object_unref (model); @@ -282,7 +360,7 @@ main (int argc, char *argv[]) cv = gtk_column_view_new (); - model = create_model (0, 400, 1); + model = create_model (0, 400, 1, FALSE); gtk_column_view_set_model (GTK_COLUMN_VIEW (cv), model); g_object_unref (model); @@ -303,6 +381,26 @@ main (int argc, char *argv[]) } gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), cv); + + /* tree */ + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE); + gtk_stack_add_titled (GTK_STACK (stack), sw, "tree", "Tree"); + + list = gtk_list_view_new (); + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), list); + + model = create_tree_model (20, 20); + gtk_list_view_set_model (GTK_LIST_VIEW (list), model); + g_object_unref (model); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_tree_item), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (bind_tree_item), NULL); + + gtk_list_view_set_factory (GTK_LIST_VIEW (list), factory); + g_object_unref (factory); + gtk_window_present (GTK_WINDOW (window)); while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0) |