Skip to content

Commit

Permalink
Merge branch 'iter-to-stl' into stable #1745
Browse files Browse the repository at this point in the history
  • Loading branch information
christopherlam committed Aug 15, 2023
2 parents f6f305f + bea6b52 commit d8a0e29
Show file tree
Hide file tree
Showing 4 changed files with 192 additions and 105 deletions.
1 change: 1 addition & 0 deletions gnucash/gnome-utils/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ set(gnome_utils_noinst_HEADERS
gnc-autosave.h
gnc-gobject-utils.h
gnc-gtk-utils.h
gnc-tree-model-container.hpp
gnc-option-gtk-ui.hpp
search-param.h
)
Expand Down
145 changes: 145 additions & 0 deletions gnucash/gnome-utils/gnc-tree-model-container.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/********************************************************************\
* gnc-tree-model-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@gnu.org *
\********************************************************************/

#ifndef GNC_TREE_MODEL_CONTAINER_HPP
#define GNC_TREE_MODEL_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;
gtk_tree_model_get_iter_first(m_model, &iter);
m_iter = iter;
}

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_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
58 changes: 19 additions & 39 deletions gnucash/import-export/csv-imp/assistant-csv-price-import.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <glib/gi18n.h>
#include <stdlib.h>

#include "gnc-tree-model-container.hpp"
#include "gnc-ui.h"
#include "gnc-uri-utils.h"
#include "gnc-ui-util.h"
Expand Down Expand Up @@ -921,31 +922,25 @@ 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))
{

auto model = gtk_combo_box_get_model (settings_combo);
bool valid = gtk_tree_model_get_iter_first (model, &iter);
while (valid)
for (auto iter : tree_model_container)
{
// Walk through the list, reading each row
CsvPriceImpSettings *preset;
gtk_tree_model_get (model, &iter, SET_GROUP, &preset, -1);

if (preset && (preset->m_name == std::string(new_name)))
auto preset = iter.get<CsvPriceImpSettings*>(SET_GROUP);
if (preset && preset->m_name == 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);
}
}

Expand All @@ -957,24 +952,13 @@ CsvImpPriceAssist::preview_settings_save ()

// Update the settings store
preview_populate_settings_combo();
auto model = gtk_combo_box_get_model (settings_combo);

// 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);
}
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;
}
}
else
gnc_error_dialog (GTK_WINDOW(csv_imp_asst),
Expand Down Expand Up @@ -1516,7 +1500,6 @@ 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. */
Expand All @@ -1526,18 +1509,15 @@ CsvImpPriceAssist::preview_cbox_factory (GtkTreeModel* model, uint32_t colnum)
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(cbox),
renderer, "text", COL_TYPE_NAME);

auto valid = gtk_tree_model_get_iter_first (model, &iter);
while (valid)
GncTreeContainer<> tree_model_container{model};
for (auto iter : tree_model_container)
{
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]))
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());
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",
Expand Down

0 comments on commit d8a0e29

Please sign in to comment.