]> Dogcows Code - chaz/homebank/blob - src/list-scheduled.c
Merge branch 'upstream'
[chaz/homebank] / src / list-scheduled.c
1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2019 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-scheduled.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
41 static void
42 sched_lateicon_cell_data_function (GtkTreeViewColumn *col,
43 GtkCellRenderer *renderer,
44 GtkTreeModel *model,
45 GtkTreeIter *iter,
46 gpointer user_data)
47 {
48 gchar *iconname = NULL;
49 gint nblate;
50
51 gtk_tree_model_get(model, iter,
52 LST_DSPUPC_NB_LATE, &nblate,
53 -1);
54
55 iconname = ( nblate > 0 ) ? ICONNAME_WARNING : NULL;
56
57 g_object_set(renderer, "icon-name", iconname, NULL);
58 }
59
60
61 /*
62 ** remaining cell function
63 */
64 static void sched_latetext_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
65 {
66 Archive *arc;
67 gchar *markuptxt;
68 gchar *color;
69 gint nblate;
70 //gint weight;
71
72 gtk_tree_model_get(model, iter,
73 LST_DSPUPC_DATAS, &arc,
74 LST_DSPUPC_NB_LATE, &nblate,
75 -1);
76
77 if(arc && nblate > 0)
78 {
79 markuptxt = g_strdup_printf(nblate < 10 ? "%d" : "+10", nblate);
80
81 color = NULL;
82 //weight = PANGO_WEIGHT_NORMAL;
83
84 if(nblate > 0 && PREFS->custom_colors == TRUE)
85 {
86 color = PREFS->color_warn;
87 }
88
89 g_object_set(renderer,
90 //"weight", weight,
91 "foreground", color,
92 "text", markuptxt,
93 NULL);
94
95 g_free(markuptxt);
96 }
97 else
98 g_object_set(renderer, "text", NULL, NULL);
99
100 }
101
102 /*
103 ** date cell function
104 */
105 static void date_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
106 {
107 Archive *arc;
108 gchar buffer[256];
109 GDate *date;
110
111 gtk_tree_model_get(model, iter,
112 LST_DSPUPC_DATAS, &arc,
113 -1);
114
115 if(arc)
116 {
117 date = g_date_new_julian (arc->nextdate);
118 g_date_strftime (buffer, 256-1, PREFS->date_format, date);
119 g_date_free(date);
120
121 //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date);
122
123 g_object_set(renderer, "text", buffer, NULL);
124
125 }
126 else
127 g_object_set(renderer, "text", NULL, NULL);
128
129 }
130
131
132 /*
133 ** still cell function
134 */
135
136 static void still_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
137 {
138 Archive *arc;
139 gchar *markuptxt;
140
141 gtk_tree_model_get(model, iter,
142 LST_DSPUPC_DATAS, &arc,
143 -1);
144
145 if(arc && (arc->flags & OF_LIMIT) )
146 {
147 markuptxt = g_strdup_printf("%d", arc->limit);
148 g_object_set(renderer, "markup", markuptxt, NULL);
149 g_free(markuptxt);
150 }
151 else
152 g_object_set(renderer, "text", NULL, NULL);
153 }
154
155
156 /*
157 ** payee cell function
158 */
159 static void payee_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
160 {
161 Archive *arc;
162 Payee *pay;
163
164 gtk_tree_model_get(model, iter,
165 LST_DSPUPC_DATAS, &arc,
166 -1);
167
168 if(arc)
169 {
170
171 pay = da_pay_get(arc->kpay);
172
173 if(pay != NULL)
174 g_object_set(renderer, "text", pay->name, NULL);
175 }
176 else
177 g_object_set(renderer, "text", NULL, NULL);
178
179 }
180
181 /*
182 ** memo cell function
183 */
184 static void memo_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
185 {
186 Archive *arc;
187 gchar *memo;
188 gint weight;
189
190 gtk_tree_model_get(model, iter,
191 LST_DSPUPC_DATAS, &arc,
192 LST_DSPUPC_MEMO, &memo,
193 -1);
194
195 weight = arc == NULL ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
196
197 g_object_set(renderer, "weight", weight, "text", memo, NULL);
198
199 //leak
200 g_free(memo);
201
202 }
203
204
205 /*
206 ** amount cell function
207 */
208 static void amount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
209 {
210 Archive *arc;
211 gdouble expense, income, amount;
212 gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
213 gint column = GPOINTER_TO_INT(user_data);
214 Account *acc;
215 gchar *color;
216 gint weight;
217
218 gtk_tree_model_get(model, iter,
219 LST_DSPUPC_DATAS, &arc,
220 LST_DSPUPC_ACCOUNT, &acc,
221 LST_DSPUPC_EXPENSE, &expense,
222 LST_DSPUPC_INCOME, &income,
223 -1);
224
225 amount = column == -1 ? expense : income;
226
227 if( amount != 0.0)
228 {
229 if( acc != NULL )
230 hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, acc->kcur, GLOBALS->minor);
231 else
232 hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, amount, GLOBALS->kcur, GLOBALS->minor);
233
234 color = get_normal_color_amount(amount);
235
236 weight = arc == NULL ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
237
238 g_object_set(renderer,
239 "weight", weight,
240 "foreground", color,
241 "text", buf,
242 NULL);
243 }
244 else
245 {
246 g_object_set(renderer, "text", NULL, NULL);
247 }
248
249 }
250
251 /*
252 ** account cell function
253 */
254 static void account_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
255 {
256 Account *acc;
257 gchar *name = NULL;
258
259 gtk_tree_model_get(model, iter,
260 LST_DSPUPC_ACCOUNT, &acc,
261 -1);
262 /* 1378836 display acc or dstacc */
263 if( acc != NULL )
264 {
265 name = acc->name;
266 }
267
268 g_object_set(renderer, "text", name, NULL);
269
270 }
271
272
273 static
274 gboolean list_account_selectionfunc(
275 GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer data)
276 {
277 GtkTreeIter iter;
278 Archive *arc;
279
280 if(gtk_tree_model_get_iter(model, &iter, path))
281 {
282 gtk_tree_model_get(model, &iter,
283 LST_DSPUPC_DATAS, &arc,
284 -1);
285
286 if( arc == NULL )
287 return FALSE;
288 }
289
290 return TRUE;
291 }
292
293
294 static GtkTreeViewColumn *list_upcoming_get_column(GtkTreeView *treeview, gint uid)
295 {
296 GtkTreeViewColumn *retval = NULL;
297 guint i;
298
299 for(i=0;i<gtk_tree_view_get_n_columns(treeview);i++)
300 {
301 GtkTreeViewColumn *column = gtk_tree_view_get_column(treeview, i);
302
303 if(column)
304 {
305 gint coluid = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(column), "uid"));
306 if( coluid == uid )
307 retval = column;
308 }
309 }
310 return retval;
311 }
312
313
314 static void list_upcoming_destroy(GtkTreeView *treeview, gpointer user_data)
315 {
316 GtkTreeViewColumn *column;
317
318 DB( g_print ("\n[list_upcoming] destroy\n") );
319
320 //#1830656 use xxx_get_fixed_width instead of width, as if not visible will save 0 otherwise
321 column = list_upcoming_get_column(treeview, COL_DSPUPC_PAYEE);
322 if( column )
323 {
324 PREFS->pnl_upc_col_pay_width = gtk_tree_view_column_get_fixed_width(column);
325 }
326
327 column = list_upcoming_get_column(treeview, COL_DSPUPC_MEMO);
328 if( column )
329 {
330 PREFS->pnl_upc_col_mem_width = gtk_tree_view_column_get_fixed_width(column);
331 }
332
333 DB( g_print(" width payee:%d, memo:%d\n", PREFS->pnl_upc_col_pay_width, PREFS->pnl_upc_col_mem_width) );
334
335 }
336
337
338 GtkWidget *create_list_upcoming(void)
339 {
340 GtkListStore *store;
341 GtkWidget *view;
342 GtkCellRenderer *renderer;
343 GtkTreeViewColumn *column;
344
345 DB( g_print ("\n[list_upcoming] create\n") );
346
347 /* create list store */
348 store = gtk_list_store_new(
349 NUM_LST_DSPUPC,
350 G_TYPE_POINTER, /* scheduled */
351 G_TYPE_INT, /* next (sort) */
352 G_TYPE_POINTER, /* account */
353 G_TYPE_STRING, /* memo/total */
354 G_TYPE_DOUBLE, /* expense */
355 G_TYPE_DOUBLE, /* income */
356 G_TYPE_INT /* nb late */
357 );
358
359 //treeview
360 view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
361 g_object_unref(store);
362
363 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (view), PREFS->grid_lines);
364 //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
365 // COLUMN_DESCRIPTION);
366
367 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_SINGLE);
368
369 /* column : Late */
370 column = gtk_tree_view_column_new();
371 //TRANSLATORS: title of list column to inform the scheduled transaction is Late
372 gtk_tree_view_column_set_title(column, _("Late"));
373
374 renderer = gtk_cell_renderer_pixbuf_new ();
375 gtk_tree_view_column_pack_start(column, renderer, TRUE);
376 gtk_tree_view_column_set_cell_data_func(column, renderer, sched_lateicon_cell_data_function, NULL, NULL);
377
378 renderer = gtk_cell_renderer_text_new ();
379 g_object_set(renderer, "xalign", 1.0, NULL);
380 gtk_tree_view_column_pack_start(column, renderer, TRUE);
381 gtk_tree_view_column_set_cell_data_func(column, renderer, sched_latetext_cell_data_function, NULL, NULL);
382
383 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_NB_LATE);
384 gtk_tree_view_column_set_alignment (column, 0.5);
385 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
386
387 /* column : Still (for limited scheduled) */
388 column = gtk_tree_view_column_new();
389 //TRANSLATORS: title of list column to inform how many occurence remain to post for limited scheduled txn
390 gtk_tree_view_column_set_title(column, _("Still"));
391
392 renderer = gtk_cell_renderer_text_new ();
393 g_object_set(renderer, "xalign", 1.0, NULL);
394 gtk_tree_view_column_pack_start(column, renderer, TRUE);
395 gtk_tree_view_column_set_cell_data_func(column, renderer, still_cell_data_function, NULL, NULL);
396 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_REMAINING);
397 gtk_tree_view_column_set_alignment (column, 0.5);
398 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
399
400 /* column: Next on */
401 renderer = gtk_cell_renderer_text_new ();
402
403 column = gtk_tree_view_column_new();
404 gtk_tree_view_column_set_title(column, _("Next date"));
405 gtk_tree_view_column_pack_start(column, renderer, TRUE);
406 gtk_tree_view_column_set_cell_data_func(column, renderer, date_cell_data_function, NULL, NULL);
407 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPUPC_DATE);
408 gtk_tree_view_column_set_alignment (column, 0.5);
409 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
410
411 /* column: Payee */
412 renderer = gtk_cell_renderer_text_new ();
413 g_object_set(renderer,
414 "ellipsize", PANGO_ELLIPSIZE_END,
415 "ellipsize-set", TRUE,
416 NULL);
417 column = gtk_tree_view_column_new();
418 g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_PAYEE));
419 gtk_tree_view_column_set_title(column, _("Payee"));
420 gtk_tree_view_column_pack_start(column, renderer, TRUE);
421 gtk_tree_view_column_set_cell_data_func(column, renderer, payee_cell_data_function, NULL, NULL);
422 gtk_tree_view_column_set_resizable(column, TRUE);
423 //gtk_tree_view_column_add_attribute(column, renderer, "text", 1);
424 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
425 gtk_tree_view_column_set_alignment (column, 0.5);
426 gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST/2);
427 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
428
429 gtk_tree_view_column_set_fixed_width(column, PREFS->pnl_upc_col_pay_width);
430
431 /* column: Memo */
432 renderer = gtk_cell_renderer_text_new ();
433 g_object_set(renderer,
434 "ellipsize", PANGO_ELLIPSIZE_END,
435 "ellipsize-set", TRUE,
436 NULL);
437
438 column = gtk_tree_view_column_new();
439 g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_MEMO));
440 gtk_tree_view_column_set_title(column, _("Memo"));
441 gtk_tree_view_column_pack_start(column, renderer, TRUE);
442 gtk_tree_view_column_set_cell_data_func(column, renderer, memo_cell_data_function, NULL, NULL);
443 gtk_tree_view_column_set_resizable(column, TRUE);
444 //gtk_tree_view_column_add_attribute(column, renderer, "text", 2);
445 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
446 gtk_tree_view_column_set_alignment (column, 0.5);
447 gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST/2);
448 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
449
450 gtk_tree_view_column_set_fixed_width(column, PREFS->pnl_upc_col_mem_width);
451
452 /* column: Amount */
453 column = gtk_tree_view_column_new();
454 gtk_tree_view_column_set_title(column, _("Expense"));
455 renderer = gtk_cell_renderer_text_new ();
456 g_object_set(renderer, "xalign", 1.0, NULL);
457 gtk_tree_view_column_pack_start(column, renderer, TRUE);
458 gtk_tree_view_column_set_cell_data_func(column, renderer, amount_cell_data_function, GINT_TO_POINTER(-1), NULL);
459 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
460 gtk_tree_view_column_set_alignment (column, 0.5);
461 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
462
463 /* column: Amount */
464 column = gtk_tree_view_column_new();
465 gtk_tree_view_column_set_title(column, _("Income"));
466 renderer = gtk_cell_renderer_text_new ();
467 g_object_set(renderer, "xalign", 1.0, NULL);
468 gtk_tree_view_column_pack_start(column, renderer, TRUE);
469 gtk_tree_view_column_set_cell_data_func(column, renderer, amount_cell_data_function, GINT_TO_POINTER(1), NULL);
470 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPACC_NAME);
471 gtk_tree_view_column_set_alignment (column, 0.5);
472 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
473
474 /* column: Account */
475 renderer = gtk_cell_renderer_text_new ();
476 /*g_object_set(renderer,
477 "ellipsize", PANGO_ELLIPSIZE_END,
478 "ellipsize-set", TRUE,
479 NULL);*/
480
481 column = gtk_tree_view_column_new();
482 g_object_set_data(G_OBJECT(column), "uid", GUINT_TO_POINTER(COL_DSPUPC_ACCOUNT));
483 gtk_tree_view_column_set_title(column, _("Account"));
484 gtk_tree_view_column_pack_start(column, renderer, TRUE);
485 gtk_tree_view_column_set_cell_data_func(column, renderer, account_cell_data_function, NULL, NULL);
486 gtk_tree_view_column_set_resizable(column, TRUE);
487 //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE);
488 gtk_tree_view_column_set_alignment (column, 0.5);
489 //gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST);
490 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
491
492
493 /* column: empty */
494 column = gtk_tree_view_column_new();
495 gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
496
497 gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), list_account_selectionfunc, NULL, NULL);
498
499
500 /* set initial sort order */
501 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), LST_DSPUPC_NEXT, GTK_SORT_ASCENDING);
502
503
504 g_signal_connect (view, "destroy", G_CALLBACK (list_upcoming_destroy), NULL);
505
506
507 return(view);
508 }
509
This page took 0.05622 seconds and 4 git commands to generate.