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