[gtk/listview-dnd: 12/15] testlistdnd: Add a tree



commit 62800662077b532f1f6f684f0863aabfe4b1b052
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jun 19 12:37:39 2020 -0400

    testlistdnd: Add a tree
    
    This lets us test auto-expand of tree expanders.

 tests/testlistdnd.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file 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)


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