gnucash maint: Multiple changes pushed
Robert Fewell
bobit at code.gnucash.org
Fri Jun 28 05:50:19 EDT 2019
Updated via https://github.com/Gnucash/gnucash/commit/d5c3b4af (commit)
via https://github.com/Gnucash/gnucash/commit/cf3e9239 (commit)
via https://github.com/Gnucash/gnucash/commit/a7f3f521 (commit)
via https://github.com/Gnucash/gnucash/commit/4cf92baa (commit)
via https://github.com/Gnucash/gnucash/commit/8c6832bc (commit)
via https://github.com/Gnucash/gnucash/commit/5cb1d0eb (commit)
from https://github.com/Gnucash/gnucash/commit/58069668 (commit)
commit d5c3b4af0cb82d9d7693092faa2a2d89a1e89d18
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Fri Jun 7 13:38:56 2019 +0100
Make the blank split read only
If the transactions are read only or voided and selected for editing a
blank split is added that allows you to change the transaction so in
these cases make the blank split read only.
diff --git a/gnucash/register/ledger-core/split-register-model.c b/gnucash/register/ledger-core/split-register-model.c
index f05dcd118..1e45fbc03 100644
--- a/gnucash/register/ledger-core/split-register-model.c
+++ b/gnucash/register/ledger-core/split-register-model.c
@@ -1954,7 +1954,19 @@ gnc_split_register_cursor_is_readonly (VirtualLocation virt_loc,
char type;
split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
- if (!split) return FALSE;
+
+ if (!split) // this could be the blank split
+ {
+ txn = gnc_split_register_get_current_trans (reg);
+
+ if (txn) // get the current trans and see if read_only required
+ {
+ if (xaccTransGetReadOnly (txn)
+ || xaccTransIsReadonlyByPostedDate (txn))
+ return (TRUE);
+ }
+ return FALSE;
+ }
txn = xaccSplitGetParent (split);
if (!txn) return FALSE;
commit cf3e9239e26fa471ea02616fd20a543741f34fe9
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Fri Jun 7 13:38:25 2019 +0100
Allow cancelling of a split paste
Currently when you paste a split you can not cancel the changes as they
are already committed. By opening the transaction for editing before
the split paste the cancel option is now available.
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 646dd9b81..852c85cb7 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -953,6 +953,10 @@ gnc_split_register_paste_current (SplitRegister *reg)
}
}
+ /* Open the transaction for editing. */
+ if (gnc_split_register_begin_edit_or_warn (info, trans))
+ {
+ LEAVE("can't begin editing");
return;
}
commit a7f3f5213fc08dd4d73af4da062d26fd8c78454f
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Fri Jun 7 13:37:50 2019 +0100
Add a dialogue about pasting on an anchoring split
Present a dialogue advising that you can not paste a split on top of
the anchoring split.
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index f1cd66390..646dd9b81 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -921,6 +921,11 @@ gnc_split_register_paste_current (SplitRegister *reg)
{
const char *message = _("You are about to overwrite an existing split. "
"Are you sure you want to do that?");
+ const char *anchor_message = _("This is the split anchoring this transaction "
+ "to the register. You may not overwrite it from "
+ "this register window. You may overwrite it if "
+ "you navigate to a register that shows another "
+ "side of this same transaction.");
if (copied_class == CURSOR_CLASS_TRANS)
{
@@ -929,12 +934,25 @@ gnc_split_register_paste_current (SplitRegister *reg)
return;
}
- /* Ask before overwriting an existing split. */
- if (split != NULL &&
- !gnc_verify_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
- FALSE, "%s", message))
+ if (split != NULL)
{
- LEAVE("user cancelled");
+ /* the General Journal does not have any anchoring splits */
+ if ((reg->type != GENERAL_JOURNAL) &&
+ split == gnc_split_register_get_current_trans_split (reg, NULL))
+ {
+ gnc_warning_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
+ "%s", anchor_message);
+ LEAVE("anchore split");
+ return;
+ }
+ else if (!gnc_verify_dialog (GTK_WINDOW (gnc_split_register_get_parent (reg)),
+ FALSE, "%s", message))
+ {
+ LEAVE("user cancelled");
+ return;
+ }
+ }
+
return;
}
@@ -1040,7 +1058,7 @@ gnc_split_register_is_blank_split (SplitRegister *reg, Split *split)
{
SRInfo *info = gnc_split_register_get_info (reg);
Split *current_blank_split = xaccSplitLookup (&info->blank_split_guid, gnc_get_current_book ());
-
+
if (split == current_blank_split)
return TRUE;
commit 4cf92baaa7aea478918c986171953a377396b68c
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Fri Jun 7 13:37:07 2019 +0100
Bug 797249 - Cutting home account causes transaction to disappear
Add some test for when cutting splits from transactions that prevent
the cutting of the anchor split and warn when the split is a reconciled
one or when cutting the transaction that it contains reconciled splits.
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 6950f3945..f199a7dab 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -3582,17 +3582,16 @@ gnc_plugin_page_register_cmd_find_transactions (GtkAction *action,
static void
gnc_plugin_page_register_cmd_cut_transaction (GtkAction *action,
- GncPluginPageRegister *page)
+ GncPluginPageRegister *plugin_page)
{
GncPluginPageRegisterPrivate *priv;
- SplitRegister *reg;
- g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(page));
+ ENTER("(action %p, plugin_page %p)", action, plugin_page);
- ENTER("(action %p, page %p)", action, page);
- priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
- reg = gnc_ledger_display_get_split_register(priv->ledger);
- gnc_split_register_cut_current(reg);
+ g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+ priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+ gsr_default_cut_txn_handler (priv->gsr, NULL);
LEAVE(" ");
}
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 1c0f3dfac..628da74d5 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -71,6 +71,7 @@ static GtkWidget* add_summary_label( GtkWidget *summarybar, gboolean pack_start,
static void gsr_summarybar_set_arrow_draw (GNCSplitReg *gsr);
static void gnc_split_reg_determine_read_only( GNCSplitReg *gsr );
+static gboolean is_trans_readonly_and_warn (GtkWindow *parent, Transaction *trans);
static GNCPlaceholderType gnc_split_reg_get_placeholder( GNCSplitReg *gsr );
static GtkWidget *gnc_split_reg_get_parent( GNCLedgerDisplay *ledger );
@@ -790,10 +791,165 @@ gnc_split_reg_paste_cb (GtkWidget *w, gpointer data)
}
void
-gsr_default_cut_txn_handler( GNCSplitReg *gsr, gpointer data )
+gsr_default_cut_txn_handler (GNCSplitReg *gsr, gpointer data)
{
- gnc_split_register_cut_current
- (gnc_ledger_display_get_split_register( gsr->ledger ));
+ CursorClass cursor_class;
+ SplitRegister *reg;
+ Transaction *trans;
+ Split *split;
+ GtkWidget *dialog;
+ gint response;
+ const gchar *warning;
+
+ reg = gnc_ledger_display_get_split_register (gsr->ledger);
+
+ /* get the current split based on cursor position */
+ split = gnc_split_register_get_current_split (reg);
+ if (split == NULL)
+ {
+ gnc_split_register_cancel_cursor_split_changes (reg);
+ return;
+ }
+
+ trans = xaccSplitGetParent (split);
+ cursor_class = gnc_split_register_get_current_cursor_class (reg);
+
+ /* test for blank_split reference pointing to split */
+ if (gnc_split_register_is_blank_split (reg, split))
+ gnc_split_register_change_blank_split_ref (reg, split);
+
+ /* Cutting the blank split just cancels */
+ {
+ Split *blank_split = gnc_split_register_get_blank_split (reg);
+
+ if (split == blank_split)
+ {
+ gnc_split_register_cancel_cursor_trans_changes (reg);
+ return;
+ }
+ }
+
+ if (cursor_class == CURSOR_CLASS_NONE)
+ return;
+
+ /* this is probably not required but leave as a double check */
+ if (is_trans_readonly_and_warn (GTK_WINDOW(gsr->window), trans))
+ return;
+
+ /* On a split cursor, just delete the one split. */
+ if (cursor_class == CURSOR_CLASS_SPLIT)
+ {
+ const char *format = _("Cut the split '%s' from the transaction '%s'?");
+ const char *recn_warn = _("You would be removing a reconciled split! "
+ "This is not a good idea as it will cause your "
+ "reconciled balance to be off.");
+ const char *anchor_error = _("You cannot cut this split.");
+ const char *anchor_split = _("This is the split anchoring this transaction "
+ "to the register. You may not remove it from "
+ "this register window. You may remove the "
+ "entire transaction from this window, or you "
+ "may navigate to a register that shows "
+ "another side of this same transaction and "
+ "remove the split from that register.");
+ char *buf = NULL;
+ const char *memo;
+ const char *desc;
+ char recn;
+
+ if (reg->type != GENERAL_JOURNAL) // no anchoring split
+ {
+ if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+ {
+ dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+ GTK_DIALOG_MODAL
+ | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ "%s", anchor_error);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+ "%s", anchor_split);
+ gtk_dialog_run (GTK_DIALOG(dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
+ }
+ memo = xaccSplitGetMemo (split);
+ memo = (memo && *memo) ? memo : _("(no memo)");
+
+ desc = xaccTransGetDescription (trans);
+ desc = (desc && *desc) ? desc : _("(no description)");
+
+ /* ask for user confirmation before performing permanent damage */
+ buf = g_strdup_printf (format, memo, desc);
+ dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+ GTK_DIALOG_MODAL
+ | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ "%s", buf);
+ g_free (buf);
+ recn = xaccSplitGetReconcile (split);
+ if (recn == YREC || recn == FREC)
+ {
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+ "%s", recn_warn);
+ warning = GNC_PREF_WARN_REG_SPLIT_DEL_RECD;
+ }
+ else
+ {
+ warning = GNC_PREF_WARN_REG_SPLIT_DEL;
+ }
+
+ gtk_dialog_add_button (GTK_DIALOG(dialog),
+ _("_Cancel"), GTK_RESPONSE_CANCEL);
+ gnc_gtk_dialog_add_button (dialog, _("_Cut Split"),
+ "edit-delete", GTK_RESPONSE_ACCEPT);
+ response = gnc_dialog_run (GTK_DIALOG(dialog), warning);
+ gtk_widget_destroy (dialog);
+ if (response != GTK_RESPONSE_ACCEPT)
+ return;
+
+ gnc_split_register_cut_current (reg);
+ return;
+ }
+
+ /* On a transaction cursor with 2 or fewer splits in single or double
+ * mode, we just delete the whole transaction, kerblooie */
+ {
+ const char *title = _("Cut the current transaction?");
+ const char *recn_warn = _("You would be removing a transaction "
+ "with reconciled splits! "
+ "This is not a good idea as it will cause your "
+ "reconciled balance to be off.");
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW(gsr->window),
+ GTK_DIALOG_MODAL
+ | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_WARNING,
+ GTK_BUTTONS_NONE,
+ "%s", title);
+ if (xaccTransHasReconciledSplits (trans))
+ {
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG(dialog),
+ "%s", recn_warn);
+ warning = GNC_PREF_WARN_REG_TRANS_DEL_RECD;
+ }
+ else
+ {
+ warning = GNC_PREF_WARN_REG_TRANS_DEL;
+ }
+ gtk_dialog_add_button (GTK_DIALOG(dialog),
+ _("_Cancel"), GTK_RESPONSE_CANCEL);
+ gnc_gtk_dialog_add_button (dialog, _("_Cut Transaction"),
+ "edit-delete", GTK_RESPONSE_ACCEPT);
+ response = gnc_dialog_run (GTK_DIALOG(dialog), warning);
+ gtk_widget_destroy (dialog);
+ if (response != GTK_RESPONSE_ACCEPT)
+ return;
+
+ gnc_split_register_cut_current (reg);
+ return;
+ }
}
/**
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index af22ef4fb..d54372c8e 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -263,6 +263,7 @@ void gsr_default_associate_handler (GNCSplitReg *gsr, gboolean uri_is_file);
void gsr_default_execassociated_handler( GNCSplitReg *gsr, gpointer data );
void gnc_split_reg_enter( GNCSplitReg *gsr, gboolean next_transaction );
void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data );
+void gsr_default_cut_txn_handler( GNCSplitReg *gsr, gpointer data );
void gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data );
void gsr_default_expand_handler( GNCSplitReg *gsr, gpointer data );
void gsr_default_schedule_handler( GNCSplitReg *gsr, gpointer data );
commit 8c6832bcb95af313869b7d99a3066c2317719439
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Fri Jun 7 13:36:24 2019 +0100
Allow deleting all splits in the General Journal
In the General Journal there is no anchor split so allow all splits to
be deleted.
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 3d9f14cb8..1c0f3dfac 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -1448,19 +1448,22 @@ gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data )
const char *desc;
char recn;
- if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+ if (reg->type != GENERAL_JOURNAL) // no anchoring split
{
- dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
- GTK_DIALOG_MODAL
- | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- "%s", anchor_error);
- gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
- "%s", anchor_split);
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy (dialog);
- return;
+ if (split == gnc_split_register_get_current_trans_split (reg, NULL))
+ {
+ dialog = gtk_message_dialog_new(GTK_WINDOW(gsr->window),
+ GTK_DIALOG_MODAL
+ | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK,
+ "%s", anchor_error);
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
+ "%s", anchor_split);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy (dialog);
+ return;
+ }
}
memo = xaccSplitGetMemo (split);
commit 5cb1d0ebb95226b14e38937a7b33b87797e69583
Author: Robert Fewell <14uBobIT at gmail.com>
Date: Tue Jun 4 16:31:15 2019 +0100
Disable menu options that should not be possible when
transactions are marked read only
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index e7d18cde4..6950f3945 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -929,13 +929,15 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
GncPluginPageRegisterPrivate *priv;
SplitRegister *reg;
GtkAction *action;
- gboolean expanded, voided;
+ gboolean expanded, voided, read_only = FALSE;
Transaction *trans;
+ CursorClass cursor_class;
const char *uri;
/* Set 'Split Transaction' */
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
reg = gnc_ledger_display_get_split_register(priv->ledger);
+ cursor_class = gnc_split_register_get_current_cursor_class (reg);
expanded = gnc_split_register_current_trans_expanded(reg);
action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
"SplitTransactionAction");
@@ -946,13 +948,51 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
g_signal_handlers_unblock_by_func
(action, gnc_plugin_page_register_cmd_expand_transaction, page);
- /* Set 'Void' and 'Unvoid' */
- trans = gnc_split_register_get_current_trans(reg);
+ /* Set available actions based on read only */
+ trans = gnc_split_register_get_current_trans (reg);
+
+ if (trans)
+ read_only = xaccTransIsReadonlyByPostedDate (trans);
voided = xaccTransHasSplitsInState(trans, VREC);
+
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "CutTransactionAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "PasteTransactionAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "DeleteTransactionAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "DuplicateTransactionAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), TRUE);
+
+ if (cursor_class == CURSOR_CLASS_SPLIT)
+ {
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "DuplicateTransactionAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+ }
+
+ action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
+ "RemoveTransactionSplitsAction");
+ gtk_action_set_sensitive (GTK_ACTION(action), !read_only & !voided);
+
+ /* Set 'Void' and 'Unvoid' */
+ if (read_only)
+ voided = TRUE;
+
action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
"VoidTransactionAction");
gtk_action_set_sensitive (GTK_ACTION(action), !voided);
+ if (read_only)
+ voided = FALSE;
+
action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page),
"UnvoidTransactionAction");
gtk_action_set_sensitive (GTK_ACTION(action), voided);
@@ -981,7 +1021,6 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag
{
const char **iter, **label_iter, **tooltip_iter;
gboolean curr_label_trans = FALSE;
- CursorClass cursor_class = gnc_split_register_get_current_cursor_class (reg);
iter = tran_vs_split_actions;
action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page), *iter);
label_iter = tran_action_labels;
Summary of changes:
gnucash/gnome/gnc-plugin-page-register.c | 60 +++++--
gnucash/gnome/gnc-split-reg.c | 189 +++++++++++++++++++--
gnucash/gnome/gnc-split-reg.h | 1 +
.../register/ledger-core/split-register-model.c | 14 +-
gnucash/register/ledger-core/split-register.c | 34 +++-
5 files changed, 265 insertions(+), 33 deletions(-)
More information about the gnucash-changes
mailing list