~mdoyen/homebank/5.5.x

« back to all changes in this revision

Viewing changes to src/rep-budget.c

  • Committer: Maxime Doyen
  • Date: 2021-02-06 14:26:12 UTC
  • Revision ID: homebank@free.fr-20210206142612-77n8fmdcjxvrek89
5.5 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*  HomeBank -- Free, easy, personal accounting for everyone.
2
 
 *  Copyright (C) 1995-2020 Maxime DOYEN
 
2
 *  Copyright (C) 1995-2021 Maxime DOYEN
3
3
 *
4
4
 *  This file is part of HomeBank.
5
5
 *
42
42
#endif
43
43
 
44
44
 
45
 
 
46
45
/* our global datas */
47
46
extern struct HomeBank *GLOBALS;
48
47
extern struct Preferences *PREFS;
49
48
 
50
49
 
51
 
static void repbudget_date_change(GtkWidget *widget, gpointer user_data);
52
 
static void repbudget_range_change(GtkWidget *widget, gpointer user_data);
53
 
static void repbudget_toggle_detail(GtkWidget *widget, gpointer user_data);
54
 
static void repbudget_detail(GtkWidget *widget, gpointer user_data);
 
50
/* prototypes */
55
51
static void repbudget_compute(GtkWidget *widget, gpointer user_data);
56
 
static void repbudget_update_total(GtkWidget *widget, gpointer user_data);
57
52
static void repbudget_sensitive(GtkWidget *widget, gpointer user_data);
58
 
static void repbudget_toggle(GtkWidget *widget, gpointer user_data);
59
 
static GtkWidget *create_list_budget(void);
60
 
static void repbudget_update_detail(GtkWidget *widget, gpointer user_data);
61
53
static void repbudget_update_daterange(GtkWidget *widget, gpointer user_data);
62
54
static void repbudget_update_chart(GtkWidget *widget, gpointer user_data);
 
55
static void repbudget_update_detail(GtkWidget *widget, gpointer user_data);
 
56
static void repbudget_detail(GtkWidget *widget, gpointer user_data);
63
57
 
64
 
static GString *ui_list_repbudget_to_string(GtkTreeView *treeview, gchar *title, gboolean clipboard);
 
58
static GtkWidget *lst_repbud_create(void);
 
59
static GString *lst_repbud_to_string(GtkTreeView *treeview, gchar *title, gboolean clipboard);
65
60
 
66
61
 
67
62
extern gchar *CYA_CATSUBCAT[];
88
83
        repbudget_sensitive(data->window, NULL);
89
84
}
90
85
 
 
86
static void repbudget_action_print(GtkToolButton *toolbutton, gpointer user_data)
 
87
{
 
88
struct repbudget_data *data = user_data;
 
89
gint tmpfor;
 
90
gchar *name;
 
91
 
 
92
        tmpfor  = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for));
 
93
        name = g_strdup_printf("hb-repbudget_%s", CYA_CATSUBCAT[tmpfor]);
 
94
 
 
95
        gtk_chart_progress_print(GTK_CHARTPROGRESS(data->RE_stack), GTK_WINDOW(data->window), PREFS->path_export, name);
 
96
 
 
97
        g_free(name);
 
98
}
 
99
 
91
100
 
92
101
/* ======================== */
93
102
 
325
334
        tmpfor     = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for));
326
335
        title = _(CYA_CATSUBCAT[tmpfor]);
327
336
        
328
 
        node = ui_list_repbudget_to_string(GTK_TREE_VIEW(data->LV_report), title, TRUE);
 
337
        node = lst_repbud_to_string(GTK_TREE_VIEW(data->LV_report), title, TRUE);
329
338
 
330
339
        clipboard = gtk_clipboard_get_default(gdk_display_get_default());
331
340
        gtk_clipboard_set_text(clipboard, node->str, node->len);
359
368
                if(io != NULL)
360
369
                {
361
370
                        title = _(CYA_CATSUBCAT[tmpfor]);
362
 
                        node = ui_list_repbudget_to_string(GTK_TREE_VIEW(data->LV_report), title, FALSE);
 
371
                        node = lst_repbud_to_string(GTK_TREE_VIEW(data->LV_report), title, FALSE);
363
372
                        g_io_channel_write_chars(io, node->str, -1, NULL, NULL);
364
373
                        g_io_channel_unref (io);
365
374
                        g_string_free(node, TRUE);
405
414
        //data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
406
415
 
407
416
        tmpfor  = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for));
