gnucash master: Book-Currency Feature step 4

J. Alex Aycinena alex.aycinena at code.gnucash.org
Thu Aug 13 19:40:21 EDT 2015


Updated	 via  https://github.com/Gnucash/gnucash/commit/558cae3d (commit)
	from  https://github.com/Gnucash/gnucash/commit/fa6fbc55 (commit)



commit 558cae3d9ceb8a2e117790e78c849a83db4711e3
Author: Alex Aycinena <alex.aycinena at gmail.com>
Date:   Thu Aug 13 17:16:02 2015 -0700

    Book-Currency Feature step 4
    
    Set feature flag if book-currency option selected and initiate registered
    callbacks when currency accounting book option changes to book-currency so that registers/reports can update themselves.
    
    The changes made are:
    
        app-utils/gnc-ui-util.c & h - define gnc_book_option_book_currency_selected_cb
        core-utils/gnc-features.c & h - define GNC_FEATURE_BOOK_CURRENCY
        engine/engine-helpers.c & h - define gnc_book_option_book_currency_selected
            to call registered callbacks and set feature
        gnome-utils/gnc-main-window.c & h - add checking of book-currency option to
            gnc_book_options_dialog_apply_cb function; refactor common code with
            assistant-hiearchy.c by creating gnc_book_options_dialog_apply_helper
        gnome/assistant-hierarchy.c - use gnc_book_options_dialog_apply_helper

diff --git a/src/app-utils/gnc-ui-util.c b/src/app-utils/gnc-ui-util.c
index 72d8c51..ebe846d 100644
--- a/src/app-utils/gnc-ui-util.c
+++ b/src/app-utils/gnc-ui-util.c
@@ -266,6 +266,26 @@ gnc_book_option_num_field_source_change_cb (gboolean num_action)
     gnc_gui_refresh_all ();
 }
 
+/** Calls gnc_book_option_book_currency_selected to initiate registered
+  * callbacks when currency accounting book option changes to book-currency so
+  * that registers/reports can update themselves; sets feature flag */
+void
+gnc_book_option_book_currency_selected_cb (gboolean use_book_currency)
+{
+    gnc_suspend_gui_refresh ();
+    if (use_book_currency)
+    {
+    /* Set a feature flag in the book for use of book currency. This will
+     * prevent older GnuCash versions that don't support this feature from
+     * opening this file. */
+        gnc_features_set_used (gnc_get_current_book(),
+                                GNC_FEATURE_BOOK_CURRENCY);
+    }
+    gnc_book_option_book_currency_selected (use_book_currency);
+    gnc_resume_gui_refresh ();
+    gnc_gui_refresh_all ();
+}
+
 /** Returns TRUE if both book-currency and default gain/loss policy KVPs exist
   * and are valid and trading accounts are not used. */
 gboolean
diff --git a/src/app-utils/gnc-ui-util.h b/src/app-utils/gnc-ui-util.h
index 13701ae..79c02db 100644
--- a/src/app-utils/gnc-ui-util.h
+++ b/src/app-utils/gnc-ui-util.h
@@ -81,6 +81,11 @@ const gchar * gnc_get_current_book_tax_type (void);
   * registers/reports can update themselves; sets feature flag */
 void gnc_book_option_num_field_source_change_cb (gboolean num_action);
 
+/** Calls gnc_book_option_book_currency_selected to initiate registered
+  * callbacks when currency accounting book option changes to book-currency so
+  * that registers/reports can update themselves; sets feature flag */
+void gnc_book_option_book_currency_selected_cb (gboolean use_book_currency);
+
 /** Returns TRUE if both book-currency and default gain/loss policy KVPs exist
   * and are valid and trading accounts are not used */
 gboolean gnc_book_use_book_currency (QofBook *book);
diff --git a/src/core-utils/gnc-features.c b/src/core-utils/gnc-features.c
index 8e73333..cfb9314 100644
--- a/src/core-utils/gnc-features.c
+++ b/src/core-utils/gnc-features.c
@@ -44,6 +44,7 @@ static gncFeature known_features[] =
     { GNC_FEATURE_CREDIT_NOTES, "Customer and vendor credit notes (requires at least GnuCash 2.5.0)" },
     { GNC_FEATURE_NUM_FIELD_SOURCE, "User specifies source of 'num' field'; either transaction number or split action (requires at least GnuCash 2.5.0)" },
     { GNC_FEATURE_KVP_EXTRA_DATA, "Extra data for addresses, jobs or invoice entries (requires at least GnuCash 2.6.4)" },
