[gtk+] GtkListBox: Track the number of visible children



commit b0b746b2eafb889c3230d214209a9632adfd3303
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Jun 11 16:20:45 2013 +0200

    GtkListBox: Track the number of visible children

 gtk/gtklistbox.c |   29 +++++++++++++++++++++++++----
 1 files changed, 25 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index a59c7a5..30097f0 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -80,6 +80,8 @@ struct _GtkListBoxPrivate
 
   /* DnD */
   GtkListBoxRow *drag_highlighted_row;
+
+  int n_visible_rows;
 };
 
 struct _GtkListBoxRowPrivate
@@ -1316,9 +1318,21 @@ gtk_list_box_real_realize (GtkWidget* widget)
 /* Children are visible if they are shown by the app (visible)
    and not filtered out (child_visible) by the listbox */
 static void
-update_row_is_visible (GtkListBoxRow *row)
+update_row_is_visible (GtkListBox *list_box, GtkListBoxRow *row)
 {
-  row->priv->visible = gtk_widget_get_visible (GTK_WIDGET (row)) && gtk_widget_get_child_visible (GTK_WIDGET 
(row));
+  GtkListBoxPrivate *priv = list_box->priv;
+  gboolean was_visible;
+
+  was_visible = row->priv->visible;
+
+  row->priv->visible =
+    gtk_widget_get_visible (GTK_WIDGET (row)) &&
+    gtk_widget_get_child_visible (GTK_WIDGET (row));
+
+  if (was_visible && !row->priv->visible)
+    priv->n_visible_rows--;
+  if (!was_visible && row->priv->visible)
+    priv->n_visible_rows++;
 }
 
 static gboolean
@@ -1339,7 +1353,7 @@ gtk_list_box_apply_filter (GtkListBox *list_box, GtkListBoxRow *row)
 
   gtk_widget_set_child_visible (GTK_WIDGET (row), do_show);
 
-  update_row_is_visible (row);
+  update_row_is_visible (list_box, row);
 }
 
 static void
@@ -1510,7 +1524,7 @@ gtk_list_box_update_header (GtkListBox *list_box, GSequenceIter* iter)
 static void
 gtk_list_box_row_visibility_changed (GtkListBox *list_box, GtkListBoxRow *row)
 {
-  update_row_is_visible (row);
+  update_row_is_visible (list_box, row);
 
   if (gtk_widget_get_visible (GTK_WIDGET (list_box)))
     {
@@ -1543,9 +1557,13 @@ gtk_list_box_real_add (GtkContainer* container, GtkWidget *child)
   else
     iter = g_sequence_append (priv->children, row);
 
+
   row->priv->iter = iter;
   gtk_widget_set_parent (GTK_WIDGET (row), GTK_WIDGET (list_box));
+  gtk_widget_set_child_visible (GTK_WIDGET (row), TRUE);
   row->priv->visible = gtk_widget_get_visible (GTK_WIDGET (row));
+  if (row->priv->visible)
+      priv->n_visible_rows++;
   gtk_list_box_apply_filter (list_box, row);
   if (gtk_widget_get_visible (GTK_WIDGET (list_box)))
     {
@@ -1592,6 +1610,9 @@ gtk_list_box_real_remove (GtkContainer* container, GtkWidget* child)
       return;
     }
 
+  if (row->priv->visible)
+    priv->n_visible_rows--;
+
   if (row->priv->header != NULL)
     {
       g_hash_table_remove (priv->header_hash, row->priv->header);


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