A different approach to ensuring that a (unique) relevent split from the currently-pending transaction is always in the split list before we load it.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@13343 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Joshua Sled
2006-02-21 18:40:32 +00:00
parent 0e4ac8952a
commit 95afa5babe
4 changed files with 53 additions and 17 deletions

View File

@@ -1,5 +1,17 @@
2006-02-21 Joshua Sled <jsled@asynchronous.org>
* src/register/ledger-core/split-register-load.c
(gnc_split_register_load): Ensure that a (unique) relevent split
from the currently-pending transaction is always in the split list
before we load it, preventing transactions from disappearing from
a register while being edited, but without saving the entire (and
maybe partially-invalid) split list around for a while. Fixes bugs
108347, 125480, 141287, 153183, 168630 (and maybe 126471).
* src/register/ledger-core/split-register.c (gnc_split_register_destroy_info):
* src/register/ledger-core/split-register-p.h (struct sr_info):
Remove saved_slist.
* lib/libqof/qof/qofevent.h (QOF_EVENT_CREATE):
Fix event values.
@@ -77,6 +89,12 @@
"visible to the user" lines in the register has shrunk, force the
parent widget to redraw. This fixes #328787.
2006-02-20 David Hampton <hampton@employees.org>
* src/register/register-gnome/gnucash-sheet.c: If the number of
"visible to the user" lines in the register has shrunk, force the
parent widget to redraw. This fixes #328787.
2006-02-19 Derek Atkins <derek@ihtfp.com>
* src/engine/Transaction.c:

View File

@@ -129,6 +129,14 @@ gnc_split_register_add_transaction (SplitRegister *reg,
}
static gint
_find_split_with_parent_txn(gconstpointer a, gconstpointer b)
{
Split *split = (Split*)a;
Transaction *txn = (Transaction*)b;
return xaccSplitGetParent(split) == txn ? 0 : 1;
}
void
gnc_split_register_load (SplitRegister *reg, GList * slist,
Account *default_account)
@@ -157,6 +165,7 @@ gnc_split_register_load (SplitRegister *reg, GList * slist,
gboolean has_last_num = FALSE;
gboolean multi_line;
gboolean dynamic;
gboolean we_own_slist = FALSE;
VirtualCellLocation vcell_loc;
VirtualLocation save_loc;
@@ -323,19 +332,29 @@ gnc_split_register_load (SplitRegister *reg, GList * slist,
if (multi_line)
trans_table = g_hash_table_new (g_direct_hash, g_direct_equal);
/*
* Which split list to use? If there is a transction pending, then
* use the saved list so that the transaction is guaranteed to
* remain in the register intil the user finishes editing
* it. Otherwise, the moment the user changes the account field of
* the split that is attached to the register, the transaction will
* be ripped out from underneath them.
*/
if (pending_trans != NULL) {
slist = info->saved_slist;
} else {
g_list_free(info->saved_slist);
info->saved_slist = g_list_copy(slist);
// Ensure that the transaction and splits being edited are in the split
// list we're about to load.
if (pending_trans != NULL)
{
SplitList *splits;
for (splits = xaccTransGetSplitList(pending_trans); splits; splits = splits->next)
{
Split *pending_split = (Split*)splits->data;
if (g_list_find(slist, pending_split) != NULL)
continue;
//printf("pending_split [%s] not found\n", guid_to_string(xaccSplitGetGUID(pending_split)));
if (g_list_find_custom(slist, pending_trans, _find_split_with_parent_txn) != NULL)
continue;
//printf("transaction [%s] not found\n", guid_to_string(xaccTransGetGUID(pending_trans)));
if (!we_own_slist)
{ // lazy-copy
slist = g_list_copy(slist);
we_own_slist = TRUE;
}
slist = g_list_append(slist, pending_split);
}
}
/* populate the table */
@@ -538,6 +557,9 @@ gnc_split_register_load (SplitRegister *reg, GList * slist,
/* enable callback for cursor user-driven moves */
gnc_table_control_allow_move (table->control, TRUE);
if (we_own_slist)
g_list_free(slist);
}
/* ===================================================================== */

View File

@@ -109,8 +109,6 @@ struct sr_info
char *credit_str;
char *tdebit_str;
char *tcredit_str;
GList *saved_slist;
};

View File

@@ -2356,13 +2356,11 @@ gnc_split_register_destroy_info (SplitRegister *reg)
g_free (info->tdebit_str);
g_free (info->credit_str);
g_free (info->tcredit_str);
g_list_free (info->saved_slist);
info->debit_str = NULL;
info->tdebit_str = NULL;
info->credit_str = NULL;
info->tcredit_str = NULL;
info->saved_slist = NULL;
g_free (reg->sr_info);