gnucash stable: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Wed Aug 23 06:09:35 EDT 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/bd2d3182 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/737efe4c (commit)
	 via  https://github.com/Gnucash/gnucash/commit/bd7e4cbf (commit)
	from  https://github.com/Gnucash/gnucash/commit/422a47fd (commit)



commit bd2d3182d1bc135658d43232dbf33ad093197f22
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Aug 23 17:52:59 2023 +0800

    Revert "[gnc-tree-container.hpp] define GncTreeContainer"

diff --git a/gnucash/gnome-utils/CMakeLists.txt b/gnucash/gnome-utils/CMakeLists.txt
index cc8486b9df..e02b68795e 100644
--- a/gnucash/gnome-utils/CMakeLists.txt
+++ b/gnucash/gnome-utils/CMakeLists.txt
@@ -113,7 +113,6 @@ set(gnome_utils_noinst_HEADERS
   gnc-autosave.h
   gnc-gobject-utils.h
   gnc-gtk-utils.h
-  gnc-tree-container.hpp
   gnc-option-gtk-ui.hpp
   search-param.h
 )
diff --git a/gnucash/gnome-utils/gnc-tree-container.hpp b/gnucash/gnome-utils/gnc-tree-container.hpp
deleted file mode 100644
index 1aa2f37ce5..0000000000
--- a/gnucash/gnome-utils/gnc-tree-container.hpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/********************************************************************\
- * gnc-tree-container.hpp
- *                                                                  *
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
-\********************************************************************/
-
-#ifndef GNC_TREE_CONTAINER_HPP
-#define GNC_TREE_CONTAINER_HPP
-
-#include <string>
-#include <optional>
-
-class GncTreeData
-{
-public:
-    GncTreeData (GtkTreeModel* model, GtkTreeIter iter) : m_model{model}, m_iter{iter} {};
-
-    template <typename T>
-    T get (int column)
-    {
-        gpointer rv;
-        gtk_tree_model_get(m_model, &m_iter, column, &rv, -1);
-        return static_cast<T>(rv);
-    }
-
-    GtkTreeIter& get_iter () { return m_iter; };
-
-    int get_int (int column)
-    {
-        int rv;
-        gtk_tree_model_get(m_model, &m_iter, column, &rv, -1);
-        return rv;
-    }
-
-    std::string get_string (int column)
-    {
-        auto str = get<char*>(column);
-        std::string rv{str};
-        g_free (str);
-        return rv;
-    }
-
-    bool operator==(const GncTreeData& other) const
-    {
-        return (m_model == other.m_model) &&
-            (m_iter.stamp == other.m_iter.stamp) &&
-            (m_iter.user_data == other.m_iter.user_data) &&
-            (m_iter.user_data2 == other.m_iter.user_data2) &&
-            (m_iter.user_data3 == other.m_iter.user_data3);
-    }
-
-private:
-    GtkTreeModel* m_model;
-    GtkTreeIter m_iter;
-};
-
-// Custom iterator class
-template <typename ModelType>
-class GncTreeIter
-{
-public:
-    GncTreeIter(GtkTreeModel* model, std::optional<GtkTreeIter> iter) : m_model(model), m_iter(iter) {}
-
-    GncTreeIter(GtkTreeModel* model) : m_model (model)
-    {
-        GtkTreeIter iter;
-        m_iter = gtk_tree_model_get_iter_first(m_model, &iter) ? std::make_optional(iter) : std::nullopt;
-    }
-
-    GncTreeIter& operator++()
-    {
-        if (!m_iter.has_value())
-            throw "no value, cannot increment";
-        if (!gtk_tree_model_iter_next(m_model, &m_iter.value()))
-            m_iter = std::nullopt;
-        return *this;
-    }
-
-    ModelType operator*() const
-    {
-        if (!m_iter.has_value())
-            throw "no value, cannot dereference";
-        return ModelType (m_model, *m_iter);
-    }
-
-    bool has_value() { return m_iter.has_value(); };
-
-    bool operator==(const GncTreeIter& other) const
-    {
-        if (m_model != other.m_model)
-            return false;
-        if (!m_iter.has_value() && !other.m_iter.has_value())
-            return true;
-        if (!m_iter.has_value() || !other.m_iter.has_value())
-            return false;
-        return (ModelType (m_model, *m_iter) == ModelType (m_model, *other.m_iter));
-    }
-
-    bool operator!=(const GncTreeIter& other) const { return !(*this == other); }
-
-private:
-    GtkTreeModel* m_model;
-    std::optional<GtkTreeIter> m_iter;
-};
-
-// Custom container class
-template <typename ModelType = GncTreeData>
-class GncTreeContainer
-{
-public:
-    using TreeModelIterator = GncTreeIter<ModelType>;
-
-    GncTreeContainer(GtkTreeModel* model) : m_model(model)
-    {
-        g_return_if_fail (GTK_IS_TREE_MODEL (m_model));
-        g_object_ref (m_model);
-    }
-
-    ~GncTreeContainer () { g_object_unref (m_model); }
-
-    TreeModelIterator begin() { return TreeModelIterator(m_model); };
-
-    TreeModelIterator end() { return TreeModelIterator(m_model, std::nullopt); };
-
-    bool empty() { return begin() == end(); };
-
-private:
-    GtkTreeModel* m_model;
-};
-
-#endif

