gnucash maint: Multiple changes pushed

Robert Fewell bobit at code.gnucash.org
Sun Nov 22 05:48:01 EST 2020


Updated	 via  https://github.com/Gnucash/gnucash/commit/3676728d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c2f9c5bf (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d518500a (commit)
	 via  https://github.com/Gnucash/gnucash/commit/faaa580d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/02685612 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ae39df07 (commit)
	from  https://github.com/Gnucash/gnucash/commit/562b4be2 (commit)



commit 3676728d2f8a19f7f66ccaa43230bd3c75d17b95
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:41:44 2020 +0000

    Bug 330930 - Financial Calculator resets payment period to zero
    
    When the preference option 'Numbers, Date, Time' ->
    'Automatic Decimal Point' is set and you change the 'Payment periods'
    to say 11 you end up with zero as number entered becomes 0.11
    
    To fix this treat the Periods GNCAmountEdit widget as a plain GtkEntry
    and not use the GNCAmountEdit evaluate functions.

diff --git a/gnucash/gnome/dialog-fincalc.c b/gnucash/gnome/dialog-fincalc.c
index 495152c67..995b6cd8c 100644
--- a/gnucash/gnome/dialog-fincalc.c
+++ b/gnucash/gnome/dialog-fincalc.c
@@ -183,12 +183,21 @@ gui_to_fi(FinCalcDialog *fcd)
     GtkToggleButton *toggle;
     gnc_numeric npp;
     int i;
+    const gchar *text;
 
     if (fcd == NULL)
         return;
 
-    npp =
-        gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS]));
+    /* treat PAYMENT_PERIODS as a plain GtkEntry */
+    text = gtk_entry_get_text (GTK_ENTRY(GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS])));
+    if (text && *text)
+    {
+        gnc_numeric out;
+        gboolean result = string_to_gnc_numeric (text, &out);
+        npp = gnc_numeric_convert (out, 1, GNC_HOW_RND_TRUNC);
+    }
+    else
+        npp = gnc_numeric_zero ();
     fcd->financial_info.npp = npp.num;
 
     fcd->financial_info.ir =
@@ -338,10 +347,14 @@ can_calc_value(FinCalcDialog *fcd, FinCalcValue value, int *error_item)
                 return missing;
             }
 
-            if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (fcd->amounts[i])))
+            /* treat PAYMENT_PERIODS as a plain GtkEntry */
+            if (i != PAYMENT_PERIODS)
             {
-                *error_item = i;
-                return bad_exp;
+                if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (fcd->amounts[i])))
+                {
+                    *error_item = i;
+                    return bad_exp;
+                }
             }
         }
 
@@ -371,17 +384,27 @@ can_calc_value(FinCalcDialog *fcd, FinCalcValue value, int *error_item)
     case PRESENT_VALUE:
     case PERIODIC_PAYMENT:
     case FUTURE_VALUE:
-        nvalue = gnc_amount_edit_get_amount
-                 (GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS]));
-        if (gnc_numeric_zero_p (nvalue))
-        {
-            *error_item = PAYMENT_PERIODS;
-            return _("The number of payments cannot be zero.");
-        }
-        if (gnc_numeric_negative_p (nvalue))
         {
-            *error_item = PAYMENT_PERIODS;
-            return _("The number of payments cannot be negative.");
+            /* treat PAYMENT_PERIODS as a plain GtkEntry */
+            GNCAmountEdit *edit = GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS]);
+            const gchar *text = gtk_entry_get_text (GTK_ENTRY(edit));
+            gboolean result = string_to_gnc_numeric (text, &nvalue);
+
+            if (!result)
+            {
+                *error_item = PAYMENT_PERIODS;
+                return bad_exp;
+            }
+            if (gnc_numeric_zero_p (nvalue))
+            {
+                *error_item = PAYMENT_PERIODS;
+                return _("The number of payments cannot be zero.");
+            }
+            if (gnc_numeric_negative_p (nvalue))
+            {
+                *error_item = PAYMENT_PERIODS;
+                return _("The number of payments cannot be negative.");
+            }
         }
         break;
     default:

commit c2f9c5bfb1330b642c1bcc178cea7deedd070c07
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:39:44 2020 +0000

    Bug 106746 - Selecting New account in Loan Assistant
    
    Set the modal property on the GNCAccountSel widgets, that way the new
    account will selected.

