columnviewrowwidget: Don't discard items in unroot()
authorBenjamin Otte <otte@redhat.com>
Wed, 29 Mar 2023 06:34:40 +0000 (08:34 +0200)
committerBenjamin Otte <otte@redhat.com>
Sat, 1 Apr 2023 18:49:40 +0000 (20:49 +0200)
Follows 3411b0306ee3b88038abdc736adf60bd004c7b7a and
3fb10ff2d8cdffdc5e026f9b57c4d5580a36d308.

gtk/gtkcolumnview.c
gtk/gtkcolumnviewrowwidget.c

index b79ae627e97a76a2ab0cc7e7cb3fd770ec518fe9..8a87acb9c66d268386f52df778ab9ed037c37937 100644 (file)
  * some parameters for item creation.
  */
 
+struct _GtkColumnView
+{
+  GtkWidget parent_instance;
+
+  GListStore *columns;
+
+  GtkColumnViewColumn *focus_column;
+
+  GtkWidget *header;
+
+  GtkListView *listview;
+
+  GtkSorter *sorter;
+
+  GtkAdjustment *hadjustment;
+
+  guint reorderable : 1;
+  guint show_column_separators : 1;
+  guint in_column_resize : 1;
+  guint in_column_reorder : 1;
+
+  int drag_pos;
+  int drag_x;
+  int drag_offset;
+  int drag_column_x;
+
+  guint autoscroll_id;
+  double autoscroll_x;
+  double autoscroll_delta;
+
+  GtkGesture *drag_gesture;
+};
+
+struct _GtkColumnViewClass
+{
+  GtkWidgetClass parent_class;
+};
+
+
 #define GTK_TYPE_COLUMN_LIST_VIEW (gtk_column_list_view_get_type ())
 G_DECLARE_FINAL_TYPE (GtkColumnListView, gtk_column_list_view, GTK, COLUMN_LIST_VIEW, GtkListView)
 
@@ -136,12 +175,28 @@ gtk_column_list_view_init (GtkColumnListView *view)
 static GtkListItemBase *
 gtk_column_list_view_create_list_widget (GtkListBase *base)
 {
-  GtkListView *self = GTK_LIST_VIEW (base);
+  GtkColumnView *self = GTK_COLUMN_VIEW (gtk_widget_get_parent (GTK_WIDGET (base)));
   GtkWidget *result;
+  guint i;
 
   result = gtk_column_view_row_widget_new (FALSE);
 
-  gtk_list_factory_widget_set_single_click_activate (GTK_LIST_FACTORY_WIDGET (result), self->single_click_activate);
+  gtk_list_factory_widget_set_single_click_activate (GTK_LIST_FACTORY_WIDGET (result), GTK_LIST_VIEW (base)->single_click_activate);
+
+  for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (self->columns)); i++)
+    {
+      GtkColumnViewColumn *column = g_list_model_get_item (G_LIST_MODEL (self->columns), i);
+
+      if (gtk_column_view_column_get_visible (column))
+        {
+          GtkWidget *cell;
+
+          cell = gtk_column_view_cell_widget_new (column);
+          gtk_column_view_row_widget_add_child (GTK_COLUMN_VIEW_ROW_WIDGET (result), cell);
+        }
+
+      g_object_unref (column);
+    }
 
   return GTK_LIST_ITEM_BASE (result);
 }
@@ -159,44 +214,6 @@ gtk_column_list_view_class_init (GtkColumnListViewClass *klass)
 }
 
 
