[Gnucash-changes] r14283 - gnucash/trunk - Replace gnc_tree_model_account_path_changed with manual checks whether

Chris Shoemaker c.shoemaker at cox.net
Wed May 31 20:01:02 EDT 2006


On Wed, May 31, 2006 at 03:30:51PM -0400, Andreas Köhler wrote:
> Author: andi5
> Date: 2006-05-31 15:30:49 -0400 (Wed, 31 May 2006)
> New Revision: 14283
> Trac: http://svn.gnucash.org/trac/changeset/14283
> 
> Modified:
>    gnucash/trunk/ChangeLog
>    gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c
> Log:
> Replace gnc_tree_model_account_path_changed with manual checks whether
> the inserted (resp. deleted) account is the first (resp. last) account
> in its level and call gtm_row_has_child_toggled only in these cases.
> Might fix #343405, as GtkTreeModelFilter seems to make (false)
> assumptions when being woken up too often.
> 

I think there are some problems with this...

1) That stamp increment might not have been exactly correct, but I
think it's technically required.  You've removed it entirely.  This
model does not advertise persistent iters, and every insert or remove
event will invalidate the iters for the paths after the "event-path"
at the same depth.

2) The old code would emit row_changed on all the ancestors of the
inserted or deleted account.  I think that was correct behavior, since
the inserted or deleted row may change the totals for the ancestor
rows.

But, if being more strict about has_child_toggled fixes the crash, we
should obviously do that.

I'll work on restoring those two behaviors while keeping the new.
Hopefully, that will still not crash...

-chris

> 
> Modified: gnucash/trunk/ChangeLog
> ===================================================================
> --- gnucash/trunk/ChangeLog	2006-05-31 05:15:28 UTC (rev 14282)
> +++ gnucash/trunk/ChangeLog	2006-05-31 19:30:49 UTC (rev 14283)
> @@ -1,3 +1,12 @@
> +2006-05-31  Andreas Köhler  <andi5.py at gmx.net>
> +
> +	* src/gnome-utils/gnc-tree-model-account.c: Replace
> +	  gnc_tree_model_account_path_changed with manual checks whether
> +	  the inserted (resp. deleted) account is the first (resp. last)
> +	  account in its level and call gtm_row_has_child_toggled only in
> +	  these cases. Might fix #343405, as GtkTreeModelFilter seems to
> +	  make (false) assumptions when being woken up too often.
> +
>  2006-05-31  Derek Atkins  <derek at ihtfp.com>
>  
>  	* po/es.po:  Updated Spanish Translation from Eneko Lacunza
> 
> Modified: gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c
> ===================================================================
> --- gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c	2006-05-31 05:15:28 UTC (rev 14282)
> +++ gnucash/trunk/src/gnome-utils/gnc-tree-model-account.c	2006-05-31 19:30:49 UTC (rev 14283)
> @@ -1426,41 +1426,6 @@
>  /*   Account Tree Model - Engine Event Handling Functions   */
>  /************************************************************/
>  
> -/** This function performs common updating to the model after an
> - *  account has been added or removed.  The parent entry needs to be
> - *  tapped on the shoulder so that it can correctly update the
> - *  disclosure triangle (first added child/last removed child) or
> - *  possibly rebuild its child list of that level of accounts is
> - *  visible.
> - *
> - *  @internal
> - *
> - *  @param model The account tree model containing the account that
> - *  has been added or deleted.
> - *
> - *  @param path The path to the newly added item, or the just removed
> - *  item.
> - */
> -static void
> -gnc_tree_model_account_path_changed (GncTreeModelAccount *model,
> -				     GtkTreePath *path)
> -{
> -  GtkTreeIter iter;
> -
> -  while (gtk_tree_path_get_depth(path) > 0) {
> -    if (!gtk_tree_model_get_iter (GTK_TREE_MODEL(model), &iter, path))
> -      break;
> -    gtk_tree_model_row_changed (GTK_TREE_MODEL(model), path, &iter);
> -    gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL(model), path, &iter);
> -    gtk_tree_path_up(path);
> -  }
> -
> -  do {
> -    model->stamp++;
> -  } while (model->stamp == 0);
> -}
> -
> -
>  /** This function is the handler for all event messages from the
>   *  engine.  Its purpose is to update the account tree model any time
>   *  an account is added to the engine or deleted from the engine.
> @@ -1533,8 +1498,10 @@
>  	break;
>        }
>        gtk_tree_model_row_inserted (GTK_TREE_MODEL(model), path, &iter);
> -      if (gtk_tree_path_up (path))
> -	gnc_tree_model_account_path_changed(model, path);
> +      if (gtk_tree_path_up (path) &&
> +	  gtk_tree_model_get_iter (GTK_TREE_MODEL(model), &iter, path) &&
> +	  gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter) == 1)
> +	gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL(model), path, &iter);
>        break;
>  
>      case QOF_EVENT_REMOVE:
> @@ -1550,7 +1517,10 @@
>        }
>        gtk_tree_path_append_index (path, ed->idx);
>        gtk_tree_model_row_deleted (GTK_TREE_MODEL(model), path);
> -      gnc_tree_model_account_path_changed(model, path);
> +      if (gtk_tree_path_up (path) &&
> +	  gtk_tree_model_get_iter (GTK_TREE_MODEL(model), &iter, path) &&
> +	  gtk_tree_model_iter_n_children (GTK_TREE_MODEL(model), &iter) == 0)
> +	gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL(model), path, &iter);
>        break;
>  
>      case QOF_EVENT_MODIFY:
> 
> _______________________________________________
> gnucash-changes mailing list
> gnucash-changes at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-changes


More information about the gnucash-devel mailing list