diff --git a/gnucash/gnome/assistant-loan.cpp b/gnucash/gnome/assistant-loan.cpp
index e7df7383a..ed08172f6 100644
--- a/gnucash/gnome/assistant-loan.cpp
+++ b/gnucash/gnome/assistant-loan.cpp
@@ -637,6 +637,7 @@ gnc_loan_assistant_create( LoanAssistantData *ldd )
 
                 gtk_widget_set_halign (GTK_WIDGET(gas), GTK_ALIGN_FILL);
                 gnc_account_sel_set_hexpand (GNC_ACCOUNT_SEL(gas), true);
+                gnc_account_sel_set_new_account_modal (GNC_ACCOUNT_SEL(gas), true);
                 g_object_set (GTK_WIDGET(gas), "margin", 2, nullptr);
                 *(gas_data[i].loc) = gas;
             }
@@ -730,6 +731,7 @@ gnc_loan_assistant_create( LoanAssistantData *ldd )
         gtk_widget_set_sensitive( GTK_WIDGET(ldd->optEscrowHBox), FALSE );
         ldd->optEscrowGAS = GNC_ACCOUNT_SEL(gnc_account_sel_new());
         gnc_account_sel_set_hexpand (GNC_ACCOUNT_SEL(ldd->optEscrowGAS), true);
+        gnc_account_sel_set_new_account_modal (GNC_ACCOUNT_SEL(ldd->optEscrowGAS), true);
         gnc_account_sel_set_new_account_ability( ldd->optEscrowGAS, TRUE );
         gtk_container_add( GTK_CONTAINER(ldd->optEscrowHBox),
                            GTK_WIDGET(ldd->optEscrowGAS) );

commit d518500a309a015c05e388af3a109acbdd8ccaf4
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:38:57 2020 +0000

    Change source files gnc-account-sel.* for space and tabs

diff --git a/gnucash/gnome-utils/gnc-account-sel.c b/gnucash/gnome-utils/gnc-account-sel.c
index d34c30e21..9174a663c 100644
--- a/gnucash/gnome-utils/gnc-account-sel.c
+++ b/gnucash/gnome-utils/gnc-account-sel.c
@@ -89,35 +89,32 @@ gnc_account_sel_get_type (void)
         };
 
         account_sel_type = g_type_register_static (GTK_TYPE_BOX,
-                           "GNCAccountSel",
-                           &account_sel_info, 0);
+                                                   "GNCAccountSel",
+                                                   &account_sel_info, 0);
     }
-
     return account_sel_type;
 }
 
-static
-void
-gnc_account_sel_event_cb( QofInstance *entity,
+static void
+gnc_account_sel_event_cb (QofInstance *entity,
                           QofEventId event_type,
                           gpointer user_data,
-                          gpointer event_data )
+                          gpointer event_data)
 {
-    if ( ! ( event_type == QOF_EVENT_CREATE
-             || event_type == QOF_EVENT_MODIFY
-             || event_type == QOF_EVENT_DESTROY )
-            || !GNC_IS_ACCOUNT(entity) )
+    if (!(event_type == QOF_EVENT_CREATE
+       || event_type == QOF_EVENT_MODIFY
+       || event_type == QOF_EVENT_DESTROY)
+       || !GNC_IS_ACCOUNT(entity))
     {
         return;
     }
-    gas_populate_list( (GNCAccountSel*)user_data );
+    gas_populate_list ((GNCAccountSel*)user_data);
 }
 
-static
-void
+static void
 gnc_account_sel_class_init (GNCAccountSelClass *klass)
 {
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
     parent_class = g_type_class_peek_parent (klass);
 
@@ -137,14 +134,14 @@ gnc_account_sel_class_init (GNCAccountSelClass *klass)
 }
 
 static void
-combo_changed_cb(GNCAccountSel *gas, gpointer combo)
+combo_changed_cb (GNCAccountSel *gas, gpointer combo)
 {
-    gint selected = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
+    gint selected = gtk_combo_box_get_active (GTK_COMBO_BOX(combo));
     if (selected == gas->currentSelection)
         return;
 
     gas->currentSelection = selected;
-    g_signal_emit_by_name(gas, "account_sel_changed");
+    g_signal_emit_by_name (gas, "account_sel_changed");
 }
 
 static void
@@ -159,37 +156,37 @@ gnc_account_sel_init (GNCAccountSel *gas)
     gas->newAccountButton = NULL;
     gas->currentSelection = -1;
 