408
 
        name = g_strdup_printf("hb-repstat-detail_%s.csv", CYA_CATSUBCAT[tmpfor]);
 
417
        name = g_strdup_printf("hb-repbudget-detail_%s.csv", CYA_CATSUBCAT[tmpfor]);
409
418
 
410
419
        if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE )
411
420
        {
586
595
}
587
596
 
588
597
 
 
598
static void repbudget_update_total(GtkWidget *widget, gpointer user_data)
 
599
{
 
600
struct repbudget_data *data;
 
601
 
 
602
        DB( g_print("\n[repbudget] update total\n") );
 
603
 
 
604
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
 
605
 
 
606
        GLOBALS->minor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_minor));
 
607
 
 
608
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[0]), data->total_spent, GLOBALS->kcur, GLOBALS->minor);
 
609
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[1]), data->total_budget, GLOBALS->kcur, GLOBALS->minor);
 
610
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[2]), budget_compute_result(data->total_budget, data->total_spent), GLOBALS->kcur, GLOBALS->minor);
 
611
        
 
612
 
 
613
}
 
614
 
 
615
 
589
616
static void repbudget_update_chart(GtkWidget *widget, gpointer user_data)
590
617
{
591
618
struct repbudget_data *data;
886
913
}
887
914
 
888
915
 
889
 
static void repbudget_update_total(GtkWidget *widget, gpointer user_data)
890
 
{
891
 
struct repbudget_data *data;
892
 
 
893
 
        DB( g_print("\n[repbudget] update total\n") );
894
 
 
895
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
896
 
 
897
 
        GLOBALS->minor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_minor));
898
 
 
899
 
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[0]), data->total_spent, GLOBALS->kcur, GLOBALS->minor);
900
 
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[1]), data->total_budget, GLOBALS->kcur, GLOBALS->minor);
901
 
        hb_label_set_colvalue(GTK_LABEL(data->TX_total[2]), budget_compute_result(data->total_budget, data->total_spent), GLOBALS->kcur, GLOBALS->minor);
902
 
        
903
 
 
904
 
}
905
 
 
906
 
 
907
916
/*
908
917
** update sensitivity
909
918
*/
922
931
        visible = (page == 0) ? TRUE : FALSE;
923
932
        hb_widget_visible (data->BT_detail, visible);
924
933
        hb_widget_visible (data->BT_export, visible);
 
934
        hb_widget_visible (data->BT_print, !visible);
925
935
 
926
936
        page = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_detail)), NULL);
927
937
 
951
961
 
952
962
}
953
963
 
954
 
static void repbudget_setup(struct repbudget_data *data)
955
 
{
956
 
        DB( g_print("\n[repbudget] setup\n") );
957
 
 
958
 
        data->txn_queue = g_queue_new ();
959
 
 
960
 
        data->filter = da_flt_malloc();
961
 
        filter_reset(data->filter);
962
 
 
963
 
        data->detail = PREFS->budg_showdetail;
964
 
        data->legend = 1;
965
 
 
966
 
        /* 3.4 : make int transfer out of stats */
967
 
        data->filter->option[FILTER_TYPE] = 2;
968
 
        data->filter->type = FLT_TYPE_INTXFER;
969
 
 
970
 
        filter_preset_daterange_set(data->filter, PREFS->date_range_rep, 0);
971
 
        
972
 
        g_signal_handler_block(data->PO_mindate, data->handler_id[HID_REPBUDGET_MINDATE]);
973
 
        g_signal_handler_block(data->PO_maxdate, data->handler_id[HID_REPBUDGET_MAXDATE]);
974
 
 
975
 
        gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_mindate), data->filter->mindate);
976
 
        gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_maxdate), data->filter->maxdate);
977
 
 
978
 
        g_signal_handler_unblock(data->PO_mindate, data->handler_id[HID_REPBUDGET_MINDATE]);
979
 
        g_signal_handler_unblock(data->PO_maxdate, data->handler_id[HID_REPBUDGET_MAXDATE]);
980
 
 
981
 
}
982
 
 
983
964
 
984
965
static void repbudget_selection(GtkTreeSelection *treeselection, gpointer user_data)
985
966
{
1074
1055
        gtk_container_add (GTK_CONTAINER(toolitem), button);
1075
1056
        gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(toolitem), -1);
1076
1057
 
1077
 
        
1078
 
        
1079
 
        
 
1058
        button = hbtk_toolbar_add_toolbutton(GTK_TOOLBAR(toolbar), ICONNAME_HB_PRINT, _("Print"), _("Print"));
 
