X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktreemodelfilter.c;h=45281c298a8532e5805d68de4b2041d59729be86;hb=HEAD;hp=9c81d68ad5ee1b81f83ccccc046b5807af593b82;hpb=0561c7a68d2b324b2013cff66e1d95e84b23fab9;p=~andy%2Fgtk diff --git a/gtk/gtktreemodelfilter.c b/gtk/gtktreemodelfilter.c index 9c81d68ad..45281c298 100644 --- a/gtk/gtktreemodelfilter.c +++ b/gtk/gtktreemodelfilter.c @@ -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 . */ #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); } /**