]> Dogcows Code - chaz/homebank/blob - src/list_account.c
import homebank-5.1.7
[chaz/homebank] / src / list_account.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 Maxime DOYEN
3 *
4 * This file is part of HomeBank.
5 *
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.
10 *
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.
15 *
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/>.
18 */
19
20
21 #include "homebank.h"
22
23 #include "list_account.h"
24
25 /****************************************************************************/
26 /* Debug macros */
27 /****************************************************************************/
28 #define MYDEBUG 0
29
30 #if MYDEBUG
31 #define DB(x) (x);
32 #else
33 #define DB(x);
34 #endif
35
36 /* our global datas */
37 extern struct HomeBank *GLOBALS;
38 extern struct Preferences *PREFS;
39
40 extern gchar *CYA_ACC_TYPE[]; //in ui_account.c
41
42 /*
43 ** draw some icons according to the stored data structure
44 */
45 static void
46 status_cell_data_function (GtkTreeViewColumn *col,
47 GtkCellRenderer *renderer,
48 GtkTreeModel *model,
49 GtkTreeIter *iter,
50 gpointer user_data)
51 {
52 Account *acc;
53 gchar *iconname = NULL;
54 gint dt;
55
56 gtk_tree_model_get(model, iter,
57 LST_DSPACC_DATATYPE, &dt,
58 LST_DSPACC_DATAS, &acc,
59 -1);
60
61 if( dt == DSPACC_TYPE_NORMAL )
62 {
63
64 switch(GPOINTER_TO_INT(user_data))
65 {
66 case 1:
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;
71 break;
72 case 2:
73 iconname = (acc->flags & AF_CHANGED) ? ICONNAME_HB_OPE_EDIT : NULL;
74 break;
75 }
76 }
77
78 g_object_set(renderer, "icon-name", iconname, NULL);
79 }
80
81 /*
82 ** draw some text from the stored data structure
83 */
84 /*
85 static void
86 acc_type_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
87 {
88 Account *acc;
89 gint dt;
90
91 gtk_tree_model_get(model, iter,
92 LST_DSPACC_DATATYPE, &dt,
93 LST_DSPACC_DATAS, &acc,
94 -1);
95
96 if( dt == DSPACC_TYPE_NORMAL && acc->type > 0 )
97 {
98 g_object_set(renderer, "text", _(CYA_ACC_TYPE[acc->type]), NULL);
99 }
100 else
101 g_object_set(renderer, "text", NULL, NULL);
102 }
103 */
104
105 /*
106 ** draw some text from the stored data structure
107 */
108 static void
109 text_cell_data_function (GtkTreeViewColumn *col,
110 GtkCellRenderer *renderer,
111 GtkTreeModel *model,
112 GtkTreeIter *iter,
113 gpointer user_data)
114 {
115 Account *acc;
116 gint dt;
117 gchar *groupname;
118
119 gtk_tree_model_get(model, iter,
120 LST_DSPACC_DATATYPE, &dt,
121 LST_DSPACC_DATAS, &acc,
122 LST_DSPACC_NAME, &groupname,
123 -1);
124
125 if( dt == DSPACC_TYPE_NORMAL )
126 {
127 switch(GPOINTER_TO_INT(user_data))
128 {
129 case 1:
130 g_object_set(renderer, "weight", PANGO_WEIGHT_NORMAL, "text", acc->name, NULL);
131 break;
132 case 2:
133 //g_object_set(renderer, "text", acc->number, NULL);
134 break;
135
136 }
137 }
138 else
139 g_object_set(renderer,
140 "weight", PANGO_WEIGHT_BOLD,
141 "text", groupname,
142 NULL);
143
144 //leak
145 g_free(groupname);
146 }
147
148
149 static void
150 float_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
151 {
152 gdouble value;
153 gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
154 Account *acc;
155 gint dt;
156 gint weight;
157 gchar *color;
158
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)
163 -1);
164
165 guint32 kcur = (acc != NULL) ? acc->kcur : GLOBALS->kcur;
166
167 if( dt == DSPACC_TYPE_HEADER )
168 {
169 gboolean expanded;
170 GtkTreePath* tp;
171
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);
174
175 //leak
176 gtk_tree_path_free(tp);
177
178 if(!expanded)
179 {
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,
184 "foreground", color,
185 "text", buf,
186 NULL);
187 }
188 else
189 g_object_set(renderer, "text", NULL,
190 NULL);
191
192 }
193 else
194 {
195 hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, value, kcur, GLOBALS->minor);
196
197 color = NULL;
198 weight = PANGO_WEIGHT_NORMAL;
199
200 if( dt == DSPACC_TYPE_NORMAL )
201 {
202 color = get_minimum_color_amount(value, acc->minimum);
203 }
204 else
205 {
206 color = get_normal_color_amount(value);
207 weight = PANGO_WEIGHT_BOLD;
208 }
209
210 //g_print("value='%.2f' buf='%s' color='%s'\n", value, buf, color);
211
212 g_object_set(renderer,
213 "weight", weight,
214 "foreground", color,
215 "text", buf,
216 NULL);
217
218 }
219 }
220
221
222 static GtkTreeViewColumn *amount_list_account_column(gchar *name, gint id)
223 {
224 GtkTreeViewColumn *column;
225 GtkCellRenderer *renderer;
226
227 column = gtk_tree_view_column_new();
228 gtk_tree_view_column_set_title(column, name);
229
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);
238
239 return column;
240 }
241
242 static gint
243 list_account_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata)
244 {
245 gint retval = 0;
246 gint dt1, dt2;
247 Account *entry1, *entry2;
248 gchar *name1, *name2;
249 gint pos1, pos2;
250
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,
256 -1);
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,
262 -1);
263
264 if( dt1 == DSPACC_TYPE_NORMAL && dt2 == DSPACC_TYPE_NORMAL )
265 {
266 retval = entry1->pos - entry2->pos;
267 }
268 else
269 if( dt1 == DSPACC_TYPE_HEADER && dt2 == DSPACC_TYPE_HEADER )
270 {
271 retval = pos1 - pos2;
272 if( !retval )
273 retval = hb_string_utf8_compare(name1, name2);
274 }
275
276 g_free(name2);
277 g_free(name1);
278
279 return retval;
280 }
281
282
283 /*
284 *
285 */
286 static
287 gboolean list_account_selectionfunc(
288 GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data)
289 {
290 GtkTreeIter iter;
291
292 if( gtk_tree_path_get_depth( path ) < 2 )
293 return FALSE;
294
295 if(gtk_tree_model_get_iter(model, &iter, path))
296 {
297 gint dt;
298
299 gtk_tree_model_get(model, &iter,
300 LST_DSPACC_DATATYPE, &dt,
301 -1);
302
303 if( dt != DSPACC_TYPE_NORMAL )
304 return FALSE;
305 }
306
307 return TRUE;
308 }
309
310
311 static void list_account_destroy(GtkTreeView *treeview, gpointer user_data)
312 {
313 GtkTreeViewColumn *column;
314
315 DB( g_print ("\n[list_account] destroy\n") );
316
317 //todo: unsafe to use direct column index
318 column = gtk_tree_view_get_column(treeview, LST_DSPACC_NAME);
319 if( column )
320 {
321 PREFS->pnl_acc_col_acc_width = gtk_tree_view_column_get_width(column);
322 }
323 }
324
325
326 GtkWidget *create_list_account(void)
327 {
328 GtkTreeStore *store;
329 GtkWidget *view;
330 GtkCellRenderer *renderer;
331 GtkTreeViewColumn *column;
332
333 DB( g_print ("\n[list_account] create\n") );
334
335 /* create list store */
336 store = gtk_tree_store_new(
337 NUM_LST_DSPACC,
338 G_TYPE_INT, /* fake: status */
339 G_TYPE_STRING, /* fake: name */
340 G_TYPE_DOUBLE,
341 G_TYPE_DOUBLE,
342 G_TYPE_DOUBLE,
343 G_TYPE_POINTER, /* datas*/
344 G_TYPE_INT /* datatype */
345 );
346
347 //treeview
348 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
349 g_object_unref(store);
350
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);
354
355 //gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW (view), TRUE);
356
357 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_SINGLE);
358
359 /* Status */
360 column = gtk_tree_view_column_new();
361 //gtk_tree_view_column_set_title(column, _("Status"));
362
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);
366
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);
370
371 gtk_tree_view_column_set_alignment (column, 0.5);
372 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
373
374 /* Account */
375 renderer = gtk_cell_renderer_text_new ();
376 g_object_set(renderer,
377 "ellipsize", PANGO_ELLIPSIZE_END,
378 "ellipsize-set", TRUE,
379 NULL);
380
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);
389
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);
392
393 /* Bank */
394 column = amount_list_account_column(_("Bank"), LST_DSPACC_BANK);
395 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
396
397 /* Today */
398 column = amount_list_account_column(_("Today"), LST_DSPACC_TODAY);
399 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
400
401 /* Future */
402 column = amount_list_account_column(_("Future"), LST_DSPACC_FUTURE);
403 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
404
405 /* column 7: empty */
406 column = gtk_tree_view_column_new();
407 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
408
409
410 /* disable selection for level 1 of the tree */
411
412 gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), list_account_selectionfunc, NULL, NULL);
413
414 //sort etc
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);
417
418 g_signal_connect (view, "destroy", G_CALLBACK (list_account_destroy), NULL);
419
420 return(view);
421 }
422
This page took 0.046651 seconds and 4 git commands to generate.