commit 737efe4c49709d529abf3bf303272f7c1942c076
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Aug 23 17:53:12 2023 +0800

    Revert "[assistant-csv-trans-import.cpp] uses GtkTreeModelContainer"
    
    This reverts commit bea6b52d3f981f6d04a26f3a7a66249d82a0841c.

diff --git a/gnucash/import-export/csv-imp/assistant-csv-trans-import.cpp b/gnucash/import-export/csv-imp/assistant-csv-trans-import.cpp
index ffeeff8b9e..55823b93b1 100644
--- a/gnucash/import-export/csv-imp/assistant-csv-trans-import.cpp
+++ b/gnucash/import-export/csv-imp/assistant-csv-trans-import.cpp
@@ -56,7 +56,6 @@
 #include "gnc-csv-gnumeric-popup.h"
 #include "go-charmap-sel.h"
 
-#include "gnc-tree-container.hpp"
 #include "gnc-imp-settings-csv-tx.hpp"
 #include "gnc-import-tx.hpp"
 #include "gnc-tokenizer-fw.hpp"
@@ -894,25 +893,31 @@ void
 CsvImpTransAssist::preview_settings_save ()
 {
     auto new_name = tx_imp->settings_name();
-    GncTreeContainer<> tree_model_container{gtk_combo_box_get_model (settings_combo)};
 
     /* Check if the entry text matches an already existing preset */
     GtkTreeIter iter;
     if (!gtk_combo_box_get_active_iter (settings_combo, &iter))
     {
-        for (auto iter : tree_model_container)
+
+        auto model = gtk_combo_box_get_model (settings_combo);
+        bool valid = gtk_tree_model_get_iter_first (model, &iter);
+        while (valid)
         {
             // Walk through the list, reading each row
-            auto preset = iter.get<CsvTransImpSettings*>(SET_GROUP);
-            if (preset && preset->m_name == new_name)
+            CsvTransImpSettings *preset;
+            gtk_tree_model_get (model, &iter, SET_GROUP, &preset, -1);
+
+            if (preset && (preset->m_name == std::string(new_name)))
             {
-                auto response = gnc_ok_cancel_dialog (GTK_WINDOW (csv_imp_asst), GTK_RESPONSE_OK,
-                                                      "%s", _("Setting name already exists, overwrite?"));
+                auto response = gnc_ok_cancel_dialog (GTK_WINDOW (csv_imp_asst),
+                        GTK_RESPONSE_OK,
+                        "%s", _("Setting name already exists, overwrite?"));
                 if (response != GTK_RESPONSE_OK)
                     return;
 
                 break;
             }
+            valid = gtk_tree_model_iter_next (model, &iter);
         }
     }
 
@@ -924,14 +929,23 @@ CsvImpTransAssist::preview_settings_save ()
 
         // Update the settings store
         preview_populate_settings_combo();
+        auto model = gtk_combo_box_get_model (settings_combo);
 
-        for (auto iter : tree_model_container)
+        // Get the first entry in model
+        GtkTreeIter   iter;
+        bool valid = gtk_tree_model_get_iter_first (model, &iter);
+        while (valid)
         {
-            if (iter.get_string (SET_NAME) == new_name) // Set Active, the one Saved.
-            {
-                gtk_combo_box_set_active_iter (settings_combo, &iter.get_iter());
-                break;
-            }
+            // Walk through the list, reading each row
+            gchar *name = nullptr;
+            gtk_tree_model_get (model, &iter, SET_NAME, &name, -1);
+
+            if (g_strcmp0 (name, new_name.c_str()) == 0) // Set Active, the one Saved.
+                gtk_combo_box_set_active_iter (settings_combo, &iter);
+
+            g_free (name);
+
+            valid = gtk_tree_model_iter_next (model, &iter);
         }
     }
     else