-    g_object_set(gas, "spacing", 2, (gchar*)NULL);
+    g_object_set (gas, "spacing", 2, (gchar*)NULL);
 
     // Set the name for this widget so it can be easily manipulated with css
     gtk_widget_set_name (GTK_WIDGET(gas), "gnc-id-account-select");
 
-    gas->store = gtk_list_store_new(NUM_ACCT_COLS, G_TYPE_STRING, G_TYPE_POINTER);
-    widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(gas->store));
+    gas->store = gtk_list_store_new (NUM_ACCT_COLS, G_TYPE_STRING, G_TYPE_POINTER);
+    widget = gtk_combo_box_new_with_model_and_entry (GTK_TREE_MODEL(gas->store));
     gas->combo = GTK_COMBO_BOX(widget);
-    gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(widget), ACCT_COL_NAME);
-    g_object_unref(gas->store);
-    g_signal_connect_swapped(gas->combo, "changed",
-                             G_CALLBACK(combo_changed_cb), gas);
-    gtk_container_add( GTK_CONTAINER(gas), widget );
+    gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX(widget), ACCT_COL_NAME);
+    g_object_unref (gas->store);
+    g_signal_connect_swapped (gas->combo, "changed",
+                              G_CALLBACK(combo_changed_cb), gas);
+    gtk_container_add (GTK_CONTAINER(gas), widget);
 
     /* Add completion. */
-    gnc_cbwe_require_list_item(GTK_COMBO_BOX(widget));
+    gnc_cbwe_require_list_item (GTK_COMBO_BOX(widget));
 
     /* Get the accounts, place into combo list */
-    gas_populate_list( gas );
+    gas_populate_list (gas);
 
     gas->eventHandlerId =
-        qof_event_register_handler( gnc_account_sel_event_cb, gas );
+        qof_event_register_handler (gnc_account_sel_event_cb, gas);
 
     gas->initDone = TRUE;
 }
 
 void
-gnc_account_sel_set_hexpand ( GNCAccountSel *gas, gboolean expand )
+gnc_account_sel_set_hexpand (GNCAccountSel *gas, gboolean expand)
 {
-    gtk_widget_set_hexpand( GTK_WIDGET(gas), expand );
-    gtk_widget_set_hexpand( GTK_WIDGET(gas->combo), expand );
+    gtk_widget_set_hexpand (GTK_WIDGET(gas), expand);
+    gtk_widget_set_hexpand (GTK_WIDGET(gas->combo), expand);
 }
 
 typedef struct
@@ -198,9 +195,8 @@ typedef struct
     GList **outList;
 } account_filter_data;
 
-static
-void
-gas_populate_list( GNCAccountSel *gas )
+static void
+gas_populate_list (GNCAccountSel *gas)
 {
     account_filter_data atnd;
     Account *root;
@@ -211,56 +207,52 @@ gas_populate_list( GNCAccountSel *gas )
     GList *accts, *ptr, *filteredAccts;
     gchar *currentSel, *name;
 
-    entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gas->combo)));
-    currentSel = gtk_editable_get_chars(
-                     GTK_EDITABLE(entry), 0, -1 );
+    entry = GTK_ENTRY(gtk_bin_get_child (GTK_BIN(gas->combo)));
+    currentSel = gtk_editable_get_chars (GTK_EDITABLE(entry), 0, -1 );
 
-    g_signal_handlers_block_by_func( gas->combo, combo_changed_cb , gas );
+    g_signal_handlers_block_by_func (gas->combo, combo_changed_cb , gas);
 
-    root = gnc_book_get_root_account( gnc_get_current_book() );
-    accts = gnc_account_get_descendants_sorted( root );
+    root = gnc_book_get_root_account (gnc_get_current_book ());
+    accts = gnc_account_get_descendants_sorted (root);
 
     filteredAccts   = NULL;
     atnd.gas        = gas;
     atnd.outList    = &filteredAccts;
 
-    g_list_foreach( accts, gas_filter_accounts, (gpointer)&atnd );
-    g_list_free( accts );
+    g_list_foreach (accts, gas_filter_accounts, (gpointer)&atnd);
+    g_list_free (accts);
 
