1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "list_account.h"
25 /****************************************************************************/
27 /****************************************************************************/
36 /* our global datas */
37 extern struct HomeBank
*GLOBALS
;
38 extern struct Preferences
*PREFS
;
40 extern gchar
*CYA_ACC_TYPE
[]; //in ui_account.c
43 ** draw some icons according to the stored data structure
46 status_cell_data_function (GtkTreeViewColumn
*col
,
47 GtkCellRenderer
*renderer
,
53 gchar
*iconname
= NULL
;
56 gtk_tree_model_get(model
, iter
,
57 LST_DSPACC_DATATYPE
, &dt
,
58 LST_DSPACC_DATAS
, &acc
,
61 if( dt
== DSPACC_TYPE_NORMAL
)
64 switch(GPOINTER_TO_INT(user_data
))
67 iconname
= (acc
->flags
& AF_ADDED
) ? ICONNAME_NEW
: NULL
;
68 // override if closed account
69 if( acc
->flags
& AF_CLOSED
)
70 iconname
= ICONNAME_CHANGES_PREVENT
;
73 iconname
= (acc
->flags
& AF_CHANGED
) ? ICONNAME_HB_OPE_EDIT
: NULL
;
78 g_object_set(renderer
, "icon-name", iconname
, NULL
);
82 ** draw some text from the stored data structure
86 acc_type_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
91 gtk_tree_model_get(model, iter,
92 LST_DSPACC_DATATYPE, &dt,
93 LST_DSPACC_DATAS, &acc,
96 if( dt == DSPACC_TYPE_NORMAL && acc->type > 0 )
98 g_object_set(renderer, "text", _(CYA_ACC_TYPE[acc->type]), NULL);
101 g_object_set(renderer, "text", NULL, NULL);
106 ** draw some text from the stored data structure
109 text_cell_data_function (GtkTreeViewColumn
*col
,
110 GtkCellRenderer
*renderer
,
119 gtk_tree_model_get(model
, iter
,
120 LST_DSPACC_DATATYPE
, &dt
,
121 LST_DSPACC_DATAS
, &acc
,
122 LST_DSPACC_NAME
, &groupname
,
125 if( dt
== DSPACC_TYPE_NORMAL
)
127 switch(GPOINTER_TO_INT(user_data
))
130 g_object_set(renderer
, "weight", PANGO_WEIGHT_NORMAL
, "text", acc
->name
, NULL
);
133 //g_object_set(renderer, "text", acc->number, NULL);
139 g_object_set(renderer
,
140 "weight", PANGO_WEIGHT_BOLD
,
150 float_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
153 gchar buf
[G_ASCII_DTOSTR_BUF_SIZE
];
159 gtk_tree_model_get(model
, iter
,
160 LST_DSPACC_DATATYPE
, &dt
,
161 LST_DSPACC_DATAS
, &acc
,
162 GPOINTER_TO_INT(user_data
), &value
, //LST_DSPACC_(BANK/TODAY/FUTURE)
165 guint32 kcur
= (acc
!= NULL
) ? acc
->kcur
: GLOBALS
->kcur
;
167 if( dt
== DSPACC_TYPE_HEADER
)
172 tp
= gtk_tree_model_get_path(model
, iter
);
173 expanded
= gtk_tree_view_row_expanded(GTK_TREE_VIEW(gtk_tree_view_column_get_tree_view(col
)), tp
);
176 gtk_tree_path_free(tp
);
180 hb_strfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, value
, kcur
, GLOBALS
->minor
);
181 color
= get_normal_color_amount(value
);
182 g_object_set(renderer
,
183 "weight", PANGO_WEIGHT_NORMAL
,
189 g_object_set(renderer
, "text", NULL
,
195 hb_strfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, value
, kcur
, GLOBALS
->minor
);
198 weight
= PANGO_WEIGHT_NORMAL
;
200 if( dt
== DSPACC_TYPE_NORMAL
)
202 color
= get_minimum_color_amount(value
, acc
->minimum
);
206 color
= get_normal_color_amount(value
);
207 weight
= PANGO_WEIGHT_BOLD
;
210 //g_print("value='%.2f' buf='%s' color='%s'\n", value, buf, color);
212 g_object_set(renderer
,
222 static GtkTreeViewColumn
*amount_list_account_column(gchar
*name
, gint id
)
224 GtkTreeViewColumn
*column
;
225 GtkCellRenderer
*renderer
;
227 column
= gtk_tree_view_column_new();
228 gtk_tree_view_column_set_title(column
, name
);
230 renderer
= gtk_cell_renderer_text_new ();
231 g_object_set(renderer
, "xalign", 1.0, NULL
);
232 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
233 gtk_tree_view_column_set_cell_data_func(column
, renderer
, float_cell_data_function
, GINT_TO_POINTER(id
), NULL
);
234 gtk_tree_view_column_set_sizing(column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
235 gtk_tree_view_column_set_alignment (column
, 0.5);
236 gtk_tree_view_column_set_spacing( column
, 16 );
237 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_BANK);
243 list_account_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
247 Account
*entry1
, *entry2
;
248 gchar
*name1
, *name2
;
251 gtk_tree_model_get(model
, a
,
252 LST_DSPACC_POS
, &pos1
,
253 LST_DSPACC_DATATYPE
, &dt1
,
254 LST_DSPACC_DATAS
, &entry1
,
255 LST_DSPACC_NAME
, &name1
,
257 gtk_tree_model_get(model
, b
,
258 LST_DSPACC_POS
, &pos2
,
259 LST_DSPACC_DATATYPE
, &dt2
,
260 LST_DSPACC_DATAS
, &entry2
,
261 LST_DSPACC_NAME
, &name2
,
264 if( dt1
== DSPACC_TYPE_NORMAL
&& dt2
== DSPACC_TYPE_NORMAL
)
266 retval
= entry1
->pos
- entry2
->pos
;
269 if( dt1
== DSPACC_TYPE_HEADER
&& dt2
== DSPACC_TYPE_HEADER
)
271 retval
= pos1
- pos2
;
273 retval
= hb_string_utf8_compare(name1
, name2
);
287 gboolean
list_account_selectionfunc(
288 GtkTreeSelection
*selection
, GtkTreeModel
*model
, GtkTreePath
*path
, gboolean path_currently_selected
, gpointer data
)
292 if( gtk_tree_path_get_depth( path
) < 2 )
295 if(gtk_tree_model_get_iter(model
, &iter
, path
))
299 gtk_tree_model_get(model
, &iter
,
300 LST_DSPACC_DATATYPE
, &dt
,
303 if( dt
!= DSPACC_TYPE_NORMAL
)
311 static void list_account_destroy(GtkTreeView
*treeview
, gpointer user_data
)
313 GtkTreeViewColumn
*column
;
315 DB( g_print ("\n[list_account] destroy\n") );
317 //todo: unsafe to use direct column index
318 column
= gtk_tree_view_get_column(treeview
, LST_DSPACC_NAME
);
321 PREFS
->pnl_acc_col_acc_width
= gtk_tree_view_column_get_width(column
);
326 GtkWidget
*create_list_account(void)
330 GtkCellRenderer
*renderer
;
331 GtkTreeViewColumn
*column
;
333 DB( g_print ("\n[list_account] create\n") );
335 /* create list store */
336 store
= gtk_tree_store_new(
338 G_TYPE_INT
, /* fake: status */
339 G_TYPE_STRING
, /* fake: name */
343 G_TYPE_POINTER
, /* datas*/
344 G_TYPE_INT
/* datatype */
348 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
349 g_object_unref(store
);
351 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view
), PREFS
->grid_lines
);
352 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
353 // COLUMN_DESCRIPTION);
355 //gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW (view), TRUE);
357 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)), GTK_SELECTION_SINGLE
);
360 column
= gtk_tree_view_column_new();
361 //gtk_tree_view_column_set_title(column, _("Status"));
363 renderer
= gtk_cell_renderer_pixbuf_new ();
364 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
365 gtk_tree_view_column_set_cell_data_func(column
, renderer
, status_cell_data_function
, GINT_TO_POINTER(1), NULL
);
367 renderer
= gtk_cell_renderer_pixbuf_new ();
368 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
369 gtk_tree_view_column_set_cell_data_func(column
, renderer
, status_cell_data_function
, GINT_TO_POINTER(2), NULL
);
371 gtk_tree_view_column_set_alignment (column
, 0.5);
372 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
375 renderer
= gtk_cell_renderer_text_new ();
376 g_object_set(renderer
,
377 "ellipsize", PANGO_ELLIPSIZE_END
,
378 "ellipsize-set", TRUE
,
381 column
= gtk_tree_view_column_new();
382 gtk_tree_view_column_set_title(column
, _("Accounts"));
383 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
384 gtk_tree_view_column_set_cell_data_func(column
, renderer
, text_cell_data_function
, GINT_TO_POINTER(LST_DSPACC_NAME
), NULL
);
385 gtk_tree_view_column_set_alignment (column
, 0.5);
386 gtk_tree_view_column_set_min_width(column
, HB_MINWIDTH_LIST
/2);
387 gtk_tree_view_column_set_resizable(column
, TRUE
);
388 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
390 gtk_tree_view_column_set_fixed_width(column
, PREFS
->pnl_acc_col_acc_width
);
391 gtk_tree_view_set_expander_column(GTK_TREE_VIEW (view
), column
);
394 column
= amount_list_account_column(_("Bank"), LST_DSPACC_BANK
);
395 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
398 column
= amount_list_account_column(_("Today"), LST_DSPACC_TODAY
);
399 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
402 column
= amount_list_account_column(_("Future"), LST_DSPACC_FUTURE
);
403 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
405 /* column 7: empty */
406 column
= gtk_tree_view_column_new();
407 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
410 /* disable selection for level 1 of the tree */
412 gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)), list_account_selectionfunc
, NULL
, NULL
);
415 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), list_account_compare_func
, NULL
, NULL
);
416 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
418 g_signal_connect (view
, "destroy", G_CALLBACK (list_account_destroy
), NULL
);