Modify Tax Info on Account Page to display or not display sub-account info based on whether row is expanded.

Re-apply changes reverted in r20251. The only difference between this commit and r20207 is that, contrary to the recommendation given in gnc-tree-view.h, "Use GNC_TREE_VIEW_COLUMN_DATA_NONE if you plan on using a non-model data source for this column", it cobtinues to use "GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO". Using "GNC_TREE_VIEW_COLUMN_DATA_NONE" generates problems later in the "gnc_tree_view_add_text_column" routine when it tries to set up sorting for the column ("CRIT <Gtk> gtk_tree_sortable_set_sort_func: assertion `sort_column_id >= 0' failed").

Define a new column, GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT, in gnc-tree-model-account.c filled with gnc_ui_account_get_tax_info_sub_acct_string.

Modify gnc-tree-view-account.c to define a tax_info_data_func that displays only the the data in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO model column if the row is expanded; otherwise it combines it with the data in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT model column. Modily the view creation function to use the new tax_info_data_func for the text after having first set it to GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO to prevent the problem mentioned above, thereby overriding it.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@20359 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
J. Alex Aycinena 2011-03-01 23:09:37 +00:00
parent 97a9fad2db
commit 1b9023e78f
3 changed files with 87 additions and 5 deletions

View File

@ -411,6 +411,7 @@ gnc_tree_model_account_get_column_type (GtkTreeModel *tree_model,
case GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD:
case GNC_TREE_MODEL_ACCOUNT_COL_NOTES:
case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO:
case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
case GNC_TREE_MODEL_ACCOUNT_COL_COLOR_PRESENT:
@ -801,6 +802,11 @@ gnc_tree_model_account_get_value (GtkTreeModel *tree_model,
g_value_take_string (value, gnc_ui_account_get_tax_info_string (account));
break;
case GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT:
g_value_init (value, G_TYPE_STRING);
g_value_take_string (value, gnc_ui_account_get_tax_info_sub_acct_string (account));
break;
case GNC_TREE_MODEL_ACCOUNT_COL_LASTNUM:
g_value_init (value, G_TYPE_STRING);
g_value_set_string (value, xaccAccountGetLastNum (account));

View File

@ -78,6 +78,7 @@ typedef enum
GNC_TREE_MODEL_ACCOUNT_COL_TOTAL_PERIOD,
GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT,
GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER,
GNC_TREE_MODEL_ACCOUNT_COL_LAST_VISIBLE = GNC_TREE_MODEL_ACCOUNT_COL_PLACEHOLDER,

View File

@ -71,6 +71,12 @@ static void gtva_setup_column_renderer_edited_cb(GncTreeViewAccount *account_vie
GtkCellRenderer *renderer,
GncTreeViewAccountColumnTextEdited col_edited_cb);
static void tax_info_data_func (GtkTreeViewColumn *col,
GtkCellRenderer *renderer,
GtkTreeModel *model,
GtkTreeIter *iter,
gpointer view);
typedef struct GncTreeViewAccountPrivate
{
AccountViewInfo avi;
@ -459,6 +465,66 @@ sort_by_total_period_value (GtkTreeModel *f_model,
return sort_by_xxx_period_value (f_model, f_iter_a, f_iter_b, TRUE);
}
/************************************************************/
/* Tax_Info data function */
/************************************************************/
/*
* The tax-info column in the account tree view is based on the
* combination of two columns in the account tree model. The data
* function displays only the the data in the
* GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO model column if the row is
* expanded; otherwise it combines it with the data
* in the GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT model column.
*/
static void
tax_info_data_func (GtkTreeViewColumn *col,
GtkCellRenderer *renderer,
GtkTreeModel *model,
GtkTreeIter *iter,
gpointer view)
{
const gchar *tax_info, *tax_info_sub_acct;
GtkTreePath *path;
gtk_tree_model_get(model,
iter,
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
&tax_info,
-1);
if (tax_info == NULL)
tax_info = "";
path = gtk_tree_model_get_path(model, iter);
if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(view), path))
g_object_set(renderer, "text", tax_info, NULL);
else
{
gtk_tree_model_get(model,
iter,
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO_SUB_ACCT,
&tax_info_sub_acct,
-1);
if (tax_info_sub_acct == NULL)
tax_info_sub_acct = "";
if (safe_strcmp (tax_info_sub_acct, "") == 0)
g_object_set(renderer, "text", tax_info, NULL);
else
{
if (safe_strcmp (tax_info, "") == 0)
g_object_set(renderer, "text", tax_info_sub_acct, NULL);
else
{
const gchar *combined_tax_info;
combined_tax_info = g_strdup_printf ("%s; %s", tax_info,
tax_info_sub_acct);
g_object_set(renderer, "text", combined_tax_info, NULL);
}
}
}
gtk_tree_path_free(path);
}
/************************************************************/
/* New View Creation */
/************************************************************/
@ -477,6 +543,8 @@ gnc_tree_view_account_new_with_root (Account *root, gboolean show_root)
GtkTreePath *virtual_root_path = NULL;
const gchar *sample_type, *sample_commodity;
GncTreeViewAccountPrivate *priv;
GtkTreeViewColumn *tax_info_column;
GtkCellRenderer *renderer;
ENTER(" ");
/* Create our view */
@ -644,11 +712,18 @@ gnc_tree_view_account_new_with_root (Account *root, gboolean show_root)
GNC_TREE_MODEL_ACCOUNT_COL_NOTES,
GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
sort_by_string);
gnc_tree_view_add_text_column(view, _("Tax Info"), "tax-info", NULL,
"Sample tax info.",
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
sort_by_string);
tax_info_column
= gnc_tree_view_add_text_column(view, _("Tax Info"), "tax-info", NULL,
"Sample tax info.",
GNC_TREE_MODEL_ACCOUNT_COL_TAX_INFO,
GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS,
sort_by_string);
renderer = gnc_tree_view_column_get_renderer(tax_info_column);
gtk_tree_view_column_set_cell_data_func(tax_info_column,
renderer,
tax_info_data_func,
GTK_TREE_VIEW(view),
NULL);
gnc_tree_view_add_toggle_column(view, _("Placeholder"),
/* Translators: This string has a context prefix; the translation
must only contain the part after the | character. */