-    gtk_list_store_clear(gas->store);
+    gtk_list_store_clear (gas->store);
     for (ptr = filteredAccts, i = 0; ptr; ptr = g_list_next(ptr), i++)
     {
         acc = ptr->data;
-        name = gnc_account_get_full_name(acc);
-        gtk_list_store_append(gas->store, &iter);
-        gtk_list_store_set(gas->store, &iter,
-                           ACCT_COL_NAME, name,
-                           ACCT_COL_PTR,  acc,
-                           -1);
-        if (g_utf8_collate(name, currentSel) == 0)
+        name = gnc_account_get_full_name (acc);
+        gtk_list_store_append (gas->store, &iter);
+        gtk_list_store_set (gas->store, &iter,
+                            ACCT_COL_NAME, name,
+                            ACCT_COL_PTR,  acc,
+                            -1);
+        if (g_utf8_collate (name, currentSel) == 0)
         {
             active = i;
-            g_free(name);
+            g_free (name);
         }
     }
 
     /* If the account which was in the text box before still exists, then
      * reset to it. */
     if (active != -1)
-        gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), active);
+        gtk_combo_box_set_active (GTK_COMBO_BOX(gas->combo), active);
 
-    g_signal_handlers_unblock_by_func( gas->combo, combo_changed_cb , gas );
+    g_signal_handlers_unblock_by_func (gas->combo, combo_changed_cb , gas);
 
-    g_list_free( filteredAccts );
-    if ( currentSel )
-    {
-        g_free( currentSel );
-    }
+    g_list_free (filteredAccts);
+    if (currentSel)
+        g_free (currentSel);
 }
 
-static
-void
-gas_filter_accounts( gpointer data, gpointer user_data )
+static void
+gas_filter_accounts (gpointer data, gpointer user_data)
 {
     account_filter_data *atnd;
     Account *a;
@@ -268,53 +260,47 @@ gas_filter_accounts( gpointer data, gpointer user_data )
     atnd = (account_filter_data*)user_data;
     a = (Account*)data;
     /* Filter as we've been configured to do. */
-    if ( atnd->gas->acctTypeFilters )
+    if (atnd->gas->acctTypeFilters)
     {
         /* g_list_find is the poor-mans '(member ...)', especially
          * easy when the data pointers in the list are just casted
          * account type identifiers. */
-        if ( g_list_find( atnd->gas->acctTypeFilters,
-                          GINT_TO_POINTER(xaccAccountGetType( a )) )
-                == NULL )
+        if (g_list_find (atnd->gas->acctTypeFilters,
+                          GINT_TO_POINTER(xaccAccountGetType (a)))
+                == NULL)
         {
             return;
         }
     }
 
-    if ( atnd->gas->acctCommodityFilters )
+    if (atnd->gas->acctCommodityFilters)
     {
-        if ( g_list_find_custom( atnd->gas->acctCommodityFilters,
-                                 GINT_TO_POINTER(xaccAccountGetCommodity( a )),
-                                 gnc_commodity_compare_void)
-                == NULL )
+        if (g_list_find_custom (atnd->gas->acctCommodityFilters,
+                                GINT_TO_POINTER(xaccAccountGetCommodity (a)),
+                                gnc_commodity_compare_void)
+                == NULL)
         {
             return;
         }
     }
-
-
-    *atnd->outList = g_list_append( *atnd->outList, a );
+    *atnd->outList = g_list_append (*atnd->outList, a);
 }
 
-
 GtkWidget *
 gnc_account_sel_new (void)
 {
-    GNCAccountSel *gas;
-
-    gas = g_object_new (GNC_TYPE_ACCOUNT_SEL, NULL);
+    GNCAccountSel *gas = g_object_new (GNC_TYPE_ACCOUNT_SEL, NULL);
 
-    return GTK_WIDGET (gas);
+    return GTK_WIDGET(gas);
 }
 
 typedef struct
 {
     GNCAccountSel *gas;
-    Account *acct;
+    Account       *acct;
 } gas_find_data;
 