1059
        data->BT_print = button;
 
1060
 
1080
1061
        return toolbar;
1081
1062
}
1082
1063
 
1083
1064
 
1084
 
 
1085
 
/*
1086
 
**
1087
 
*/
 
1065
//reset the filter
 
1066
static void repbudget_filter_setup(struct repbudget_data *data)
 
1067
{
 
1068
        DB( g_print("\n[repbudget] reset filter\n") );
 
1069
 
 
1070
        filter_reset(data->filter);
 
1071
 
 
1072
        /* 3.4 : make int transfer out of stats */
 
1073
        data->filter->option[FLT_GRP_TYPE] = 2;
 
1074
        data->filter->type = FLT_TYPE_INTXFER;
 
1075
 
 
1076
        filter_preset_daterange_set(data->filter, PREFS->date_range_rep, 0);
 
1077
        
 
1078
        g_signal_handler_block(data->PO_mindate, data->handler_id[HID_REPBUDGET_MINDATE]);
 
1079
        g_signal_handler_block(data->PO_maxdate, data->handler_id[HID_REPBUDGET_MAXDATE]);
 
1080
 
 
1081
        gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_mindate), data->filter->mindate);
 
1082
        gtk_date_entry_set_date(GTK_DATE_ENTRY(data->PO_maxdate), data->filter->maxdate);
 
1083
 
 
1084
        g_signal_handler_unblock(data->PO_mindate, data->handler_id[HID_REPBUDGET_MINDATE]);
 
1085
        g_signal_handler_unblock(data->PO_maxdate, data->handler_id[HID_REPBUDGET_MAXDATE]);
 
1086
 
 
1087
}
 
1088
 
 
1089
 
 
1090
// setup default for our object/memory
 
1091
static void repbudget_window_setup(struct repbudget_data *data)
 
1092
{
 
1093
        DB( g_print("\n[repbudget] setup\n") );
 
1094
 
 
1095
        repbudget_filter_setup(data);
 
1096
 
 
1097
        data->detail = PREFS->budg_showdetail;
 
1098
        data->legend = 1;
 
1099
 
 
1100
}
 
1101
 
 
1102
 
1088
1103
static gboolean repbudget_window_dispose(GtkWidget *widget, GdkEvent *event, gpointer user_data)
1089
1104
{
1090
1105
struct repbudget_data *data = user_data;
1115
1130
}
1116
1131
 
1117
1132
 
 
1133
//allocate our object/memory
 
1134
static void repbudget_window_acquire(struct repbudget_data *data)
 
1135
{
 
1136
        DB( g_print("\n[repbudget] acquire\n") );
 
1137
 
 
1138
        data->txn_queue = g_queue_new ();
 
1139
        data->filter = da_flt_malloc();
 
1140
}
 
1141
 
 
1142
 
1118
1143
// the window creation
1119
1144
GtkWidget *repbudget_window_new(void)
1120
1145
{
1124
1149
GtkWidget *label, *widget, *table, *entry;
1125
1150
gint row;
1126
1151
 
 
1152
        DB( g_print("\n[repbudget] new\n") );
 
1153
 
 
1154
 
1127
1155
        data = g_malloc0(sizeof(struct repbudget_data));
1128
1156
        if(!data) return NULL;
1129
1157
 
1130
 
        DB( g_print("\n[repbudget] new\n") );
 
1158
        repbudget_window_acquire(data);
1131
1159
 
1132
1160
        //disable define windows
1133
1161
        GLOBALS->define_off++;
1276
1304
        widget = gtk_scrolled_window_new (NULL, NULL);
1277
1305
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (widget), GTK_SHADOW_ETCHED_IN);
1278
1306
        gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1279
 
        treeview = create_list_budget();
 
1307
        treeview = lst_repbud_create();
1280
1308
        data->LV_report = treeview;
1281
1309
        gtk_container_add (GTK_CONTAINER(widget), treeview);
1282
1310
    gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
1325
1353
        g_signal_connect (G_OBJECT (data->BT_stack), "clicked", G_CALLBACK (repbudget_action_viewstack), (gpointer)data);
1326
1354
        g_signal_connect (G_OBJECT (data->BT_detail), "clicked", G_CALLBACK (repbudget_toggle_detail), (gpointer)data);
1327
1355
        g_signal_connect (G_OBJECT (data->BT_refresh), "clicked", G_CALLBACK (repbudget_compute), (gpointer)data);
 
1356
        g_signal_connect (G_OBJECT (data->BT_print), "clicked", G_CALLBACK (repbudget_action_print), (gpointer)data);