+    { GNC_FEATURE_BOOK_CURRENCY, "User specifies a 'book-currency'; costs of other currencies/commodities tracked in terms of book-currency (requires at least GnuCash 2.7.0)" },
     { NULL },
 };
 
diff --git a/src/core-utils/gnc-features.h b/src/core-utils/gnc-features.h
index 7b64ca6..a4ada74 100644
--- a/src/core-utils/gnc-features.h
+++ b/src/core-utils/gnc-features.h
@@ -44,6 +44,7 @@
 #define GNC_FEATURE_CREDIT_NOTES "Credit Notes"
 #define GNC_FEATURE_NUM_FIELD_SOURCE "Number Field Source"
 #define GNC_FEATURE_KVP_EXTRA_DATA "Extra data in addresses, jobs or invoice entries"
+#define GNC_FEATURE_BOOK_CURRENCY "Use a Book-Currency"
 
 /** @} */
 
diff --git a/src/engine/engine-helpers.c b/src/engine/engine-helpers.c
index 34eb45f..9484cc0 100644
--- a/src/engine/engine-helpers.c
+++ b/src/engine/engine-helpers.c
@@ -221,6 +221,22 @@ gnc_book_option_num_field_source_change (gboolean num_action)
     g_hook_list_invoke(bo_final_hook_list, TRUE);
 }
 