@@ -1442,6 +1456,7 @@ CsvImpTransAssist::preview_row_fill_state_cells (GtkListStore *store, GtkTreeIte
 GtkWidget*
 CsvImpTransAssist::preview_cbox_factory (GtkTreeModel* model, uint32_t colnum)
 {
+    GtkTreeIter iter;
     auto cbox = gtk_combo_box_new_with_model(model);
 
     /* Set up a renderer for this combobox. */
@@ -1451,14 +1466,18 @@ CsvImpTransAssist::preview_cbox_factory (GtkTreeModel* model, uint32_t colnum)
     gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(cbox),
             renderer, "text", COL_TYPE_NAME);
 
-    for (auto iter : GncTreeContainer (model))
+    auto valid = gtk_tree_model_get_iter_first (model, &iter);
+    while (valid)
     {
-        if (iter.get_int(COL_TYPE_ID) == static_cast<int>( tx_imp->column_types()[colnum]))
-        {
-            gtk_combo_box_set_active_iter (GTK_COMBO_BOX(cbox), &iter.get_iter());
+        gint stored_col_type;
+        gtk_tree_model_get (model, &iter,
+                COL_TYPE_ID, &stored_col_type, -1);
+        if (stored_col_type == static_cast<int>( tx_imp->column_types()[colnum]))
             break;
-        }
+        valid = gtk_tree_model_iter_next(model, &iter);
     }
+    if (valid)
+        gtk_combo_box_set_active_iter (GTK_COMBO_BOX(cbox), &iter);
 
     g_object_set_data (G_OBJECT(cbox), "col-num", GUINT_TO_POINTER(colnum));
     g_signal_connect (G_OBJECT(cbox), "changed",
@@ -1760,34 +1779,54 @@ void CsvImpTransAssist::acct_match_set_accounts ()
 static void
 csv_tximp_acct_match_load_mappings (GtkTreeModel *mappings_store)
 {
-    for (auto iter : GncTreeContainer<>(mappings_store))
+    // Set iter to first entry of store
+    GtkTreeIter iter;
+    auto valid = gtk_tree_model_get_iter_first (mappings_store, &iter);
+
+    // Walk through the store trying to match to a map
+    while (valid)
     {
         // Walk through the list, reading each row
-        auto account = iter.get<Account*>(MAPPING_ACCOUNT);
-        auto map_string = iter.get_string(MAPPING_STRING);
+        Account *account = nullptr;
+        gchar   *map_string;
+        gtk_tree_model_get (GTK_TREE_MODEL(mappings_store), &iter, MAPPING_STRING, &map_string, MAPPING_ACCOUNT, &account, -1);
 
         // Look for an account matching the map_string
         // It may already be set in the tree model. If not we try to match the map_string with
         // - an entry in our saved account maps
         // - a full name of any of our existing accounts
         if (account ||
-            (account = gnc_account_imap_find_any (gnc_get_current_book(), IMAP_CAT_CSV, map_string.c_str())) ||
-            (account = gnc_account_lookup_by_full_name (gnc_get_current_root_account(), map_string.c_str())))
+            (account = gnc_account_imap_find_any (gnc_get_current_book(), IMAP_CAT_CSV, map_string)) ||
+            (account = gnc_account_lookup_by_full_name (gnc_get_current_root_account(), map_string)))
         {
             auto fullpath = gnc_account_get_full_name (account);
-            gtk_list_store_set (GTK_LIST_STORE(mappings_store), &iter.get_iter(), MAPPING_FULLPATH, fullpath, -1);
-            gtk_list_store_set (GTK_LIST_STORE(mappings_store), &iter.get_iter(), MAPPING_ACCOUNT, account, -1);
+            gtk_list_store_set (GTK_LIST_STORE(mappings_store), &iter, MAPPING_FULLPATH, fullpath, -1);
+            gtk_list_store_set (GTK_LIST_STORE(mappings_store), &iter, MAPPING_ACCOUNT, account, -1);
             g_free (fullpath);
         }
+
+        g_free (map_string);
+        valid = gtk_tree_model_iter_next (mappings_store, &iter);
     }
 }
 
 static bool
 csv_tximp_acct_match_check_all (GtkTreeModel *model)
 {
-    for (auto iter : GncTreeContainer<>(model))
-        if (!iter.get<Account*>(MAPPING_ACCOUNT))
+    // Set iter to first entry of store
+    GtkTreeIter iter;
+    auto valid = gtk_tree_model_get_iter_first (model, &iter);
+
+    // Walk through the store looking for nullptr accounts
+    while (valid)
+    {
+        Account *account;
+        gtk_tree_model_get (model, &iter, MAPPING_ACCOUNT, &account, -1);
+        if (!account)
             return false;
+
+        valid = gtk_tree_model_iter_next (model, &iter);
+    }
     return true;
 }
 

commit bd7e4cbf9fc0d8377df769661e2c77391564b526
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Aug 23 17:53:09 2023 +0800

    Revert "[assistant-csv-price-import.cpp] uses GtkTreeModelContainer"
    
    This reverts commit f10d7a7c8eb7f3417c587ce687b383f7aafd6757.

diff --git a/gnucash/import-export/csv-imp/assistant-csv-price-import.cpp b/gnucash/import-export/csv-imp/assistant-csv-price-import.cpp
index 55ccb79800..3e39920cc1 100644
--- a/gnucash/import-export/csv-imp/assistant-csv-price-import.cpp
+++ b/gnucash/import-export/csv-imp/assistant-csv-price-import.cpp
@@ -35,7 +35,6 @@
 #include <glib/gi18n.h>
 #include <stdlib.h>
 
-#include "gnc-tree-container.hpp"
 #include "gnc-ui.h"
 #include "gnc-uri-utils.h"
 #include "gnc-ui-util.h"
@@ -922,25 +921,31 @@ void
 CsvImpPriceAssist::preview_settings_save ()
 {
     auto new_name = price_imp->settings_name();
-    GncTreeContainer<> tree_model_container{gtk_combo_box_get_model (settings_combo)};
 
     /* Check if the entry text matches an already existing preset */
     GtkTreeIter iter;
     if (!gtk_combo_box_get_active_iter (settings_combo, &iter))
     {
-        for (auto iter : tree_model_container)
+
+        auto model = gtk_combo_box_get_model (settings_combo);
+        bool valid = gtk_tree_model_get_iter_first (model, &iter);
+        while (valid)
         {
             // Walk through the list, reading each row
-            auto preset = iter.get<CsvPriceImpSettings*>(SET_GROUP);
-            if (preset && preset->m_name == new_name)
+            CsvPriceImpSettings *preset;
+            gtk_tree_model_get (model, &iter, SET_GROUP, &preset, -1);
+
+            if (preset && (preset->m_name == std::string(new_name)))
             {
-                auto response = gnc_ok_cancel_dialog (GTK_WINDOW(csv_imp_asst), GTK_RESPONSE_OK,
-                                                      "%s", _("Setting name already exists, overwrite?"));
+                auto response = gnc_ok_cancel_dialog (GTK_WINDOW(csv_imp_asst),
+                        GTK_RESPONSE_OK,
+                        "%s", _("Setting name already exists, overwrite?"));
                 if (response != GTK_RESPONSE_OK)
                     return;
 
                 break;
             }
+            valid = gtk_tree_model_iter_next (model, &iter);
         }
     }
 
@@ -952,13 +957,24 @@ CsvImpPriceAssist::preview_settings_save ()
 
         // Update the settings store
         preview_populate_settings_combo();
+        auto model = gtk_combo_box_get_model (settings_combo);
 
-        for (auto iter : tree_model_container)
-            if (iter.get_string (SET_NAME) == new_name) // Set Active, the one Saved.
-            {
-                gtk_combo_box_set_active_iter (settings_combo, &iter.get_iter());
-                break;
-            }
+        // Get the first entry in model
+        GtkTreeIter   iter;
+        bool valid = gtk_tree_model_get_iter_first (model, &iter);
+        while (valid)
+        {
+            // Walk through the list, reading each row
+            gchar *name = nullptr;
+            gtk_tree_model_get (model, &iter, SET_NAME, &name, -1);
+
+            if (g_strcmp0 (name, new_name.c_str()) == 0) // Set Active, the one Saved.
+                gtk_combo_box_set_active_iter (settings_combo, &iter);
+
+            g_free (name);
+
+            valid = gtk_tree_model_iter_next (model, &iter);
+        }
     }
     else
         gnc_error_dialog (GTK_WINDOW(csv_imp_asst),
@@ -1500,6 +1516,7 @@ CsvImpPriceAssist::preview_row_fill_state_cells (GtkListStore *store, GtkTreeIte
 GtkWidget*
 CsvImpPriceAssist::preview_cbox_factory (GtkTreeModel* model, uint32_t colnum)
 {
+    GtkTreeIter iter;
     auto cbox = gtk_combo_box_new_with_model(model);
 
     /* Set up a renderer for this combobox. */
@@ -1509,15 +1526,18 @@ CsvImpPriceAssist::preview_cbox_factory (GtkTreeModel* model, uint32_t colnum)
     gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(cbox),
             renderer, "text", COL_TYPE_NAME);
 
-    GncTreeContainer<> tree_model_container{model};
-    for (auto iter : tree_model_container)
+    auto valid = gtk_tree_model_get_iter_first (model, &iter);
+    while (valid)
     {
-        if (iter.get_int(COL_TYPE_ID) == static_cast<int>( price_imp->column_types_price()[colnum]))
-        {
-            gtk_combo_box_set_active_iter (GTK_COMBO_BOX(cbox), &iter.get_iter());
+        gint stored_col_type;
+        gtk_tree_model_get (model, &iter,
+                COL_TYPE_ID, &stored_col_type, -1);
+        if (stored_col_type == static_cast<int>( price_imp->column_types_price()[colnum]))
             break;
-        }
+        valid = gtk_tree_model_iter_next(model, &iter);
     }
+    if (valid)
+        gtk_combo_box_set_active_iter (GTK_COMBO_BOX(cbox), &iter);
 
     g_object_set_data (G_OBJECT(cbox), "col-num", GUINT_TO_POINTER(colnum));
     g_signal_connect (G_OBJECT(cbox), "changed",



Summary of changes:
 gnucash/gnome-utils/CMakeLists.txt                 |   1 -
 gnucash/gnome-utils/gnc-tree-container.hpp         | 146 ---------------------
 .../csv-imp/assistant-csv-price-import.cpp         |  58 +++++---
 .../csv-imp/assistant-csv-trans-import.cpp         |  93 +++++++++----
 4 files changed, 105 insertions(+), 193 deletions(-)
 delete mode 100644 gnucash/gnome-utils/gnc-tree-container.hpp



More information about the gnucash-changes mailing list