-struct _GtkColumnView
-{
-  GtkWidget parent_instance;
-
-  GListStore *columns;
-
-  GtkColumnViewColumn *focus_column;
-
-  GtkWidget *header;
-
-  GtkListView *listview;
-
-  GtkSorter *sorter;
-
-  GtkAdjustment *hadjustment;
-
-  guint reorderable : 1;
-  guint show_column_separators : 1;
-  guint in_column_resize : 1;
-  guint in_column_reorder : 1;
-
-  int drag_pos;
-  int drag_x;
-  int drag_offset;
-  int drag_column_x;
-
-  guint autoscroll_id;
-  double autoscroll_x;
-  double autoscroll_delta;
-
-  GtkGesture *drag_gesture;
-};
-
-struct _GtkColumnViewClass
-{
-  GtkWidgetClass parent_class;
-};
-
 enum
 {
   PROP_0,
index 1c5fd0ae5e32b11231987bcdceb90cb5eca856ba..fe2b290f57212b364aa08481035da61f56a5725b 100644 (file)
@@ -351,56 +351,17 @@ gtk_column_view_row_widget_set_focus_child (GtkWidget *widget,
 }
 
 static void
-gtk_column_view_row_widget_root (GtkWidget *widget)
+gtk_column_view_row_widget_dispose (GObject *object)
 {
-  GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (widget);
-
-  GTK_WIDGET_CLASS (gtk_column_view_row_widget_parent_class)->root (widget);
-
-  if (!gtk_column_view_row_widget_is_header (self))
-    {
-      GtkListItemBase *base = GTK_LIST_ITEM_BASE (self);
-      GListModel *columns;
-      guint i;
-
-      columns = gtk_column_view_get_columns (gtk_column_view_row_widget_get_column_view (self));
-
-      for (i = 0; i < g_list_model_get_n_items (columns); i++)
-        {
-          GtkColumnViewColumn *column = g_list_model_get_item (columns, i);
-
-          if (gtk_column_view_column_get_visible (column))
-            {
-              GtkWidget *cell;
-
-              cell = gtk_column_view_cell_widget_new (column);
-              gtk_column_view_row_widget_add_child (self, cell);
-              gtk_list_item_base_update (GTK_LIST_ITEM_BASE (cell),
-                                         gtk_list_item_base_get_position (base),
-                                         gtk_list_item_base_get_item (base),
-                                         gtk_list_item_base_get_selected (base));
-            }
-
-          g_object_unref (column);
-        }
-    }
-}
-
-static void
-gtk_column_view_row_widget_unroot (GtkWidget *widget)
-{
-  GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (widget);
+  GtkColumnViewRowWidget *self = GTK_COLUMN_VIEW_ROW_WIDGET (object);
   GtkWidget *child;
 
-  if (!gtk_column_view_row_widget_is_header (self))
+  while ((child = gtk_widget_get_first_child (GTK_WIDGET (self))))
     {
-      while ((child = gtk_widget_get_first_child (GTK_WIDGET (self))))
-        {
-          gtk_column_view_row_widget_remove_child (self, child);
-        }
+      gtk_column_view_row_widget_remove_child (self, child);
     }
 
-  GTK_WIDGET_CLASS (gtk_column_view_row_widget_parent_class)->unroot (widget);
+  G_OBJECT_CLASS (gtk_column_view_row_widget_parent_class)->dispose (object);
 }
 
 static void
@@ -539,6 +500,7 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass)
   GtkListFactoryWidgetClass *factory_class = GTK_LIST_FACTORY_WIDGET_CLASS (klass);
   GtkListItemBaseClass *base_class = GTK_LIST_ITEM_BASE_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   factory_class->create_object = gtk_column_view_row_widget_create_object;
   factory_class->setup_object = gtk_column_view_row_widget_setup_object;
@@ -552,8 +514,8 @@ gtk_column_view_row_widget_class_init (GtkColumnViewRowWidgetClass *klass)
   widget_class->set_focus_child = gtk_column_view_row_widget_set_focus_child;
   widget_class->measure = gtk_column_view_row_widget_measure;
   widget_class->size_allocate = gtk_column_view_row_widget_allocate;
-  widget_class->root = gtk_column_view_row_widget_root;
-  widget_class->unroot = gtk_column_view_row_widget_unroot;
+
+  object_class->dispose = gtk_column_view_row_widget_dispose;
 
   add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
   add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);