1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 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
;
43 gboolean
list_account_level1_expanded(GtkTreeView
*treeview
, gchar
*name
)
45 gboolean retval
, valid
;
49 model
= gtk_tree_view_get_model(GTK_TREE_VIEW(treeview
));
51 valid
= gtk_tree_model_get_iter_first (model
, &iter1
);
54 GtkTreePath
*tmppath
= gtk_tree_model_get_path(model
, &iter1
);
56 if( gtk_tree_view_row_expanded(GTK_TREE_VIEW(treeview
), tmppath
) == FALSE
)
60 gtk_tree_model_get(model
, &iter1
, LST_DSPACC_NAME
, &tmpname
, -1);
61 if( !strcmp(name
, tmpname
) )
66 gtk_tree_path_free(tmppath
);
67 valid
= gtk_tree_model_iter_next (model
, &iter1
);
74 ** draw some icons according to the stored data structure
77 status_cell_data_function (GtkTreeViewColumn
*col
,
78 GtkCellRenderer
*renderer
,
84 gchar
*iconname
= NULL
;
87 gtk_tree_model_get(model
, iter
,
88 LST_DSPACC_DATATYPE
, &dt
,
89 LST_DSPACC_DATAS
, &acc
,
92 if( dt
== DSPACC_TYPE_NORMAL
)
95 switch(GPOINTER_TO_INT(user_data
))
98 iconname
= (acc
->flags
& AF_ADDED
) ? ICONNAME_HB_OPE_NEW
: NULL
;
99 // override if closed account
100 if( acc
->flags
& AF_CLOSED
)
101 iconname
= ICONNAME_CHANGES_PREVENT
;
104 iconname
= (acc
->flags
& AF_CHANGED
) ? ICONNAME_HB_OPE_EDIT
: NULL
;
109 g_object_set(renderer
, "icon-name", iconname
, NULL
);
114 ** draw some text from the stored data structure
117 text_cell_data_function (GtkTreeViewColumn
*col
,
118 GtkCellRenderer
*renderer
,
127 gtk_tree_model_get(model
, iter
,
128 LST_DSPACC_DATATYPE
, &dt
,
129 LST_DSPACC_DATAS
, &acc
,
130 LST_DSPACC_NAME
, &groupname
,
133 if( dt
== DSPACC_TYPE_NORMAL
)
135 switch(GPOINTER_TO_INT(user_data
))
138 g_object_set(renderer
, "weight", PANGO_WEIGHT_NORMAL
, "text", acc
->name
, NULL
);
141 //g_object_set(renderer, "text", acc->number, NULL);
147 g_object_set(renderer
,
148 "weight", PANGO_WEIGHT_BOLD
,
158 float_cell_data_function (GtkTreeViewColumn
*col
, GtkCellRenderer
*renderer
, GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
161 gchar buf
[G_ASCII_DTOSTR_BUF_SIZE
];
167 gtk_tree_model_get(model
, iter
,
168 LST_DSPACC_DATATYPE
, &dt
,
169 LST_DSPACC_DATAS
, &acc
,
170 GPOINTER_TO_INT(user_data
), &value
, //LST_DSPACC_(BANK/TODAY/FUTURE)
173 guint32 kcur
= (acc
!= NULL
) ? acc
->kcur
: GLOBALS
->kcur
;
175 if( dt
== DSPACC_TYPE_HEADER
)
180 tp
= gtk_tree_model_get_path(model
, iter
);
181 expanded
= gtk_tree_view_row_expanded(GTK_TREE_VIEW(gtk_tree_view_column_get_tree_view(col
)), tp
);
184 gtk_tree_path_free(tp
);
188 hb_strfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, value
, kcur
, GLOBALS
->minor
);
189 color
= get_normal_color_amount(value
);
190 g_object_set(renderer
,
191 "weight", PANGO_WEIGHT_NORMAL
,
197 g_object_set(renderer
, "text", NULL
,
203 hb_strfmon(buf
, G_ASCII_DTOSTR_BUF_SIZE
-1, value
, kcur
, GLOBALS
->minor
);
206 weight
= PANGO_WEIGHT_NORMAL
;
208 if( dt
== DSPACC_TYPE_NORMAL
)
210 color
= get_minimum_color_amount(value
, acc
->minimum
);
214 color
= get_normal_color_amount(value
);
215 weight
= PANGO_WEIGHT_BOLD
;
218 //g_print("value='%.2f' buf='%s' color='%s'\n", value, buf, color);
220 g_object_set(renderer
,
230 static GtkTreeViewColumn
*amount_list_account_column(gchar
*name
, gint id
)
232 GtkTreeViewColumn
*column
;
233 GtkCellRenderer
*renderer
;
235 column
= gtk_tree_view_column_new();
236 gtk_tree_view_column_set_title(column
, name
);
238 renderer
= gtk_cell_renderer_text_new ();
239 g_object_set(renderer
, "xalign", 1.0, NULL
);
240 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
241 gtk_tree_view_column_set_cell_data_func(column
, renderer
, float_cell_data_function
, GINT_TO_POINTER(id
), NULL
);
242 gtk_tree_view_column_set_sizing(column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
243 gtk_tree_view_column_set_alignment (column
, 0.5);
244 gtk_tree_view_column_set_spacing( column
, 16 );
245 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_BANK);
251 list_account_compare_func (GtkTreeModel
*model
, GtkTreeIter
*a
, GtkTreeIter
*b
, gpointer userdata
)
255 Account
*entry1
, *entry2
;
256 gchar
*name1
, *name2
;
259 gtk_tree_model_get(model
, a
,
260 LST_DSPACC_POS
, &pos1
,
261 LST_DSPACC_DATATYPE
, &dt1
,
262 LST_DSPACC_DATAS
, &entry1
,
263 LST_DSPACC_NAME
, &name1
,
265 gtk_tree_model_get(model
, b
,
266 LST_DSPACC_POS
, &pos2
,
267 LST_DSPACC_DATATYPE
, &dt2
,
268 LST_DSPACC_DATAS
, &entry2
,
269 LST_DSPACC_NAME
, &name2
,
272 if( dt1
== DSPACC_TYPE_NORMAL
&& dt2
== DSPACC_TYPE_NORMAL
)
274 retval
= entry1
->pos
- entry2
->pos
;
277 if( dt1
== DSPACC_TYPE_HEADER
&& dt2
== DSPACC_TYPE_HEADER
)
279 retval
= pos1
- pos2
;
281 retval
= hb_string_utf8_compare(name1
, name2
);
295 gboolean
list_account_selectionfunc(
296 GtkTreeSelection
*selection
, GtkTreeModel
*model
, GtkTreePath
*path
, gboolean path_currently_selected
, gpointer data
)
300 if( gtk_tree_path_get_depth( path
) < 2 )
303 if(gtk_tree_model_get_iter(model
, &iter
, path
))
307 gtk_tree_model_get(model
, &iter
,
308 LST_DSPACC_DATATYPE
, &dt
,
311 if( dt
!= DSPACC_TYPE_NORMAL
)
319 static GtkTreeViewColumn
*list_account_get_column(GtkTreeView
*treeview
, gint uid
)
321 GtkTreeViewColumn
*retval
= NULL
;
324 for(i
=0;i
<gtk_tree_view_get_n_columns(treeview
);i
++)
326 GtkTreeViewColumn
*column
= gtk_tree_view_get_column(treeview
, i
);
330 gint coluid
= GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(column
), "uid"));
339 static void list_account_destroy(GtkTreeView
*treeview
, gpointer user_data
)
341 GtkTreeViewColumn
*column
;
343 DB( g_print ("\n[list_account] destroy\n") );
345 column
= list_account_get_column(treeview
, COL_DSPACC_ACCOUNTS
);
348 PREFS
->pnl_acc_col_acc_width
= gtk_tree_view_column_get_width(column
);
353 GtkWidget
*create_list_account(void)
357 GtkCellRenderer
*renderer
;
358 GtkTreeViewColumn
*column
;
360 DB( g_print ("\n[list_account] create\n") );
362 /* create list store */
363 store
= gtk_tree_store_new(
365 G_TYPE_INT
, /* fake: status */
366 G_TYPE_STRING
, /* fake: name */
370 G_TYPE_POINTER
, /* datas*/
371 G_TYPE_INT
/* datatype */
375 view
= gtk_tree_view_new_with_model(GTK_TREE_MODEL(store
));
376 g_object_unref(store
);
378 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view
), PREFS
->grid_lines
);
379 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
380 // COLUMN_DESCRIPTION);
382 //gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW (view), TRUE);
384 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)), GTK_SELECTION_SINGLE
);
387 column
= gtk_tree_view_column_new();
388 //gtk_tree_view_column_set_title(column, _("Status"));
390 renderer
= gtk_cell_renderer_pixbuf_new ();
391 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
392 gtk_tree_view_column_set_cell_data_func(column
, renderer
, status_cell_data_function
, GINT_TO_POINTER(1), NULL
);
394 renderer
= gtk_cell_renderer_pixbuf_new ();
395 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
396 gtk_tree_view_column_set_cell_data_func(column
, renderer
, status_cell_data_function
, GINT_TO_POINTER(2), NULL
);
398 gtk_tree_view_column_set_alignment (column
, 0.5);
399 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
402 renderer
= gtk_cell_renderer_text_new ();
403 g_object_set(renderer
,
404 "ellipsize", PANGO_ELLIPSIZE_END
,
405 "ellipsize-set", TRUE
,
406 //taken from nemo, not exactly a resize to content, but good compromise
410 column
= gtk_tree_view_column_new();
411 g_object_set_data(G_OBJECT(column
), "uid", GUINT_TO_POINTER(COL_DSPACC_ACCOUNTS
));
412 gtk_tree_view_column_set_title(column
, _("Accounts"));
413 gtk_tree_view_column_pack_start(column
, renderer
, TRUE
);
414 gtk_tree_view_column_set_cell_data_func(column
, renderer
, text_cell_data_function
, GINT_TO_POINTER(LST_DSPACC_NAME
), NULL
);
415 gtk_tree_view_column_set_alignment (column
, 0.5);
416 gtk_tree_view_column_set_min_width(column
, HB_MINWIDTH_LIST
/2);
417 gtk_tree_view_column_set_resizable(column
, TRUE
);
418 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
420 gtk_tree_view_column_set_fixed_width(column
, PREFS
->pnl_acc_col_acc_width
);
421 gtk_tree_view_set_expander_column(GTK_TREE_VIEW (view
), column
);
424 column
= amount_list_account_column(_("Bank"), LST_DSPACC_BANK
);
425 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
428 column
= amount_list_account_column(_("Today"), LST_DSPACC_TODAY
);
429 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
432 column
= amount_list_account_column(_("Future"), LST_DSPACC_FUTURE
);
433 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
435 /* column 7: empty */
436 column
= gtk_tree_view_column_new();
437 gtk_tree_view_append_column (GTK_TREE_VIEW(view
), column
);
440 /* disable selection for level 1 of the tree */
442 gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(view
)), list_account_selectionfunc
, NULL
, NULL
);
445 gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store
), list_account_compare_func
, NULL
, NULL
);
446 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store
), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID
, GTK_SORT_ASCENDING
);
448 g_signal_connect (view
, "destroy", G_CALLBACK (list_account_destroy
), NULL
);