-static
-gboolean
+static gboolean
 gnc_account_sel_find_account (GtkTreeModel *model,
                               GtkTreePath *path,
                               GtkTreeIter *iter,
@@ -322,93 +308,89 @@ gnc_account_sel_find_account (GtkTreeModel *model,
 {
     Account *model_acc;
 
-    gtk_tree_model_get(model, iter, ACCT_COL_PTR, &model_acc, -1);
+    gtk_tree_model_get (model, iter, ACCT_COL_PTR, &model_acc, -1);
     if (data->acct != model_acc)
         return FALSE;
 
-    gtk_combo_box_set_active_iter(GTK_COMBO_BOX(data->gas->combo), iter);
+    gtk_combo_box_set_active_iter (GTK_COMBO_BOX(data->gas->combo), iter);
     return TRUE;
 }
+
 void
-gnc_account_sel_set_account( GNCAccountSel *gas, Account *acct, gboolean set_default_acct )
+gnc_account_sel_set_account (GNCAccountSel *gas, Account *acct,
+                             gboolean set_default_acct)
 {
     gas_find_data data;
 
     if (set_default_acct)
     {
-        gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), 0);
-        if ( !acct )
+        gtk_combo_box_set_active (GTK_COMBO_BOX(gas->combo), 0);
+        if (!acct)
             return;
     }
     else
     {
-        gtk_combo_box_set_active( GTK_COMBO_BOX(gas->combo), -1 );
-        if ( !acct )
+        gtk_combo_box_set_active (GTK_COMBO_BOX(gas->combo), -1 );
+        if (!acct)
         {
-            GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gas->combo)));
-            gtk_editable_delete_text(GTK_EDITABLE(entry), 0, -1);
+            GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child (GTK_BIN(gas->combo)));
+            gtk_editable_delete_text (GTK_EDITABLE(entry), 0, -1);
             return;
         }
     }
     data.gas = gas;
     data.acct = acct;
-    gtk_tree_model_foreach(GTK_TREE_MODEL(gas->store),
-                           (GtkTreeModelForeachFunc)gnc_account_sel_find_account,
-                           &data);
+    gtk_tree_model_foreach (GTK_TREE_MODEL(gas->store),
+                            (GtkTreeModelForeachFunc)gnc_account_sel_find_account,
+                            &data);
 }
 
 Account*
-gnc_account_sel_get_account( GNCAccountSel *gas )
+gnc_account_sel_get_account (GNCAccountSel *gas)
 {
     GtkTreeIter iter;
     Account *acc;
 
-    if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(gas->combo), &iter))
+    if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX(gas->combo), &iter))
         return NULL;
 
-    gtk_tree_model_get(GTK_TREE_MODEL(gas->store), &iter,
-                       ACCT_COL_PTR, &acc,
-                       -1);
+    gtk_tree_model_get (GTK_TREE_MODEL(gas->store), &iter,
+                        ACCT_COL_PTR, &acc,
+                        -1);
     return acc;
 }
 
-
 void
-gnc_account_sel_set_acct_filters( GNCAccountSel *gas, GList *typeFilters, GList *commodityFilters )
+gnc_account_sel_set_acct_filters (GNCAccountSel *gas, GList *typeFilters,
+                                  GList *commodityFilters)
 {
 
-    if ( gas->acctTypeFilters != NULL )
+    if (gas->acctTypeFilters != NULL)
     {
-        g_list_free( gas->acctTypeFilters );
+        g_list_free (gas->acctTypeFilters);
         gas->acctTypeFilters = NULL;
     }
 
-    if ( gas->acctCommodityFilters != NULL)
+    if (gas->acctCommodityFilters != NULL)
     {
-        g_list_free( gas->acctCommodityFilters );
+        g_list_free (gas->acctCommodityFilters);
         gas->acctCommodityFilters = NULL;
     }
 
     /* If both filters are null, then no filters exist. */
-    if (( ! typeFilters ) && ( ! commodityFilters))
-    {
+    if ((!typeFilters) && (!commodityFilters))
         return;
-    }
 
     /* This works because the GNCAccountTypes in the list are
      * ints-casted-as-pointers. */
     if (typeFilters)
-    {
-        gas->acctTypeFilters = g_list_copy( typeFilters );
-    }
+        gas->acctTypeFilters = g_list_copy (typeFilters);
 
     /* Save the commodity filter list */
     if (commodityFilters)
-    {
-        gas->acctCommodityFilters = g_list_copy(commodityFilters);
-    }
+        gas->acctCommodityFilters = g_list_copy (commodityFilters);
 
-    gas_populate_list( gas );
+    gas_populate_list (gas);
 }
 
 static void
@@ -417,14 +399,12 @@ gnc_account_sel_finalize (GObject *object)
     GNCAccountSel *gas;
 
     g_return_if_fail (object != NULL);
-    g_return_if_fail (GNC_IS_ACCOUNT_SEL (object));
+    g_return_if_fail (GNC_IS_ACCOUNT_SEL(object));
 
-    gas = GNC_ACCOUNT_SEL (object);
+    gas = GNC_ACCOUNT_SEL(object);
 
     if (gas->acctTypeFilters)