+/** Calls registered callbacks when book_currency book option changes so that
+  * registers/reports can update themselves */
+void
+gnc_book_option_book_currency_selected (gboolean use_book_currency)
+{
+    GHookList *hook_list;
+    const gchar *key = OPTION_NAME_BOOK_CURRENCY;
+
+    g_once(&bo_init_once, bo_init, NULL);
+
+    hook_list = g_hash_table_lookup(bo_callback_hash, key);
+    if (hook_list != NULL)
+        g_hook_list_marshal(hook_list, TRUE, bo_call_hook, &use_book_currency);
+    g_hook_list_invoke(bo_final_hook_list, TRUE);
+}
+
 void
 gnc_book_option_register_cb (gchar *key, GncBOCb func, gpointer user_data)
 {
diff --git a/src/engine/engine-helpers.h b/src/engine/engine-helpers.h
index 564cbfe..757b5b4 100644
--- a/src/engine/engine-helpers.h
+++ b/src/engine/engine-helpers.h
@@ -77,6 +77,11 @@ void gnc_set_num_action (Transaction *trans, Split *split,
 void
 gnc_book_option_num_field_source_change (gboolean num_action);
 
+/** Calls registered callbacks when book_currency book option changes so that
+  * registers/reports can update themselves */
+void
+gnc_book_option_book_currency_selected (gboolean use_book_currency);
+
 /** Registers callbacks to be called when the book option changes for the
   * specified book option key */
 void
diff --git a/src/gnome-utils/gnc-main-window.c b/src/gnome-utils/gnc-main-window.c
index f614325..d745e23 100644
--- a/src/gnome-utils/gnc-main-window.c
+++ b/src/gnome-utils/gnc-main-window.c
@@ -3936,15 +3936,16 @@ gnc_main_window_cmd_page_setup (GtkAction *action,
     gnc_ui_page_setup(gtk_window);
 }
 
-static void
-gnc_book_options_dialog_apply_cb(GNCOptionWin * optionwin,
-                                 gpointer user_data)
+void
+gnc_book_options_dialog_apply_helper(GNCOptionDB * options)
 {
-    GNCOptionDB * options = user_data;
+    QofBook *book = gnc_get_current_book ();
     gboolean use_split_action_for_num_before =
-        qof_book_use_split_action_for_num_field (gnc_get_current_book ());
+        qof_book_use_split_action_for_num_field (book);
+    gboolean use_book_currency_before =
+        gnc_book_use_book_currency (book);
     gboolean use_split_action_for_num_after;
-    QofBook *book = gnc_get_current_book ();
+    gboolean use_book_currency_after;
 
     if (!options) return;
 
@@ -3952,13 +3953,26 @@ gnc_book_options_dialog_apply_cb(GNCOptionWin * optionwin,
     qof_book_begin_edit (book);
     qof_book_save_options (book, gnc_option_db_save, options, TRUE);
     use_split_action_for_num_after =
-        qof_book_use_split_action_for_num_field (gnc_get_current_book ());
+        qof_book_use_split_action_for_num_field (book);
+    use_book_currency_after = gnc_book_use_book_currency (book);
     if (use_split_action_for_num_before != use_split_action_for_num_after)
-        gnc_book_option_num_field_source_change_cb (use_split_action_for_num_after);
+        gnc_book_option_num_field_source_change_cb (
+                                                use_split_action_for_num_after);
+    if (use_book_currency_before != use_book_currency_after)
+        gnc_book_option_book_currency_selected_cb (use_book_currency_after);
     qof_book_commit_edit (book);
 }
 
 static void
+gnc_book_options_dialog_apply_cb(GNCOptionWin * optionwin,
+                                 gpointer user_data)
+{
+    GNCOptionDB * options = user_data;
+    if (!options) return;
+    gnc_book_options_dialog_apply_helper (options);
+}
+
+static void
 gnc_book_options_dialog_close_cb(GNCOptionWin * optionwin,
                                  gpointer user_data)
 {
diff --git a/src/gnome-utils/gnc-main-window.h b/src/gnome-utils/gnc-main-window.h
index 9c1cb4a..044058b 100644
--- a/src/gnome-utils/gnc-main-window.h
+++ b/src/gnome-utils/gnc-main-window.h
@@ -422,6 +422,18 @@ void gnc_main_window_show_all_windows(void);
  **/
 GtkWidget *gnc_book_options_dialog_cb (gboolean modal, gchar *title);
 
+/**
+ * Processes selected options in the Book Options dialog: checks book_currency
+ * and use_split_action_for_num to see if features kvp shuold be set. To be used
+ * where ever a new book situation requires book option selection (e.g., not
+ * just in Book Options dialog opened from main window but also in new-file
+ * assistant).
+ *
+ *  @param GNCOptionDB * options.
+ *
+ **/
+void gnc_book_options_dialog_apply_helper(GNCOptionDB * options);
+
 #endif /* __GNC_MAIN_WINDOW_H */
 
 /** @} */
diff --git a/src/gnome/assistant-hierarchy.c b/src/gnome/assistant-hierarchy.c
index cacbf21..252b213 100644
--- a/src/gnome/assistant-hierarchy.c
+++ b/src/gnome/assistant-hierarchy.c
@@ -1009,26 +1009,6 @@ on_cancel (GtkAssistant      *gtkassistant,
 }
 
 static void
-finish_book_options_helper(GNCOptionWin * optionwin,
-                          gpointer user_data)
-{
-    GNCOptionDB * options = user_data;
-    QofBook *book = gnc_get_current_book ();
-    gboolean use_split_action_for_num_before =
-        qof_book_use_split_action_for_num_field (book);
-    gboolean use_split_action_for_num_after;
-
-    if (!options) return;
-
-    gnc_option_db_commit (options);
-    qof_book_save_options (book, gnc_option_db_save, options, TRUE);
-    use_split_action_for_num_after =
-        qof_book_use_split_action_for_num_field (book);
-    if (use_split_action_for_num_before != use_split_action_for_num_after)
-        gnc_book_option_num_field_source_change_cb (use_split_action_for_num_after);
-}
-
-static void
 starting_balance_helper (Account *account, hierarchy_data *data)
 {
     gnc_numeric balance;
@@ -1062,7 +1042,7 @@ on_finish (GtkAssistant  *gtkassistant,
 
     /* Set book options based on the user's choices */
     if (data->new_book)
-        finish_book_options_helper(data->optionwin, data->options);
+        gnc_book_options_dialog_apply_helper(data->options);
 
     // delete before we suspend GUI events, and then muck with the model,
     // because the model doesn't seem to handle this correctly.



Summary of changes:
 src/app-utils/gnc-ui-util.c       | 20 ++++++++++++++++++++
 src/app-utils/gnc-ui-util.h       |  5 +++++
 src/core-utils/gnc-features.c     |  1 +
 src/core-utils/gnc-features.h     |  1 +
 src/engine/engine-helpers.c       | 16 ++++++++++++++++
 src/engine/engine-helpers.h       |  5 +++++
 src/gnome-utils/gnc-main-window.c | 30 ++++++++++++++++++++++--------
 src/gnome-utils/gnc-main-window.h | 12 ++++++++++++
 src/gnome/assistant-hierarchy.c   | 22 +---------------------
 9 files changed, 83 insertions(+), 29 deletions(-)



More information about the gnucash-changes mailing list