]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktreemodelfilter.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtktreemodelfilter.c
index 9c81d68ad5ee1b81f83ccccc046b5807af593b82..45281c298a8532e5805d68de4b2041d59729be86 100644 (file)
@@ -13,9 +13,7 @@
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
@@ -1264,7 +1262,7 @@ gtk_tree_model_filter_real_visible (GtkTreeModelFilter *filter,
     }
   else if (filter->priv->visible_column >= 0)
    {
-     GValue val = {0, };
+     GValue val = G_VALUE_INIT;
 
      gtk_tree_model_get_value (child_model, child_iter,
                                filter->priv->visible_column, &val);
@@ -2073,17 +2071,17 @@ gtk_tree_model_filter_row_changed (GtkTreeModel *c_model,
 
   if (current_state == TRUE && requested_state == TRUE)
     {
-      /* propagate the signal; also get a path taking only visible
-       * nodes into account.
-       */
-      gtk_tree_path_free (path);
-      path = gtk_tree_model_get_path (GTK_TREE_MODEL (filter), &iter);
-
       level = FILTER_LEVEL (iter.user_data);
       elt = FILTER_ELT (iter.user_data2);
 
       if (gtk_tree_model_filter_elt_is_visible_in_target (level, elt))
         {
+          /* propagate the signal; also get a path taking only visible
+           * nodes into account.
+           */
+          gtk_tree_path_free (path);
+          path = gtk_tree_model_get_path (GTK_TREE_MODEL (filter), &iter);
+
           if (level->ext_ref_count > 0)
             gtk_tree_model_row_changed (GTK_TREE_MODEL (filter), path, &iter);
 
@@ -2614,20 +2612,21 @@ gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model,
     gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
                                            TRUE, FALSE);
 
+  if (elt->children)
+    /* If this last node has children, then the recursion in free_level
+     * will release this reference.
+     */
+    while (elt->ref_count > 1)
+      gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
+                                             FALSE, FALSE);
+  else
+    while (elt->ref_count > 0)
+      gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
+                                             FALSE, FALSE);
+
+
   if (g_sequence_get_length (level->seq) == 1)
     {
-      if (elt->children)
-        /* If this last node has children, then the recursion in free_level
-         * will release this reference.
-         */
-        while (elt->ref_count > 1)
-          gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
-                                                 FALSE, FALSE);
-      else
-        while (elt->ref_count > 0)
-          gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
-                                                 FALSE, FALSE);
-
       /* kill level */
       gtk_tree_model_filter_free_level (filter, level, FALSE, TRUE, FALSE);
     }
@@ -2636,16 +2635,16 @@ gtk_tree_model_filter_row_deleted (GtkTreeModel *c_model,
       GSequenceIter *tmp;
       gboolean is_first;
 
-      /* Release last references, if needed */
-      while (elt->ref_count > 0)
-        gtk_tree_model_filter_real_unref_node (GTK_TREE_MODEL (data), &iter,
-                                               FALSE, FALSE);
-
       lookup_elt_with_offset (level->seq, elt->offset, &siter);
       is_first = g_sequence_get_begin_iter (level->seq) == siter;
 
+      if (elt->children)
+        gtk_tree_model_filter_free_level (filter, elt->children,
+                                          FALSE, FALSE, FALSE);
+
       /* remove the row */
-      g_sequence_remove (elt->visible_siter);
+      if (elt->visible_siter)
+        g_sequence_remove (elt->visible_siter);
       tmp = g_sequence_iter_next (siter);
       g_sequence_remove (siter);
       g_sequence_foreach_range (tmp, g_sequence_get_end_iter (level->seq),
@@ -3228,12 +3227,12 @@ gtk_tree_model_filter_iter_previous (GtkTreeModel *model,
 
   elt = iter->user_data2;
 
-  siter = g_sequence_iter_prev (elt->visible_siter);
-  if (g_sequence_iter_is_begin (siter))
+  if (g_sequence_iter_is_begin (elt->visible_siter))
     {
       iter->stamp = 0;
       return FALSE;
     }
+  siter = g_sequence_iter_prev (elt->visible_siter);
 
   iter->user_data2 = GET_ELT (siter);
 
@@ -3759,10 +3758,14 @@ gtk_tree_model_filter_set_root (GtkTreeModelFilter *filter,
 {
   g_return_if_fail (GTK_IS_TREE_MODEL_FILTER (filter));
 
-  if (!root)
-    filter->priv->virtual_root = NULL;
+  if (root)
+    {
+      filter->priv->virtual_root = gtk_tree_path_copy (root);
+      gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root);
+      filter->priv->virtual_root_deleted = FALSE;
+    }
   else
-    filter->priv->virtual_root = gtk_tree_path_copy (root);
+    filter->priv->virtual_root = NULL;
 }
 
 /* public API */
@@ -3783,24 +3786,12 @@ GtkTreeModel *
 gtk_tree_model_filter_new (GtkTreeModel *child_model,
                            GtkTreePath  *root)
 {
-  GtkTreeModel *retval;
-  GtkTreeModelFilter *filter;
-
   g_return_val_if_fail (GTK_IS_TREE_MODEL (child_model), NULL);
 
-  retval = g_object_new (GTK_TYPE_TREE_MODEL_FILTER, 
-                        "child-model", child_model,
-                        "virtual-root", root,
-                        NULL);
-
-  filter = GTK_TREE_MODEL_FILTER (retval);
-  if (filter->priv->virtual_root)
-    {
-      gtk_tree_model_filter_ref_path (filter, filter->priv->virtual_root);
-      filter->priv->virtual_root_deleted = FALSE;
-    }
-
-  return retval;
+  return g_object_new (GTK_TYPE_TREE_MODEL_FILTER,
+                       "child-model", child_model,
+                       "virtual-root", root,
+                       NULL);
 }
 
 /**