-    {
         g_list_free (gas->acctTypeFilters);
-    }
 
     G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -435,9 +415,9 @@ gnc_account_sel_dispose (GObject *object)
     GNCAccountSel *gas;
 
     g_return_if_fail (object != NULL);
-    g_return_if_fail (GNC_IS_ACCOUNT_SEL (object));
+    g_return_if_fail (GNC_IS_ACCOUNT_SEL(object));
 
-    gas = GNC_ACCOUNT_SEL (object);
+    gas = GNC_ACCOUNT_SEL(object);
 
     if (gas->eventHandlerId)
     {
@@ -449,74 +429,75 @@ gnc_account_sel_dispose (GObject *object)
 }
 
 void
-gnc_account_sel_set_new_account_ability( GNCAccountSel *gas,
-        gboolean state )
+gnc_account_sel_set_new_account_ability (GNCAccountSel *gas,
+                                         gboolean state)
 {
     g_return_if_fail (gas != NULL);
 
-    if ( state == (gas->newAccountButton != NULL) )
+    if (state == (gas->newAccountButton != NULL))
     {
         /* We're already in that state; don't do anything. */
         return;
     }
 
-    if ( gas->newAccountButton )
+    if (gas->newAccountButton)
     {
-        g_assert( state == TRUE );
+        g_assert (state == TRUE);
         /* destroy the existing button. */
-        gtk_container_remove( GTK_CONTAINER(gas),
-                              gas->newAccountButton );
-        gtk_widget_destroy( gas->newAccountButton );
+        gtk_container_remove (GTK_CONTAINER(gas), gas->newAccountButton);
+        gtk_widget_destroy (gas->newAccountButton);
         gas->newAccountButton = NULL;
         return;
     }
 
     /* create the button. */
-    gas->newAccountButton = gtk_button_new_with_label( _("New...") );
-    g_signal_connect( gas->newAccountButton,
+    gas->newAccountButton = gtk_button_new_with_label (_("New..."));
+    g_signal_connect (gas->newAccountButton,
                       "clicked",
-                      G_CALLBACK( gas_new_account_click ),
-                      gas );
-    gtk_box_pack_start( GTK_BOX(gas), gas->newAccountButton,
-                        FALSE, FALSE, 0 );
+                      G_CALLBACK(gas_new_account_click),
+                      gas);
+
+    gtk_box_pack_start (GTK_BOX(gas), gas->newAccountButton,
+                        FALSE, FALSE, 0);
 }
 
 void
-gnc_account_sel_set_new_account_modal( GNCAccountSel *gas,
-                                       gboolean state )
+gnc_account_sel_set_new_account_modal (GNCAccountSel *gas,
+                                       gboolean state)
 {
     g_return_if_fail (gas != NULL);
     gas->isModal = state;
 }
 
 static void
-gas_new_account_click( GtkButton *b, gpointer ud )
+gas_new_account_click (GtkButton *b, gpointer ud)
 {
     GNCAccountSel *gas = (GNCAccountSel*)ud;
     Account *account = NULL;
-    GtkWindow *parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gas)));
+    GtkWindow *parent = GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET(gas)));
     if (gas->isModal)
     {
         account = gnc_ui_new_accounts_from_name_window_with_types (parent, NULL,
-                                                                   gas->acctTypeFilters );
+                                                                   gas->acctTypeFilters);
         if (account)
             gnc_account_sel_set_account (gas, account, FALSE);
     }
     else
         gnc_ui_new_account_with_types (parent, gnc_get_current_book(),
-                                       gas->acctTypeFilters );
+                                       gas->acctTypeFilters);
 }
 
 gint
-gnc_account_sel_get_num_account( GNCAccountSel *gas )
+gnc_account_sel_get_num_account (GNCAccountSel *gas)
 {
     if (NULL == gas)
         return 0;
-    return gtk_tree_model_iter_n_children( GTK_TREE_MODEL(gas->store), NULL );
+
+    return gtk_tree_model_iter_n_children (GTK_TREE_MODEL(gas->store), NULL);
 }
 
 void
