1
1
/* HomeBank -- Free, easy, personal accounting for everyone.
2
* Copyright (C) 1995-2020 Maxime DOYEN
2
* Copyright (C) 1995-2021 Maxime DOYEN
4
4
* This file is part of HomeBank.
46
45
/* our global datas */
47
46
extern struct HomeBank *GLOBALS;
48
47
extern struct Preferences *PREFS;
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);
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);
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);
67
62
extern gchar *CYA_CATSUBCAT[];
88
83
repbudget_sensitive(data->window, NULL);
86
static void repbudget_action_print(GtkToolButton *toolbutton, gpointer user_data)
88
struct repbudget_data *data = user_data;
92
tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for));
93
name = g_strdup_printf("hb-repbudget_%s", CYA_CATSUBCAT[tmpfor]);
95
gtk_chart_progress_print(GTK_CHARTPROGRESS(data->RE_stack), GTK_WINDOW(data->window), PREFS->path_export, name);
92
101
/* ======================== */
325
334
tmpfor = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_for));
326
335
title = _(CYA_CATSUBCAT[tmpfor]);
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);
330
339
clipboard = gtk_clipboard_get_default(gdk_display_get_default());
331
340
gtk_clipboard_set_text(clipboard, node->str, node->len);
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");
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]);
410
419
if( ui_file_chooser_csv(GTK_WINDOW(data->window), GTK_FILE_CHOOSER_ACTION_SAVE, &filename, name) == TRUE )
598
static void repbudget_update_total(GtkWidget *widget, gpointer user_data)
600
struct repbudget_data *data;
602
DB( g_print("\n[repbudget] update total\n") );
604
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
606
GLOBALS->minor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_minor));
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);
589
616
static void repbudget_update_chart(GtkWidget *widget, gpointer user_data)
591
618
struct repbudget_data *data;
889
static void repbudget_update_total(GtkWidget *widget, gpointer user_data)
891
struct repbudget_data *data;
893
DB( g_print("\n[repbudget] update total\n") );
895
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
897
GLOBALS->minor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_minor));
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);
908
917
** update sensitivity
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);
926
936
page = gtk_tree_model_iter_n_children(gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_detail)), NULL);
954
static void repbudget_setup(struct repbudget_data *data)
956
DB( g_print("\n[repbudget] setup\n") );
958
data->txn_queue = g_queue_new ();
960
data->filter = da_flt_malloc();
961
filter_reset(data->filter);
963
data->detail = PREFS->budg_showdetail;
966
/* 3.4 : make int transfer out of stats */
967
data->filter->option[FILTER_TYPE] = 2;
968
data->filter->type = FLT_TYPE_INTXFER;
970
filter_preset_daterange_set(data->filter, PREFS->date_range_rep, 0);
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]);
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);
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]);
984
965
static void repbudget_selection(GtkTreeSelection *treeselection, gpointer user_data)
1074
1055
gtk_container_add (GTK_CONTAINER(toolitem), button);
1075
1056
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(toolitem), -1);
1058
button = hbtk_toolbar_add_toolbutton(GTK_TOOLBAR(toolbar), ICONNAME_HB_PRINT, _("Print"), _("Print"));
1059
data->BT_print = button;
1080
1061
return toolbar;
1066
static void repbudget_filter_setup(struct repbudget_data *data)
1068
DB( g_print("\n[repbudget] reset filter\n") );
1070
filter_reset(data->filter);
1072
/* 3.4 : make int transfer out of stats */
1073
data->filter->option[FLT_GRP_TYPE] = 2;
1074
data->filter->type = FLT_TYPE_INTXFER;
1076
filter_preset_daterange_set(data->filter, PREFS->date_range_rep, 0);
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]);
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);
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]);
1090
// setup default for our object/memory
1091
static void repbudget_window_setup(struct repbudget_data *data)
1093
DB( g_print("\n[repbudget] setup\n") );
1095
repbudget_filter_setup(data);
1097
data->detail = PREFS->budg_showdetail;
1088
1103
static gboolean repbudget_window_dispose(GtkWidget *widget, GdkEvent *event, gpointer user_data)
1090
1105
struct repbudget_data *data = user_data;
1133
//allocate our object/memory
1134
static void repbudget_window_acquire(struct repbudget_data *data)
1136
DB( g_print("\n[repbudget] acquire\n") );
1138
data->txn_queue = g_queue_new ();
1139
data->filter = da_flt_malloc();
1118
1143
// the window creation
1119
1144
GtkWidget *repbudget_window_new(void)
1124
1149
GtkWidget *label, *widget, *table, *entry;
1152
DB( g_print("\n[repbudget] new\n") );
1127
1155
data = g_malloc0(sizeof(struct repbudget_data));
1128
1156
if(!data) return NULL;
1130
DB( g_print("\n[repbudget] new\n") );
1158
repbudget_window_acquire(data);
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
1413
1442
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
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)
1418
1447
GtkTreeModel *model;
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,
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,
1559
static GtkTreeViewColumn *amount_list_budget_column(gchar *name, gint id)
1588
static GtkTreeViewColumn *lst_repbud_column_create_amount(gchar *name, gint id)
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);
1616
1645
gtk_tree_view_append_column (GTK_TREE_VIEW(view), column);
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);
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);
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);
1634
1663
/* column last: empty */