1328
1357
        //export is a menu
1329
1358
 
1330
1359
 
1335
1364
 
1336
1365
 
1337
1366
        //setup, init and show window
1338
 
        repbudget_setup(data);
 
1367
        repbudget_window_setup(data);
1339
1368
 
1340
1369
 
1341
1370
        /* toolbar */
1412
1441
 
1413
1442
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1414
1443
 
1415
 
static GString *ui_list_repbudget_to_string(GtkTreeView *treeview, gchar *title, gboolean clipboard)
 
1444
static GString *lst_repbud_to_string(GtkTreeView *treeview, gchar *title, gboolean clipboard)
1416
1445
{
1417
1446
GString *node;
1418
1447
GtkTreeModel *model;
1486
1515
}*/
1487
1516
 
1488
1517
 
1489
 
static void budget_amount_cell_data_function (GtkTreeViewColumn *col,
 
1518
static void lst_repbud_cell_data_function_amount (GtkTreeViewColumn *col,
1490
1519
                           GtkCellRenderer   *renderer,
1491
1520
                           GtkTreeModel      *model,
1492
1521
                           GtkTreeIter       *iter,
1521
1550
 
1522
1551
 
1523
1552
 
1524
 
static void budget_result_cell_data_function (GtkTreeViewColumn *col,
 
1553
static void lst_repbud_cell_data_function_result (GtkTreeViewColumn *col,
1525
1554
                           GtkCellRenderer   *renderer,
1526
1555
                           GtkTreeModel      *model,
1527
1556
                           GtkTreeIter       *iter,
1556
1585
 
1557
1586
 
1558
1587
 
1559
 
static GtkTreeViewColumn *amount_list_budget_column(gchar *name, gint id)
 
1588
static GtkTreeViewColumn *lst_repbud_column_create_amount(gchar *name, gint id)
1560
1589
{
1561
1590
GtkTreeViewColumn  *column;
1562
1591
GtkCellRenderer    *renderer;
1566
1595
        renderer = gtk_cell_renderer_text_new ();
1567
1596
        g_object_set(renderer, "xalign", 1.0, NULL);
1568
1597
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
1569
 
        gtk_tree_view_column_set_cell_data_func(column, renderer, budget_amount_cell_data_function, GINT_TO_POINTER(id), NULL);
 
1598
        gtk_tree_view_column_set_cell_data_func(column, renderer, lst_repbud_cell_data_function_amount, GINT_TO_POINTER(id), NULL);
1570
1599
        gtk_tree_view_column_set_alignment (column, 0.5);
1571
1600
        gtk_tree_view_column_set_sort_column_id (column, id);
1572
1601
        return column;
1575
1604
/*
1576
1605
** create our statistic list
1577
1606
*/
1578
 
static GtkWidget *create_list_budget(void)
 
1607
static GtkWidget *lst_repbud_create(void)
1579
1608
{
1580
1609
GtkListStore *store;
1581
1610
GtkWidget *view;
1616
1645
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
1617
1646
 
1618
1647
        /* column: Expense */
1619
 
        column = amount_list_budget_column(_("Spent"), LST_BUDGET_SPENT);
 
1648
        column = lst_repbud_column_create_amount(_("Spent"), LST_BUDGET_SPENT);
1620
1649
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
1621
1650
 
1622
1651
        /* column: Income */
1623
 
        column = amount_list_budget_column(_("Budget"), LST_BUDGET_BUDGET);
 
1652
        column = lst_repbud_column_create_amount(_("Budget"), LST_BUDGET_BUDGET);
1624
1653
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
1625
1654
 
1626
1655
        /* column: Result */
1627
 
        column = amount_list_budget_column(_("Result"), LST_BUDGET_RESULT);
 
1656
        column = lst_repbud_column_create_amount(_("Result"), LST_BUDGET_RESULT);
1628
1657
        renderer = gtk_cell_renderer_text_new ();
1629
1658
        //g_object_set(renderer, "xalign", 0.0, NULL);
1630
1659
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
1631
 
        gtk_tree_view_column_set_cell_data_func(column, renderer, budget_result_cell_data_function, GINT_TO_POINTER(LST_BUDGET_RESULT), NULL);
 
1660
        gtk_tree_view_column_set_cell_data_func(column, renderer, lst_repbud_cell_data_function_result, GINT_TO_POINTER(LST_BUDGET_RESULT), NULL);
1632
1661
        gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
1633
1662
 
1634
1663
  /* column last: empty */