-gnc_account_sel_purge_account( GNCAccountSel *gas,
+gnc_account_sel_purge_account (GNCAccountSel *gas,
                                Account *target,
                                gboolean recursive)
 {
@@ -525,43 +506,40 @@ gnc_account_sel_purge_account( GNCAccountSel *gas,
     Account *acc;
     gboolean more;
 
-    if (!gtk_tree_model_get_iter_first(model, &iter))
+    if (!gtk_tree_model_get_iter_first (model, &iter))
         return;
 
     if (!recursive)
     {
         do
         {
-            gtk_tree_model_get(model, &iter, ACCT_COL_PTR, &acc, -1);
+            gtk_tree_model_get (model, &iter, ACCT_COL_PTR, &acc, -1);
             if (acc == target)
             {
-                gtk_list_store_remove(gas->store, &iter);
+                gtk_list_store_remove (gas->store, &iter);
                 break;
             }
         }
-        while (gtk_tree_model_iter_next(model, &iter));
+        while (gtk_tree_model_iter_next (model, &iter));
     }
     else
     {
         do
         {
-            gtk_tree_model_get(model, &iter, ACCT_COL_PTR, &acc, -1);
+            gtk_tree_model_get (model, &iter, ACCT_COL_PTR, &acc, -1);
             while (acc)
             {
                 if (acc == target)
                     break;
-                acc = gnc_account_get_parent(acc);
+                acc = gnc_account_get_parent (acc);
             }
 
             if (acc == target)
-                more = gtk_list_store_remove(gas->store, &iter);
+                more = gtk_list_store_remove (gas->store, &iter);
             else
-                more = gtk_tree_model_iter_next(model, &iter);
+                more = gtk_tree_model_iter_next (model, &iter);
         }
         while (more);
     }
-
-    gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), 0);
+    gtk_combo_box_set_active (GTK_COMBO_BOX(gas->combo), 0);
 }
-
-
diff --git a/gnucash/gnome-utils/gnc-account-sel.h b/gnucash/gnome-utils/gnc-account-sel.h
index 6deece10d..7ec5f116f 100644
--- a/gnucash/gnome-utils/gnc-account-sel.h
+++ b/gnucash/gnome-utils/gnc-account-sel.h
@@ -74,12 +74,13 @@ GtkWidget* gnc_account_sel_new (void);
  * list, then it doesn't change the state of the GAS.  If the account is
  * NULL, then the first list selection is made if set_default_acct is TRUE.
  **/
-void       gnc_account_sel_set_account( GNCAccountSel *gas, Account *acct, gboolean set_default_acct );
+void       gnc_account_sel_set_account (GNCAccountSel *gas, Account *acct,
+                                        gboolean set_default_acct);
 /**
  * Returns the currently-selected Account.  If, for some reason the selection
  * is in a bad state, NULL will be returned.
  **/
-Account*   gnc_account_sel_get_account( GNCAccountSel *gas );
+Account*   gnc_account_sel_get_account (GNCAccountSel *gas);
 
 /**
  * The GNCAccountSel can be setup to filter the accounts displayed.
@@ -87,25 +88,24 @@ Account*   gnc_account_sel_get_account( GNCAccountSel *gas );
  * @param commodityFilters A GList of gnc_commodity types which are allowed.
  * The list is copied, of course.
  **/
-void gnc_account_sel_set_acct_filters( GNCAccountSel *gas, GList *typeFilters, GList *commodityFilters );
+void gnc_account_sel_set_acct_filters (GNCAccountSel *gas, GList *typeFilters,
+                                       GList *commodityFilters);
 
 /**
  * Conditional inclusion of a new-account button to the right of the
  * combobox.
  * @param state TRUE if the new-account button is desired, FALSE otherwise.
  **/
-void gnc_account_sel_set_new_account_ability( GNCAccountSel *gas,
-        gboolean state );
+void gnc_account_sel_set_new_account_ability (GNCAccountSel *gas, gboolean state);
 
 /**
  * Conditional call of the new-account window in modal mode.
  * @param state TRUE if the new-account window should be modal, FALSE otherwise.
  **/
-void gnc_account_sel_set_new_account_modal( GNCAccountSel *gas,
-        gboolean state );
+void gnc_account_sel_set_new_account_modal (GNCAccountSel *gas, gboolean state);
 
-gint gnc_account_sel_get_num_account( GNCAccountSel *gas );
-void gnc_account_sel_purge_account( GNCAccountSel *gas, Account *acc, gboolean recursive);
-void gnc_account_sel_set_hexpand ( GNCAccountSel *gas, gboolean expand);
+gint gnc_account_sel_get_num_account (GNCAccountSel *gas);
+void gnc_account_sel_purge_account (GNCAccountSel *gas, Account *acc, gboolean recursive);
+void gnc_account_sel_set_hexpand (GNCAccountSel *gas, gboolean expand);
 
 #endif /* GNC_ACCOUNT_SEL_H */

