gnucash maint: Revert "[auto-clear] provide live feedback when a valid end_amount is input"

Christopher Lam clam at code.gnucash.org
Mon Nov 9 07:00:51 EST 2020


Updated	 via  https://github.com/Gnucash/gnucash/commit/6a6396ed (commit)
	from  https://github.com/Gnucash/gnucash/commit/e09a26ba (commit)



commit 6a6396edca192cadf9cc929c0245b143d03e2e06
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Nov 9 19:54:54 2020 +0800

    Revert "[auto-clear] provide live feedback when a valid end_amount is input"
    
    This reverts commit afcf1765f6c56931d5b4545613d32b8d60c4e7bc.
    
    Not satisfactory. Introduces unacceptable delay after each
    keystroke. Will try again when knapsack algorithm is improved to
    generate toclear_list as GHashTable value.

diff --git a/gnucash/gnome/window-autoclear.c b/gnucash/gnome/window-autoclear.c
index d7dec2eab..f5270be82 100644
--- a/gnucash/gnome/window-autoclear.c
+++ b/gnucash/gnome/window-autoclear.c
@@ -52,7 +52,6 @@ struct _AutoClearWindow
     GtkWidget *cancel_button;
     GtkWidget *show_cleared_splits_button;
     GtkLabel *status_label;
-    GList *toclear_list;
 };
 
 /** Callback prototypes************************************************/
@@ -123,44 +122,47 @@ void
 gnc_autoclear_window_ok_cb (GtkWidget *widget,
                             AutoClearWindow *data)
 {
+    GList *toclear_list;
     gnc_numeric toclear_value;
     gchar *errmsg = NULL;
 
     g_return_if_fail (widget && data);
 
-    /* sanity check: if toclear_list is null, bail out. but this
-       should not happen because the OK button is disabled if there is
-       autoclear error, and toclear_list is null */
-    g_return_if_fail (data->toclear_list);
+    toclear_value = gnc_amount_edit_get_amount(data->end_value);
 
-    xaccAccountBeginEdit (data->account);
-    for (GList *node = data->toclear_list; node; node = node->next)
-        xaccSplitSetReconcile (node->data, CREC);
-    xaccAccountCommitEdit (data->account);
+    if (gnc_reverse_balance(data->account))
+        toclear_value = gnc_numeric_neg (toclear_value);
 
-    if (gtk_toggle_button_get_active
-        (GTK_TOGGLE_BUTTON (data->show_cleared_splits_button)))
-        show_cleared_splits (data->toclear_list);
+    toclear_value = gnc_numeric_convert
+        (toclear_value, xaccAccountGetCommoditySCU(data->account), GNC_HOW_RND_ROUND);
 
-    /* Close window */
-    gnc_autoclear_window_cancel_cb (widget, data);
-}
+    toclear_list = gnc_account_get_autoclear_splits
+        (data->account, toclear_value, &errmsg);
 
-static gboolean
-gnc_autoclear_window_delete_cb (GtkWidget *widget, GdkEvent  *event,
-                                AutoClearWindow *data)
-{
-    if (data->toclear_list)
-        g_list_free (data->toclear_list);
-    g_free(data);
-    return FALSE;
-}
+    if (errmsg)
+    {
+        gtk_label_set_text (data->status_label, errmsg);
+        gnc_amount_edit_set_amount (data->end_value, toclear_value);
+        gtk_editable_select_region (GTK_EDITABLE (data->end_value), 0, -1);
+        g_free (errmsg);
+    }
+    else
+    {
+        xaccAccountBeginEdit (data->account);
+        for (GList *node = toclear_list; node; node = node->next)
+            xaccSplitSetReconcile (node->data, CREC);
+        xaccAccountCommitEdit (data->account);
 
-static void
-gnc_autoclear_end_value_activate_cb (GtkWidget *widget, AutoClearWindow *data)
-{
-    if (data->toclear_list)
-        gnc_autoclear_window_ok_cb (widget, data);
+        if (gtk_toggle_button_get_active
+            (GTK_TOGGLE_BUTTON (data->show_cleared_splits_button)))
+            show_cleared_splits (toclear_list);
+
+        g_list_free (toclear_list);
+
+        /* Close window */
+        gtk_widget_destroy (data->window);
+        g_free (data);
+    }
 }
 
 void
