gtkcolumnviewcolumn: Only create cells when the column is visible
authorCorey Berla <corey@berla.me>
Thu, 29 Dec 2022 18:56:01 +0000 (10:56 -0800)
committerCorey Berla <corey@berla.me>
Thu, 29 Dec 2022 19:11:40 +0000 (11:11 -0800)
It's a big performance drag to create many cells (and their associated
widgets) for columns that may never be shown. Only create cells
is the column is visible, and subsequently create/remove cells
when in column_set_visible.

gtk/gtkcolumnlistitemfactory.c
gtk/gtkcolumnviewcolumn.c

index 9951a7c47a90c036e4d53b80c2256afbb80a05bf..d69bd12e0484de03544eba29bf4377990a092dba 100644 (file)
@@ -65,10 +65,11 @@ gtk_column_list_item_factory_setup (GtkListItemFactory *factory,
     {
       GtkColumnViewColumn *column = g_list_model_get_item (columns, i);
 
-      gtk_column_list_item_factory_add_column (self,
-                                               widget,
-                                               column,
-                                               FALSE);
+      if (gtk_column_view_column_get_visible (column))
+        gtk_column_list_item_factory_add_column (self,
+                                                 widget,
+                                                 column,
+                                                 FALSE);
 
       g_object_unref (column);
     }
index 715248f1c8814580f8dbcdb61c22d0d41bbeb35f..d4357760cb305f67332c187da8713affd4ce9419 100644 (file)
@@ -579,7 +579,8 @@ gtk_column_view_column_remove_header (GtkColumnViewColumn *self)
 static void
 gtk_column_view_column_ensure_cells (GtkColumnViewColumn *self)
 {
-  if (self->view && gtk_widget_get_root (GTK_WIDGET (self->view)))
+  if (self->view && gtk_widget_get_root (GTK_WIDGET (self->view)) &&
+      gtk_column_view_column_get_visible (self))
     gtk_column_view_column_create_cells (self);
   else
     gtk_column_view_column_remove_cells (self);
@@ -804,8 +805,6 @@ void
 gtk_column_view_column_set_visible (GtkColumnViewColumn *self,
                                     gboolean             visible)
 {
-  GtkColumnViewCell *cell;
-
   g_return_if_fail (GTK_IS_COLUMN_VIEW_COLUMN (self));
 
   if (self->visible == visible)
@@ -819,10 +818,7 @@ gtk_column_view_column_set_visible (GtkColumnViewColumn *self,
   if (self->header)
     gtk_widget_set_visible (GTK_WIDGET (self->header), visible);
 
-  for (cell = self->first_cell; cell; cell = gtk_column_view_cell_get_next (cell))
-    {
-      gtk_widget_set_visible (GTK_WIDGET (cell), visible);
-    }
+  gtk_column_view_column_ensure_cells (self);
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_VISIBLE]);
 }