commit faaa580de79dfaad90b563c430f4ec4504befb0d
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:37:59 2020 +0000

    GNCAccountSel with a New button
    
    If the GNCAccountSel widget is set to be modal, using the 'New' button
    returns the newly created account so use it for the selection.

diff --git a/gnucash/gnome-utils/gnc-account-sel.c b/gnucash/gnome-utils/gnc-account-sel.c
index 9d240f567..d34c30e21 100644
--- a/gnucash/gnome-utils/gnc-account-sel.c
+++ b/gnucash/gnome-utils/gnc-account-sel.c
@@ -493,10 +493,15 @@ static void
 gas_new_account_click( GtkButton *b, gpointer ud )
 {
     GNCAccountSel *gas = (GNCAccountSel*)ud;
+    Account *account = NULL;
     GtkWindow *parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gas)));
     if (gas->isModal)
-        gnc_ui_new_accounts_from_name_window_with_types (parent, NULL,
-                                                         gas->acctTypeFilters );
+    {
+        account = gnc_ui_new_accounts_from_name_window_with_types (parent, NULL,
+                                                                   gas->acctTypeFilters );
+        if (account)
+            gnc_account_sel_set_account (gas, account, FALSE);
+    }
     else
         gnc_ui_new_account_with_types (parent, gnc_get_current_book(),
                                        gas->acctTypeFilters );

commit 026856122c2317e9b430b913f6faa6ca31f2cbc0
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:36:55 2020 +0000

    Bug 355498 - When there is only one result from a 'Find', select it.

diff --git a/gnucash/gnome-search/dialog-search.c b/gnucash/gnome-search/dialog-search.c
index 5c434f9f4..96e9cdc38 100644
--- a/gnucash/gnome-search/dialog-search.c
+++ b/gnucash/gnome-search/dialog-search.c
@@ -367,6 +367,15 @@ gnc_search_dialog_display_results (GNCSearchWindow *sw)
     max_count = gnc_prefs_get_float(GNC_PREFS_GROUP_SEARCH_GENERAL, GNC_PREF_NEW_SEARCH_LIMIT);
     if (gnc_query_view_get_num_entries(GNC_QUERY_VIEW(sw->result_view)) < max_count)
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (sw->new_rb), TRUE);
+
+    /* If there is only one item then select it */
+    if (gnc_query_view_get_num_entries (GNC_QUERY_VIEW(sw->result_view)) == 1)
+    {
+        GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(sw->result_view));
+        GtkTreePath *path = gtk_tree_path_new_first ();
+        gtk_tree_selection_select_path (selection, path);
+        gtk_tree_path_free (path);
+    }
 }
 
 static void

commit ae39df07eb81614dd8316ba2c191c80fe41f5b85
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Nov 22 10:35:32 2020 +0000

    Bug 720564 - Search in General Ledger
    
    If you search from a General Ledger the search results will update the
    General Ledger and the only way to get back the contents is to close
    and reopen the General Ledger.
    
    This change makes it the same as any other register in that the search
    results are opened in a new search page.

diff --git a/gnucash/register/ledger-core/gnc-ledger-display.c b/gnucash/register/ledger-core/gnc-ledger-display.c
index fb36bf4ac..15281a8cd 100644
--- a/gnucash/register/ledger-core/gnc-ledger-display.c
+++ b/gnucash/register/ledger-core/gnc-ledger-display.c
@@ -184,6 +184,9 @@ find_by_query (gpointer find_data, gpointer user_data)
     Query* q = find_data;
     GNCLedgerDisplay* ld = user_data;
 
+    if (ld->reg->type != SEARCH_LEDGER)
+        return FALSE;
+
     if (!q || !ld)
         return FALSE;
 



Summary of changes:
 gnucash/gnome-search/dialog-search.c              |   9 +
 gnucash/gnome-utils/gnc-account-sel.c             | 297 ++++++++++------------
 gnucash/gnome-utils/gnc-account-sel.h             |  20 +-
 gnucash/gnome/assistant-loan.cpp                  |   2 +
 gnucash/gnome/dialog-fincalc.c                    |  53 ++--
 gnucash/register/ledger-core/gnc-ledger-display.c |   3 +
 6 files changed, 202 insertions(+), 182 deletions(-)



More information about the gnucash-changes mailing list