@@ -169,80 +171,12 @@ gnc_autoclear_window_cancel_cb (GtkWidget *widget,
 {
     /* Close window */
     gtk_widget_destroy(data->window);
-    if (data->toclear_list)
-        g_list_free (data->toclear_list);
     g_free(data);
 }
 
-#define MAX_LENGTH 50
-
-static void end_value_changed_cb (GtkEditable *editable, AutoClearWindow *data)
+static void clear_status_label_cb (GtkEditable *editable, AutoClearWindow *data)
 {
-    gnc_numeric toclear_value;
-    gchar *errmsg = NULL;
-
-    if (gnc_amount_edit_expr_is_valid (data->end_value, &toclear_value, TRUE))
-    {
-        gtk_widget_set_sensitive (data->ok_button, FALSE);
-        gtk_label_set_text (data->status_label, "");
-        return;
-    }
-
-    if (gnc_reverse_balance (data->account))
-        toclear_value = gnc_numeric_neg (toclear_value);
-
-    toclear_value = gnc_numeric_convert
-        (toclear_value, xaccAccountGetCommoditySCU(data->account), GNC_HOW_RND_ROUND);
-
-    if (data->toclear_list)
-        g_list_free (data->toclear_list);
-
-    data->toclear_list = gnc_account_get_autoclear_splits
-        (data->account, toclear_value, &errmsg);
-
-    gtk_widget_set_sensitive (data->ok_button, errmsg == NULL);
-
-    if (errmsg)
-    {
-        gtk_widget_set_sensitive (data->ok_button, FALSE);
-        gtk_label_set_text (data->status_label, errmsg);
-        g_free (errmsg);
-    }
-    else
-    {
-        gchar *status = g_strdup (_("The following splits will be cleared:"));
-        GNCPrintAmountInfo p_info = gnc_account_print_info (data->account, TRUE);
-        gboolean reverse = gnc_reverse_balance (data->account);
-        for (GList *node = data->toclear_list; node; node = node->next)
-        {
-            Transaction *trans = xaccSplitGetParent (node->data);
-            gnc_numeric amount = xaccSplitGetAmount (node->data);
-            const gchar *desc = xaccTransGetDescription (trans);
-            gchar *datestr = qof_print_date (xaccTransGetDate (trans));
-            gchar *newdesc, *newstatus;
-
-            if (g_utf8_strlen (desc, -1) > MAX_LENGTH)
-            {
-                gchar *trunc = g_utf8_substring (desc, 0, MAX_LENGTH);
-                newdesc = g_strdup_printf ("%s...", trunc);
-                g_free (trunc);
-            }
-            else
-                newdesc = g_strdup (desc);
-
-            if (reverse)
-                amount = gnc_numeric_neg (amount);
-
-            newstatus = g_strdup_printf ("%s\n%s %s %s", status, datestr,
-                                         newdesc, xaccPrintAmount (amount, p_info));
-            g_free (status);
-            g_free (datestr);
-            g_free (newdesc);
-            status = newstatus;
-        }
-        gtk_label_set_text (data->status_label, status);
-        g_free (status);
-    }
+    gtk_label_set_text (data->status_label, "");
 }
 
 
@@ -278,23 +212,13 @@ autoClearWindow (GtkWidget *parent, Account *account)
     // Set the name for this dialog so it can be easily manipulated with css
     gtk_widget_set_name (GTK_WIDGET(data->window), "gnc-id-auto-clear");
 
-    data->ok_button = GTK_WIDGET (gtk_builder_get_object (builder, "ok_button"));
-    gtk_widget_set_sensitive (data->ok_button, FALSE);
-
-    data->cancel_button = GTK_WIDGET (gtk_builder_get_object
-                                      (builder, "cancel_button"));
-
     data->show_cleared_splits_button =
         GTK_WIDGET (gtk_builder_get_object (builder, "show_cleared_splits_button"));
 
     /* Add amount edit box */
     data->end_value = GNC_AMOUNT_EDIT(gnc_amount_edit_new());
     g_signal_connect(GTK_WIDGET(data->end_value), "activate",
-                     G_CALLBACK(gnc_autoclear_end_value_activate_cb), data);
-    g_signal_connect(GTK_WIDGET(data->ok_button), "activate",
                      G_CALLBACK(gnc_autoclear_window_ok_cb), data);
-    g_signal_connect(GTK_WIDGET(data->cancel_button), "activate",
-                     G_CALLBACK(gnc_autoclear_window_cancel_cb), data);
 
     box   = GTK_BOX(gtk_builder_get_object (builder, "end_value_box"));
     gtk_box_pack_start(box, GTK_WIDGET(data->end_value), TRUE, TRUE, 0);
@@ -313,10 +237,7 @@ autoClearWindow (GtkWidget *parent, Account *account)
     data->status_label = GTK_LABEL(gtk_builder_get_object (builder, "status_label"));
 
     g_signal_connect (GTK_WIDGET(data->end_value), "changed",
-                      G_CALLBACK(end_value_changed_cb), data);
-
-    g_signal_connect (data->window, "delete-event",
-                      G_CALLBACK (gnc_autoclear_window_delete_cb), data);
+                      G_CALLBACK(clear_status_label_cb), data);
 
     if (parent != NULL)
         gtk_window_set_transient_for (GTK_WINDOW (data->window), GTK_WINDOW (parent));



Summary of changes:
 gnucash/gnome/window-autoclear.c | 147 +++++++++------------------------------
 1 file changed, 34 insertions(+), 113 deletions(-)



More information about the gnucash-changes mailing list