[patch 05/15] [account-types.diff] Improvements for
GncTreeModelAccountTypes
c.shoemaker at cox.net
c.shoemaker at cox.net
Mon Oct 10 10:34:27 EDT 2005
* src/gnome-utils/gnc-tree-model-account-types.[ch]:
- add an api for accessing a program-wide static account-type tree
model
- add convenience functions for mapping between the selection
state of a treeview using the static account-type tree model and a
account-type selection bitfield.
- lots of line wrap fixes
src/gnome-utils/gnc-tree-model-account-types.c | 507 +++++++++++++++----------
src/gnome-utils/gnc-tree-model-account-types.h | 56 ++
2 files changed, 361 insertions(+), 202 deletions(-)
Index: gnucash/src/gnome-utils/gnc-tree-model-account-types.c
===================================================================
--- gnucash.orig/src/gnome-utils/gnc-tree-model-account-types.c
+++ gnucash/src/gnome-utils/gnc-tree-model-account-types.c
@@ -3,6 +3,7 @@
* to display account types in a GtkTreeView.
*
* Copyright (C) 2003 Jan Arne Petersen
+ * Copyright (C) 2005, Chris Shoemaker <c.shoemaker at cox.net>
* Author: Jan Arne Petersen <jpetersen at uni-bonn.de>
*
* This program is free software; you can redistribute it and/or
@@ -24,37 +25,70 @@
*/
#include "config.h"
-
+#include "gnc-trace.h"
#include "gnc-tree-model-account-types.h"
#include "Account.h"
-static void gnc_tree_model_account_types_class_init (GncTreeModelAccountTypesClass * klass);
-static void gnc_tree_model_account_types_init (GncTreeModelAccountTypes * model);
-static void gnc_tree_model_account_types_finalize (GObject * object);
-
-static void gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface);
-static guint gnc_tree_model_account_types_get_flags (GtkTreeModel * tree_model);
-static int gnc_tree_model_account_types_get_n_columns (GtkTreeModel * tree_model);
-static GType gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model, int index);
-static gboolean gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreePath * path);
-static GtkTreePath *gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model, GtkTreeIter * iter);
-static void gnc_tree_model_account_types_get_value (GtkTreeModel * tree_model,
- GtkTreeIter * iter, int column, GValue * value);
-static gboolean gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model, GtkTreeIter * iter);
-static gboolean gnc_tree_model_account_types_iter_children (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreeIter * parent);
-static gboolean gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model, GtkTreeIter * iter);
-static int gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model, GtkTreeIter * iter);
-static gboolean gnc_tree_model_account_types_iter_nth_child (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreeIter * parent, int n);
-static gboolean gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreeIter * child);
+static QofLogModule log_module = GNC_MOD_GUI;
+
+/* Functions for the type system */
+static void
+gnc_tree_model_account_types_class_init (GncTreeModelAccountTypesClass *klass);
+static void
+gnc_tree_model_account_types_init (GncTreeModelAccountTypes * model);
+static void
+gnc_tree_model_account_types_finalize (GObject * object);
+
+
+/* Functions implementing GtkTreeModel */
+static void
+gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface);
+
+/*
+static guint
+gnc_tree_model_account_types_get_flags (GtkTreeModel * tree_model);
+static int
+gnc_tree_model_account_types_get_n_columns (GtkTreeModel * tree_model);
+static GType
+gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model,
+ int index);
+static gboolean
+gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model,
+ GtkTreeIter * iter, GtkTreePath * path);
+static GtkTreePath *
+gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model,
+ GtkTreeIter * iter);
+static void
+gnc_tree_model_account_types_get_value (GtkTreeModel * tree_model,
+ GtkTreeIter * iter, int column,
+ GValue * value);
+static gboolean
+gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model,
+ GtkTreeIter * iter);
+static gboolean
+gnc_tree_model_account_types_iter_children (GtkTreeModel * tree_model,
+ GtkTreeIter * iter,
+ GtkTreeIter * parent);
+static gboolean
+gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model,
+ GtkTreeIter * iter);
+static int
+gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model,
+ GtkTreeIter * iter);
+static gboolean
+gnc_tree_model_account_types_iter_nth_child (GtkTreeModel * tree_model,
+ GtkTreeIter * iter,
+ GtkTreeIter * parent, int n);
+static gboolean
+gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model,
+ GtkTreeIter * iter,
+ GtkTreeIter * child);
+*/
struct GncTreeModelAccountTypesPrivate
{
- guint32 selected;
+ guint32 selected;
};
static GObjectClass *parent_class = NULL;
@@ -62,87 +96,98 @@ static GObjectClass *parent_class = NULL
GType
gnc_tree_model_account_types_get_type (void)
{
- static GType gnc_tree_model_account_types_type = 0;
+ static GType gnc_tree_model_account_types_type = 0;
- if (gnc_tree_model_account_types_type == 0) {
- static const GTypeInfo our_info = {
- sizeof (GncTreeModelAccountTypesClass),
- NULL,
- NULL,
- (GClassInitFunc) gnc_tree_model_account_types_class_init,
- NULL,
- NULL,
- sizeof (GncTreeModelAccountTypes),
- 0,
- (GInstanceInitFunc) gnc_tree_model_account_types_init
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) gnc_tree_model_account_types_tree_model_init,
- NULL,
- NULL
- };
-
- gnc_tree_model_account_types_type = g_type_register_static (G_TYPE_OBJECT,
- "GncTreeModelAccountTypes",
- &our_info, 0);
-
- g_type_add_interface_static (gnc_tree_model_account_types_type,
- GTK_TYPE_TREE_MODEL, &tree_model_info);
- }
+ if (gnc_tree_model_account_types_type == 0) {
+ static const GTypeInfo our_info = {
+ sizeof (GncTreeModelAccountTypesClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gnc_tree_model_account_types_class_init,
+ NULL,
+ NULL,
+ sizeof (GncTreeModelAccountTypes),
+ 0,
+ (GInstanceInitFunc) gnc_tree_model_account_types_init
+ };
+
+ static const GInterfaceInfo tree_model_info = {
+ (GInterfaceInitFunc) gnc_tree_model_account_types_tree_model_init,
+ NULL,
+ NULL
+ };
+
+ gnc_tree_model_account_types_type =
+ g_type_register_static (G_TYPE_OBJECT,
+ "GncTreeModelAccountTypes",
+ &our_info, 0);
+
+ g_type_add_interface_static (gnc_tree_model_account_types_type,
+ GTK_TYPE_TREE_MODEL, &tree_model_info);
+ }
- return gnc_tree_model_account_types_type;
+ return gnc_tree_model_account_types_type;
}
static void
gnc_tree_model_account_types_class_init (GncTreeModelAccountTypesClass * klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
- parent_class = g_type_class_peek_parent (klass);
+ parent_class = g_type_class_peek_parent (klass);
- object_class->finalize = gnc_tree_model_account_types_finalize;
+ object_class->finalize = gnc_tree_model_account_types_finalize;
}
static void
gnc_tree_model_account_types_init (GncTreeModelAccountTypes * model)
{
- while (model->stamp == 0) {
- model->stamp = g_random_int ();
- }
+ while (model->stamp == 0) {
+ model->stamp = g_random_int ();
+ }
- model->priv = g_new0 (GncTreeModelAccountTypesPrivate, 1);
+ model->priv = g_new0 (GncTreeModelAccountTypesPrivate, 1);
}
static void
gnc_tree_model_account_types_finalize (GObject * object)
{
- GncTreeModelAccountTypes *model;
+ GncTreeModelAccountTypes *model;
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (object));
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (object));
- model = GNC_TREE_MODEL_ACCOUNT_TYPES (object);
+ model = GNC_TREE_MODEL_ACCOUNT_TYPES (object);
- g_return_if_fail (model->priv != NULL);
+ g_return_if_fail (model->priv != NULL);
- g_free (model->priv);
+ g_free (model->priv);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
GtkTreeModel *
gnc_tree_model_account_types_new (guint32 selected)
{
- GncTreeModelAccountTypes *model;
+ GncTreeModelAccountTypes *model;
- model = g_object_new (GNC_TYPE_TREE_MODEL_ACCOUNT_TYPES, NULL);
+ model = g_object_new (GNC_TYPE_TREE_MODEL_ACCOUNT_TYPES, NULL);
+ model->priv->selected = selected;
- model->priv->selected = selected;
+ return GTK_TREE_MODEL (model);
+}
+
+static GtkTreeModel *account_types_tree_model = NULL;
- return GTK_TREE_MODEL (model);
+GtkTreeModel *
+gnc_tree_model_account_types_master(void)
+{
+ if (!account_types_tree_model)
+ account_types_tree_model = gnc_tree_model_account_types_new(0);
+ return account_types_tree_model;
}
+
guint32
gnc_tree_model_account_types_get_selected (GncTreeModelAccountTypes * model)
{
@@ -162,209 +207,279 @@ gnc_tree_model_account_types_set_selecte
model->priv->selected = selected;
}
-static void
-gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface)
+guint32
+gnc_tree_model_account_types_get_selection (GtkTreeView *view)
{
- iface->get_flags = gnc_tree_model_account_types_get_flags;
- iface->get_n_columns = gnc_tree_model_account_types_get_n_columns;
- iface->get_column_type = gnc_tree_model_account_types_get_column_type;
- iface->get_iter = gnc_tree_model_account_types_get_iter;
- iface->get_path = gnc_tree_model_account_types_get_path;
- iface->get_value = gnc_tree_model_account_types_get_value;
- iface->iter_next = gnc_tree_model_account_types_iter_next;
- iface->iter_children = gnc_tree_model_account_types_iter_children;
- iface->iter_has_child = gnc_tree_model_account_types_iter_has_child;
- iface->iter_n_children = gnc_tree_model_account_types_iter_n_children;
- iface->iter_nth_child = gnc_tree_model_account_types_iter_nth_child;
- iface->iter_parent = gnc_tree_model_account_types_iter_parent;
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GList *list, *iter;
+ GtkTreeSelection *sel;
+ guint32 bits = 0;
+
+ g_return_val_if_fail(GTK_IS_TREE_VIEW(view), 0);
+ sel = gtk_tree_view_get_selection(view);
+ g_return_val_if_fail (sel, 0);
+
+ list = gtk_tree_selection_get_selected_rows(sel, &model);
+ if (model != account_types_tree_model)
+ PERR("TreeSelection's TreeModel is not the account-types Model");
+ else {
+ for (iter = list; iter; iter = iter->next) {
+ path = (GtkTreePath *)iter->data;
+ if (gtk_tree_path_get_depth(path) != 1) {
+ PERR("Account-types TreePath depth != 1 ?!?");
+ continue;
+ }
+ bits |= (1 << gtk_tree_path_get_indices(path)[0]);
+ }
+ }
+
+ g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
+ g_list_free (list);
+
+ return bits;
+}
+
+void
+gnc_tree_model_account_types_set_selection (GtkTreeView *view,
+ guint32 selected)
+{
+ GtkTreePath *path;
+ gint *path_idx;
+ guint i;
+ GtkTreeSelection *sel;
+
+
+ g_return_if_fail(GTK_IS_TREE_VIEW(view));
+ sel = gtk_tree_view_get_selection(view);
+ g_return_if_fail (sel);
+ gtk_tree_selection_unselect_all(sel);
+ path = gtk_tree_path_new_first();
+ path_idx = gtk_tree_path_get_indices(path);
+
+ for (i = 0; i < NUM_ACCOUNT_TYPES; i++) {
+ if (selected & (1 << i)) {
+ path_idx[0] = i;
+ gtk_tree_selection_select_path(sel, path);
+ }
+ }
+ gtk_tree_path_free(path);
}
+
+/* Static functions implementing GtkTreeModel */
+
static guint
gnc_tree_model_account_types_get_flags (GtkTreeModel * tree_model)
{
- return 0;
+ return 0;
}
static int
gnc_tree_model_account_types_get_n_columns (GtkTreeModel * tree_model)
{
- return GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS;
+ return GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS;
}
static GType
-gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model, int index)
+gnc_tree_model_account_types_get_column_type (GtkTreeModel * tree_model,
+ int index)
{
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), G_TYPE_INVALID);
- g_return_val_if_fail ((index < GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS)
- && (index >= 0), G_TYPE_INVALID);
-
- switch (index) {
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
- return G_TYPE_UINT;
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
- return G_TYPE_STRING;
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
- return G_TYPE_BOOLEAN;
- default:
- g_assert_not_reached ();
- return G_TYPE_INVALID;
- }
+ g_return_val_if_fail(GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model),
+ G_TYPE_INVALID);
+ g_return_val_if_fail((index < GNC_TREE_MODEL_ACCOUNT_TYPES_NUM_COLUMNS)
+ && (index >= 0), G_TYPE_INVALID);
+
+ switch (index) {
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
+ return G_TYPE_UINT;
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
+ return G_TYPE_STRING;
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
+ return G_TYPE_BOOLEAN;
+ default:
+ g_assert_not_reached ();
+ return G_TYPE_INVALID;
+ }
}
static gboolean
-gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model, GtkTreeIter * iter, GtkTreePath * path)
+gnc_tree_model_account_types_get_iter (GtkTreeModel * tree_model,
+ GtkTreeIter * iter, GtkTreePath * path)
{
- GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
- gint i;
-
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
- g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+ GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
+ gint i;
- i = gtk_tree_path_get_indices (path)[0];
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
+ g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
- if (i > NO_TYPE && i < NUM_ACCOUNT_TYPES) {
- iter->stamp = 0;
+ i = gtk_tree_path_get_indices (path)[0];
- return FALSE;
- }
+ if (i > NO_TYPE && i < NUM_ACCOUNT_TYPES) {
+ iter->stamp = model->stamp;
+ iter->user_data = GINT_TO_POINTER (i);
+ return TRUE;
+ }
- iter->stamp = model->stamp;
- iter->user_data = GINT_TO_POINTER (i);
-
- return TRUE;
+ iter->stamp = 0;
+ return FALSE;
}
static GtkTreePath *
-gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model, GtkTreeIter * iter)
+gnc_tree_model_account_types_get_path (GtkTreeModel * tree_model,
+ GtkTreeIter * iter)
{
- GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
- GtkTreePath *path;
+ GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
+ GtkTreePath *path;
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), NULL);
- g_return_val_if_fail (iter != NULL, NULL);
- g_return_val_if_fail (iter->stamp == model->stamp, NULL);
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), NULL);
+ g_return_val_if_fail (iter != NULL, NULL);
+ g_return_val_if_fail (iter->stamp == model->stamp, NULL);
- path = gtk_tree_path_new ();
+ path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, GPOINTER_TO_INT (iter->user_data));
+ gtk_tree_path_append_index (path, GPOINTER_TO_INT (iter->user_data));
- return path;
+ return path;
}
static void
gnc_tree_model_account_types_get_value (GtkTreeModel * tree_model,
- GtkTreeIter * iter, int column, GValue * value)
+ GtkTreeIter * iter, int column,
+ GValue * value)
{
- GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
-
- g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model));
- g_return_if_fail (model->priv != NULL);
- g_return_if_fail (iter != NULL);
- g_return_if_fail (iter->stamp == model->stamp);
-
- switch (column) {
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
- g_value_init (value, G_TYPE_INT);
-
- g_value_set_int (value, GPOINTER_TO_INT (iter->user_data));
- break;
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
- g_value_init (value, G_TYPE_STRING);
+ GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
- g_value_set_string (value, xaccAccountGetTypeStr (GPOINTER_TO_INT (iter->user_data)));
- break;
- case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
- g_value_init (value, G_TYPE_BOOLEAN);
-
- g_value_set_boolean (value, model->priv->selected & (1 << GPOINTER_TO_INT (iter->user_data)));
- break;
- default:
- g_assert_not_reached ();
- }
+ g_return_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model));
+ g_return_if_fail (model->priv != NULL);
+ g_return_if_fail (iter != NULL);
+ g_return_if_fail (iter->stamp == model->stamp);
+
+ switch (column) {
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_TYPE:
+ g_value_init (value, G_TYPE_INT);
+ g_value_set_int (value, GPOINTER_TO_INT (iter->user_data));
+ break;
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_NAME:
+ g_value_init (value, G_TYPE_STRING);
+ g_value_set_string (value, xaccAccountGetTypeStr (
+ GPOINTER_TO_INT (iter->user_data)));
+ break;
+ case GNC_TREE_MODEL_ACCOUNT_TYPES_COL_SELECTED:
+ g_value_init (value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (value, model->priv->selected &
+ (1 << GPOINTER_TO_INT (iter->user_data)));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
}
static gboolean
-gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model, GtkTreeIter * iter)
+gnc_tree_model_account_types_iter_next (GtkTreeModel * tree_model,
+ GtkTreeIter * iter)
{
- GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
-
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
- g_return_val_if_fail (iter != NULL, FALSE);
- g_return_val_if_fail (iter->stamp == model->stamp, FALSE);
+ GncTreeModelAccountTypes *model = GNC_TREE_MODEL_ACCOUNT_TYPES(tree_model);
- if (GPOINTER_TO_INT (iter->user_data) < NUM_ACCOUNT_TYPES - 1) {
- iter->user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter->user_data) + 1);
-
- return TRUE;
- }
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (model), FALSE);
+ g_return_val_if_fail (iter != NULL, FALSE);
+ g_return_val_if_fail (iter->stamp == model->stamp, FALSE);
+
+ if (GPOINTER_TO_INT (iter->user_data) < NUM_ACCOUNT_TYPES - 1) {
+ iter->user_data = GINT_TO_POINTER(
+ GPOINTER_TO_INT(iter->user_data) + 1);
+ return TRUE;
+ }
- iter->stamp = 0;
-
- return FALSE;
+ iter->stamp = 0;
+ return FALSE;
}
static gboolean
gnc_tree_model_account_types_iter_children (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreeIter * parent)
+ GtkTreeIter * iter,
+ GtkTreeIter * parent)
{
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), FALSE);
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES(tree_model), FALSE);
- if (parent != NULL)
- return FALSE;
+ if (parent != NULL)
+ return FALSE;
- iter->stamp = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp;
- iter->user_data = GINT_TO_POINTER (0);
+ iter->stamp = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp;
+ iter->user_data = GINT_TO_POINTER (0);
- return TRUE;
+ return TRUE;
}
static gboolean
-gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model, GtkTreeIter * iter)
+gnc_tree_model_account_types_iter_has_child (GtkTreeModel * tree_model,
+ GtkTreeIter * iter)
{
- return FALSE;
+ return FALSE;
}
static int
-gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model, GtkTreeIter * iter)
+gnc_tree_model_account_types_iter_n_children (GtkTreeModel * tree_model,
+ GtkTreeIter * iter)
{
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), -1);
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), -1);
- if (iter == NULL)
- return NUM_ACCOUNT_TYPES;
+ if (iter == NULL)
+ return NUM_ACCOUNT_TYPES;
- g_return_val_if_fail (GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp == iter->stamp, -1);
+ g_return_val_if_fail (
+ GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model)->stamp == iter->stamp, -1);
- return 0;
+ return 0;
}
static gboolean
gnc_tree_model_account_types_iter_nth_child (GtkTreeModel * tree_model,
- GtkTreeIter * iter, GtkTreeIter * parent, int n)
+ GtkTreeIter * iter,
+ GtkTreeIter * parent, int n)
{
- GncTreeModelAccountTypes *model;
-
- g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), FALSE);
-
- if (parent != NULL)
- return FALSE;
+ GncTreeModelAccountTypes *model;
- model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
+ g_return_val_if_fail (GNC_IS_TREE_MODEL_ACCOUNT_TYPES (tree_model), FALSE);
- if (n > NO_TYPE && n < NUM_ACCOUNT_TYPES) {
- iter->stamp = 0;
+ if (parent != NULL)
+ return FALSE;
- return FALSE;
- }
+ model = GNC_TREE_MODEL_ACCOUNT_TYPES (tree_model);
+ if (n > NO_TYPE && n < NUM_ACCOUNT_TYPES) {
iter->stamp = model->stamp;
iter->user_data = GINT_TO_POINTER (n);
-
return TRUE;
+ }
+
+ iter->stamp = 0;
+ return FALSE;
}
static gboolean
-gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model, GtkTreeIter * iter, GtkTreeIter * child)
+gnc_tree_model_account_types_iter_parent (GtkTreeModel * tree_model,
+ GtkTreeIter * iter,
+ GtkTreeIter * child)
+{
+ return FALSE;
+}
+
+static void
+gnc_tree_model_account_types_tree_model_init (GtkTreeModelIface * iface)
{
- return FALSE;
+ iface->get_flags = gnc_tree_model_account_types_get_flags;
+ iface->get_n_columns = gnc_tree_model_account_types_get_n_columns;
+ iface->get_column_type = gnc_tree_model_account_types_get_column_type;
+ iface->get_iter = gnc_tree_model_account_types_get_iter;
+ iface->get_path = gnc_tree_model_account_types_get_path;
+ iface->get_value = gnc_tree_model_account_types_get_value;
+ iface->iter_next = gnc_tree_model_account_types_iter_next;
+ iface->iter_children = gnc_tree_model_account_types_iter_children;
+ iface->iter_has_child = gnc_tree_model_account_types_iter_has_child;
+ iface->iter_n_children = gnc_tree_model_account_types_iter_n_children;
+ iface->iter_nth_child = gnc_tree_model_account_types_iter_nth_child;
+ iface->iter_parent = gnc_tree_model_account_types_iter_parent;
}
+
Index: gnucash/src/gnome-utils/gnc-tree-model-account-types.h
===================================================================
--- gnucash.orig/src/gnome-utils/gnc-tree-model-account-types.h
+++ gnucash/src/gnome-utils/gnc-tree-model-account-types.h
@@ -3,6 +3,7 @@
* to display account types in a GtkTreeView.
*
* Copyright (C) 2003 Jan Arne Petersen
+ * Copyright (C) 2005, Chris Shoemaker <c.shoemaker at cox.net>
* Author: Jan Arne Petersen <jpetersen at uni-bonn.de>
*
* This program is free software; you can redistribute it and/or
@@ -36,7 +37,7 @@
#ifndef __GNC_TREE_MODEL_ACCOUNT_TYPES_H
#define __GNC_TREE_MODEL_ACCOUNT_TYPES_H
-#include <gtk/gtktreemodel.h>
+#include <gtk/gtk.h>
G_BEGIN_DECLS
@@ -71,13 +72,56 @@ typedef struct {
} GncTreeModelAccountTypesClass;
/* function prototypes */
-GType gnc_tree_model_account_types_get_type (void);
+GType gnc_tree_model_account_types_get_type (void);
-GtkTreeModel *gnc_tree_model_account_types_new (guint32 selected);
+/* Choose one of two methods to use the GncTreeModelAccountTypes
+ objects defined here, depending on how you want to deal with
+ selection state. Method 1 is simpler and light-weight, but Method
+ 2 is more flexible.
-guint32 gnc_tree_model_account_types_get_selected (GncTreeModelAccountTypes *model);
-void gnc_tree_model_account_types_set_selected (GncTreeModelAccountTypes *model,
- guint32 selected);
+ Method 1: If you just want to allow selection of a subset of all
+ account types while showing all account types, use
+ gnc_tree_model_account_types_master() to get the treemodel.
+ Connect it to your tree view and use
+ gnc_tree_view_account_types_{sg}et_selection() to convert between
+ bitmasks and GtkTreeView states. No need to free the treemodel.
+
+ Method 2: If you must store selection state in the model for some
+ reason (maybe you want to use a checkbox column to indicate
+ selection?) then you need your own instance from
+ gnc_tree_model_account_types_new(). Use
+ gnc_tree_model_account_types_{gs}et_selected() to get and set the
+ models "SELECTED" column values. You must free the model when
+ you're done with it.
+
+*/
+
+/*************** Method 1 functions ***************/
+
+/* Get the static GtkTreeModel representing the list of all possible
+ account types. You may not modify this model, but you can use if
+ for multiple views. */
+GtkTreeModel * gnc_tree_model_account_types_master(void);
+
+/* Return the bitmask of the account type enums reflecting the state
+ of the tree selection */
+guint32 gnc_tree_model_account_types_get_selection(GtkTreeView *view);
+
+/* Set the selection state of the tree selection to match the bitmask
+ of account-type enums in 'selected' */
+void gnc_tree_model_account_types_set_selection(GtkTreeView *view,
+ guint32 selected);
+
+
+/**************** Method 2 functions **************/
+
+GtkTreeModel *gnc_tree_model_account_types_new(guint32 selected);
+
+guint32 gnc_tree_model_account_types_get_selected(
+ GncTreeModelAccountTypes * model);
+
+void gnc_tree_model_account_types_set_selected(
+ GncTreeModelAccountTypes * model, guint32 selected);
G_END_DECLS
--
More information about the gnucash-devel
mailing list