1216
#define MAX_TOPSPENDING 10
1219
static gint tmptop_compare_func(struct tmptop *tt1, struct tmptop *tt2)
1221
return tt1->value > tt2->value ? 1 : -1;
1225
static void ui_panel_topspending_update(GtkWidget *widget, gpointer user_data)
1227
struct hbfile_data *data;
1228
GtkTreeModel *model;
1230
gchar strbuffer[G_ASCII_DTOSTR_BUF_SIZE];
1232
DB( g_print("\n[ui-mainwindow] topspending_update\n") );
1234
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1236
hb_strfmon(strbuffer, G_ASCII_DTOSTR_BUF_SIZE-1, data->toptotal, GLOBALS->kcur, GLOBALS->minor);
1237
//hb_label_set_amount(GTK_LABEL(data->TX_topamount), total, GLOBALS->kcur, GLOBALS->minor);
1238
title = g_strdup_printf("%s %s", _("Top spending"), strbuffer);
1240
model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_top));
1242
gtk_chart_set_color_scheme(GTK_CHART(data->RE_pie), PREFS->report_color_scheme);
1243
gtk_chart_set_currency(GTK_CHART(data->RE_pie), GLOBALS->kcur);
1244
gtk_chart_set_datas(GTK_CHART(data->RE_pie), model, LST_TOPSPEND_AMOUNT, title, NULL);
1249
gchar *fu = _("Top %d spending"); title = fu;
1253
static void ui_mainwindow_populate_topspending(GtkWidget *widget, gpointer user_data)
1255
struct hbfile_data *data;
1256
GtkTreeModel *model;
1260
guint n_result, i, n_items;
1262
gdouble total, other;
1266
DB( g_print("\n[ui-mainwindow] populate_topspending\n") );
1268
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1270
type = hbtk_radio_get_active(GTK_CONTAINER(data->RA_type));
1271
range = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_range));
1273
DB( g_print(" - type=%d, range=%d\n", type, range) );
1274
DB( g_print(" - pref range=%d\n", PREFS->date_range_wal) );
1276
if(range == FLT_RANGE_OTHER)
1279
filter_preset_daterange_set(data->filter, range, 0);
1282
n_result = da_cat_get_max_key() + 1;
1285
DB( g_print(" - max key is %d\n", n_result) );
1287
/* allocate some memory */
1288
garray = g_array_sized_new(FALSE, FALSE, sizeof(struct tmptop), n_result);
1292
struct tmptop zero = { .key=0, .value=0.0 };
1295
//DB( g_print(" - array length=%d\n", garray->len) );
1297
for(i=0 ; i<n_result ; i++)
1299
g_array_append_vals(garray, &zero, 1);
1300
//g_array_insert_vals(garray, i, &zero, 1);
1302
//struct tmptop *tt = &g_array_index (garray, struct tmptop, i);
1303
//DB( g_print("%4d, %4d %f\n", i, tt->key, tt->value) );
1306
//DB( g_print("\n - end array length=%d\n", garray->len) );
1308
//todo: not ideal, has ot force to get_acc for each txn below
1309
txn_queue = hbfile_transaction_get_partial(data->filter->mindate, data->filter->maxdate);
1311
/* compute the results */
1312
list = g_queue_peek_head_link(txn_queue);
1313
while (list != NULL)
1315
Transaction *ope = list->data;
1317
//DB( g_print(" - eval txn: '%s', cat=%d ==> flt-test=%d\n", ope->memo, ope->kcat, filter_txn_match(data->filter, ope)) );
1319
if( !(ope->paymode == PAYMODE_INTXFER) )
1324
//todo: optimize here
1325
trn_amount = ope->amount;
1326
acc = da_acc_get(ope->kacc);
1328
trn_amount = hb_amount_base(ope->amount, acc->kcur);
1330
if( ope->flags & OF_SPLIT )
1332
guint nbsplit = da_splits_length(ope->splits);
1334
struct tmptop *item;
1336
for(i=0;i<nbsplit;i++)
1338
split = da_splits_get(ope->splits, i);
1339
pos = category_report_id(split->kcat, type);
1340
if( pos <= garray->len )
1342
trn_amount = hb_amount_base(split->amount, acc->kcur);
1343
//trn_amount = split->amount;
1344
//#1297054 if( trn_amount < 0 ) {
1345
item = &g_array_index (garray, struct tmptop, pos);
1347
item->value += trn_amount;
1348
//DB( g_print(" - stored %.2f to item %d\n", trn_amount, pos) );
1355
struct tmptop *item;
1357
pos = category_report_id(ope->kcat, type);
1358
if( pos <= garray->len )
1360
//#1297054 if( trn_amount < 0 ) {
1361
item = &g_array_index (garray, struct tmptop, pos);
1363
item->value += trn_amount;
1364
//DB( g_print(" - stored %.2f to item %d\n", trn_amount, pos) );
1371
list = g_list_next(list);
1374
g_queue_free (txn_queue);
1376
// we need to sort this and limit before
1377
g_array_sort(garray, (GCompareFunc)tmptop_compare_func);
1379
n_items = MIN(garray->len,MAX_TOPSPENDING);
1381
for(i=0 ; i<garray->len ; i++)
1383
struct tmptop *item;
1385
item = &g_array_index (garray, struct tmptop, i);
1388
total += item->value;
1391
other += item->value;
1393
DB( g_print(" - %d : k='%d' v='%f' t='%f'\n", i, item->key, item->value, total) );
1398
model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_top));
1399
gtk_list_store_clear (GTK_LIST_STORE(model));
1400
g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */
1401
gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_top), NULL); /* Detach model from view */
1403
/* insert into the treeview */
1404
for(i=0 ; i<MIN(garray->len,MAX_TOPSPENDING) ; i++)
1408
struct tmptop *item;
1411
item = &g_array_index (garray, struct tmptop, i);
1413
if(!item->value) continue;
1414
//#1767659 top spending should restrict to... spending
1417
value = hb_amount_round(item->value, 2);
1418
entry = da_cat_get(item->key);
1419
if(entry == NULL) continue;
1421
name = da_cat_get_name (entry);
1424
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1425
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1427
LST_TOPSPEND_KEY, 0,
1428
LST_TOPSPEND_NAME, name,
1429
LST_TOPSPEND_AMOUNT, value,
1430
//LST_TOPSPEND_RATE, (gint)(((ABS(value)*100)/ABS(total)) + 0.5),
1438
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1439
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1440
LST_TOPSPEND_ID, n_items,
1441
LST_TOPSPEND_KEY, 0,
1442
LST_TOPSPEND_NAME, _("Other"),
1443
LST_TOPSPEND_AMOUNT, other,
1444
//LST_TOPSPEND_RATE, (gint)(((ABS(other)*100)/ABS(total)) + 0.5),
1448
/* Re-attach model to view */
1449
gtk_tree_view_set_model(GTK_TREE_VIEW(data->LV_top), model);
1450
g_object_unref(model);
1453
// update chart and widgets
1457
data->toptotal = total;
1458
ui_panel_topspending_update(widget, data);
1460
daterange = filter_daterange_text_get(data->filter);
1461
gtk_widget_set_tooltip_markup(GTK_WIDGET(data->CY_range), daterange);
1466
/* free our memory */
1467
g_array_free (garray, TRUE);
1472
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1474
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
1476
ui_mainwindow_scheduled_get_selected_item(GtkTreeView *treeview)
1478
GtkTreeSelection *treeselection;
1479
GtkTreeModel *model;
1482
treeselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
1483
if( gtk_tree_selection_get_selected(treeselection, &model, &iter) )
1487
gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, LST_DSPUPC_DATAS, &arc, -1);
1495
static void ui_mainwindow_scheduled_onRowActivated (GtkTreeView *treeview,
1497
GtkTreeViewColumn *col,
1500
//struct hbfile_data *data;
1503
DB( g_print ("\n[ui-mainwindow] A scheduled row has been double-clicked!\n") );
1505
//data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(treeview, GTK_TYPE_WINDOW)), "inst_data");
1507
arc = ui_mainwindow_scheduled_get_selected_item(treeview);
1508
ui_mainwindow_defarchive(arc);
1512
static void ui_mainwindow_scheduled_do_post(Archive *arc, gboolean doedit, gpointer user_data)
1514
struct hbfile_data *data = user_data;
1519
window = create_deftransaction_window(GTK_WINDOW(data->window), TRANSACTION_EDIT_ADD, TRUE, 0);
1521
/* fill in the transaction */
1522
txn = da_transaction_malloc();
1523
da_transaction_init_from_template(txn, arc);
1524
txn->date = scheduled_get_postdate(arc, arc->nextdate);
1526
deftransaction_set_transaction(window, txn);
1528
result = gtk_dialog_run (GTK_DIALOG (window));
1530
DB( g_print(" - dialog result is %d\n", result) );
1532
if(result == HB_RESPONSE_ADD || result == GTK_RESPONSE_ACCEPT)
1534
deftransaction_get(window, NULL);
1535
transaction_add(GTK_WINDOW(GLOBALS->mainwindow), txn);
1536
GLOBALS->changes_count++;
1538
scheduled_date_advance(arc);
1540
DB( g_print(" - added 1 transaction to %d\n", txn->kacc) );
1543
da_transaction_free(txn);
1545
deftransaction_dispose(window, NULL);
1546
gtk_widget_destroy (window);
1551
static void ui_mainwindow_scheduled_editpost_cb(GtkWidget *widget, gpointer user_data)
1553
struct hbfile_data *data = user_data;
1555
Archive *arc = ui_mainwindow_scheduled_get_selected_item(GTK_TREE_VIEW(data->LV_upc));
1559
ui_mainwindow_scheduled_do_post(arc, TRUE, data);
1560
ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_SENSITIVE|UF_REFRESHALL));
1565
static void ui_mainwindow_scheduled_post_cb(GtkWidget *widget, gpointer user_data)
1567
struct hbfile_data *data = user_data;
1569
DB( g_print("\n[ui-mainwindow] scheduled post\n") );
1571
Archive *arc = ui_mainwindow_scheduled_get_selected_item(GTK_TREE_VIEW(data->LV_upc));
1575
if( scheduled_is_postable(arc) )
1577
Transaction *txn = da_transaction_malloc ();
1579
da_transaction_init_from_template(txn, arc);
1580
txn->date = scheduled_get_postdate(arc, arc->nextdate);
1581
transaction_add(GTK_WINDOW(GLOBALS->mainwindow), txn);
1583
GLOBALS->changes_count++;
1584
scheduled_date_advance(arc);
1586
da_transaction_free (txn);
1590
ui_mainwindow_scheduled_do_post(arc, FALSE, data);
1593
ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_SENSITIVE|UF_REFRESHALL));
1598
static void ui_mainwindow_scheduled_skip_cb(GtkWidget *widget, gpointer user_data)
1600
struct hbfile_data *data = user_data;
1602
Archive *arc = ui_mainwindow_scheduled_get_selected_item(GTK_TREE_VIEW(data->LV_upc));
1603
if( (arc != NULL) && (arc->flags & OF_AUTO) )
1605
GLOBALS->changes_count++;
1606
scheduled_date_advance(arc);
1608
ui_mainwindow_scheduled_populate(GLOBALS->mainwindow, NULL);
1609
ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_SENSITIVE));
1615
static void ui_mainwindow_scheduled_update(GtkWidget *widget, gpointer user_data)
1617
struct hbfile_data *data;
1620
DB( g_print("\n[ui-mainwindow] scheduled update\n") );
1622
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1624
//filter = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_sched_filter));
1626
Archive *arc = ui_mainwindow_scheduled_get_selected_item(GTK_TREE_VIEW(data->LV_upc));
1630
DB( g_print("archive is %s\n", arc->memo) );
1632
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_skip), TRUE);
1633
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_post), TRUE);
1634
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_editpost), TRUE);
1638
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_skip), FALSE);
1639
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_post), FALSE);
1640
gtk_widget_set_sensitive(GTK_WIDGET(data->BT_sched_editpost), FALSE);
1647
static void ui_mainwindow_scheduled_selection_cb(GtkTreeSelection *treeselection, gpointer user_data)
1651
ui_mainwindow_scheduled_update(GTK_WIDGET(gtk_tree_selection_get_tree_view (treeselection)), GINT_TO_POINTER(UF_SENSITIVE));
1657
** called after load, importamiga, on demand
1659
void ui_mainwindow_scheduled_postall(GtkWidget *widget, gpointer user_data)
1661
//struct hbfile_data *data;
1663
gint usermode = GPOINTER_TO_INT(user_data);
1665
DB( g_print("\n[ui-mainwindow] check scheduled\n") );
1667
//data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1669
count = scheduled_post_all_pending();
1672
if(usermode == TRUE)
1679
ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_REFRESHALL));
1683
txt = _("No transaction to add");
1685
txt = _("transaction added: %d");
1687
ui_dialog_msg_infoerror(GTK_WINDOW(GLOBALS->mainwindow), GTK_MESSAGE_INFO,
1688
_("Check scheduled transactions result"),
1696
static void ui_mainwindow_scheduled_populate(GtkWidget *widget, gpointer user_data)
1698
struct hbfile_data *data;
1699
GtkTreeModel *model;
1706
guint32 maxpostdate;
1710
DB( g_print("\n[ui-mainwindow] scheduled populate list\n") );
1712
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
1714
model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_upc));
1715
gtk_list_store_clear (GTK_LIST_STORE(model));
1717
homebank_app_date_get_julian();
1719
maxpostdate = scheduled_date_get_post_max();
1721
date = g_date_new_julian (maxpostdate);
1722
g_date_strftime (buffer, 256-1, PREFS->date_format, date);
1725
gtk_label_set_text(GTK_LABEL(data->LB_maxpostdate), buffer);
1728
list = g_list_first(GLOBALS->arc_list);
1729
while (list != NULL)
1731
Archive *arc = list->data;
1734
guint nbdays, nblate;
1736
if((arc->flags & OF_AUTO) ) //&& arc->kacc > 0)
1739
nbdays = arc->nextdate - maxpostdate;
1740
nblate = scheduled_get_latepost_count(arc, GLOBALS->today);
1742
DB( g_print(" - append '%s' : %d\n", arc->memo, nbdays) );
1744
if(arc->flags & OF_INCOME)
1755
/* insert normal txn */
1756
acc = da_acc_get(arc->kacc);
1759
totinc += hb_amount_base(inc, acc->kcur);
1760
totexp += hb_amount_base(exp, acc->kcur);
1762
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1763
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1764
LST_DSPUPC_DATAS, arc,
1765
LST_DSPUPC_NEXT, nbdays,
1766
LST_DSPUPC_ACCOUNT, acc,
1767
LST_DSPUPC_MEMO, arc->memo,
1768
LST_DSPUPC_EXPENSE, exp,
1769
LST_DSPUPC_INCOME, inc,
1770
LST_DSPUPC_NB_LATE, nblate,
1773
/* insert internal xfer txn : 1378836 */
1774
if(arc->paymode == PAYMODE_INTXFER)
1776
acc = da_acc_get(arc->kxferacc);
1779
totinc += hb_amount_base(-inc, acc->kcur);
1780
totexp += hb_amount_base(-exp, acc->kcur);
1782
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1783
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1784
LST_DSPUPC_DATAS, arc,
1785
LST_DSPUPC_NEXT, nbdays,
1786
LST_DSPUPC_ACCOUNT, acc,
1787
LST_DSPUPC_MEMO, arc->memo,
1788
LST_DSPUPC_EXPENSE, -inc,
1789
LST_DSPUPC_INCOME, -exp,
1790
LST_DSPUPC_NB_LATE, nblate,
1795
list = g_list_next(list);
1801
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
1802
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
1803
LST_DSPUPC_DATAS, NULL,
1804
LST_DSPUPC_ACCOUNT, NULL,
1805
LST_DSPUPC_MEMO, _("Total"),
1806
LST_DSPUPC_EXPENSE, totexp,
1807
LST_DSPUPC_INCOME, totinc,
1811
ui_mainwindow_scheduled_update(widget, NULL);
1816
1198
gboolean ui_mainwindow_open_backup_check_confirm(gchar *filepath)
2048
static void ui_panel_accounts_expand_all(GtkWidget *widget, gpointer user_data)
2050
struct hbfile_data *data;
2052
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
2053
gtk_tree_view_expand_all(GTK_TREE_VIEW(data->LV_acc));
2057
static void ui_panel_accounts_collapse_all(GtkWidget *widget, gpointer user_data)
2059
struct hbfile_data *data;
2061
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
2062
gtk_tree_view_collapse_all(GTK_TREE_VIEW(data->LV_acc));
2066
static void ui_panel_accounts_groups_free(GHashTable *h_group)
2068
GHashTableIter grp_iter;
2069
gpointer key, value;
2071
DB( g_print("\n free h_group\n") );
2073
g_hash_table_iter_init (&grp_iter, h_group);
2074
while (g_hash_table_iter_next (&grp_iter, &key, &value))
2076
PnlAccGrp *group = value;
2078
g_ptr_array_free (group->acclist, TRUE);
2082
g_hash_table_destroy (h_group);
2086
static GHashTable *ui_panel_accounts_groups_get(GtkTreeView *treeview, gint groupby, gboolean showall)
2088
GHashTable *h_group;
2093
DB( g_print("\n[ui-mainwindow] accounts_groups_get\n") );
2095
nballoc = da_acc_length ();
2097
DB( g_print(" %d accounts\n", nballoc) );
2099
h_group = g_hash_table_new_full(g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL);
2101
lacc = g_hash_table_get_values(GLOBALS->h_acc);
2102
elt = g_list_first(lacc);
2105
Account *acc = elt->data;
2108
//#1674045 ony rely on nosummary
2109
//if( showall || !(acc->flags & (AF_CLOSED|AF_NOSUMMARY)) )
2110
if( showall || !(acc->flags & AF_NOSUMMARY) )
2114
case DSPACC_GROUP_BY_BANK:
2116
groupname = _("(no institution)");
2117
if( (acc->bankname != NULL) && strlen(acc->bankname) > 0 )
2118
groupname = acc->bankname;
2123
//pre 5.1.3 historical by type display
2124
groupname = hbtk_get_label(CYA_ACC_TYPE, acc->type);
2128
if( g_hash_table_contains(h_group, groupname) == FALSE )
2130
group = g_malloc0(sizeof(PnlAccGrp));
2133
group->acclist = g_ptr_array_sized_new(nballoc);
2134
group->expanded = list_account_level1_expanded(treeview, groupname);
2135
g_hash_table_insert(h_group, g_strdup(groupname), group );
2136
DB( g_print(" grp '%s' exp:%d\n", groupname, group->expanded) );
2140
group = g_hash_table_lookup(h_group, groupname);
2143
g_ptr_array_add(group->acclist, (gpointer)acc);
2144
DB( g_print(" + acc '%s'\n", acc->name) );
2147
elt = g_list_next(elt);
2156
void ui_mainwindow_populate_accounts(GtkWidget *widget, gpointer user_data)
2158
struct hbfile_data *data;
2159
GtkTreeModel *model;
2160
GtkTreeIter iter1, child_iter;
2163
gdouble gtbank, gttoday, gtfuture;
2164
GHashTable *h_group;
2165
GHashTableIter grp_iter;
2166
gpointer key, value;
2168
DB( g_print("\n[ui-mainwindow] populate accounts\n") );
2170
data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
2171
h_group = ui_panel_accounts_groups_get(GTK_TREE_VIEW(data->LV_acc), PREFS->pnl_acc_show_by, data->showall);
2173
DB( g_print("\n\n populate listview, %d group(s)\n", g_hash_table_size(h_group)) );
2176
gtbank = gttoday = gtfuture = 0;
2177
model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_acc));
2178
gtk_tree_store_clear (GTK_TREE_STORE(model));
2180
g_hash_table_iter_init (&grp_iter, h_group);
2181
while (g_hash_table_iter_next (&grp_iter, &key, &value))
2183
PnlAccGrp *group = value;
2184
gdouble tbank, ttoday, tfuture;
2190
//1: Header: Bank, Cash, ...
2191
DB( g_print(" g '%s'\n", (gchar *)key) );
2193
//#1663399 keep type position like in dropdown
2195
if( PREFS->pnl_acc_show_by == DSPACC_GROUP_BY_TYPE )
2199
while(CYA_ACC_TYPE[t].name != NULL && t < 32)
2201
if( !strcmp(CYA_ACC_TYPE[t].name, key) )
2209
gtk_tree_store_append (GTK_TREE_STORE(model), &iter1, NULL);
2210
gtk_tree_store_set (GTK_TREE_STORE(model), &iter1,
2211
LST_DSPACC_POS, position,
2212
LST_DSPACC_DATATYPE, DSPACC_TYPE_HEADER,
2213
LST_DSPACC_NAME, key,
2216
//2: Accounts for real
2217
tbank = ttoday = tfuture = 0;
2218
for(j=0;j<group->acclist->len;j++)
2220
acc = g_ptr_array_index(group->acclist, j);
2222
//tbank += acc->bal_bank;
2223
//ttoday += acc->bal_today;
2224
//tfuture += acc->bal_future;
2225
tbank += hb_amount_base(acc->bal_bank, acc->kcur);
2226
ttoday += hb_amount_base(acc->bal_today, acc->kcur);
2227
tfuture += hb_amount_base(acc->bal_future, acc->kcur);
2229
DB( g_print(" + '%s' :: %.2f %.2f %.2f\n", acc->name, acc->bal_bank, acc->bal_today, acc->bal_future) );
2231
gtk_tree_store_append (GTK_TREE_STORE(model), &child_iter, &iter1);
2232
gtk_tree_store_set (GTK_TREE_STORE(model), &child_iter,
2233
LST_DSPACC_DATAS, acc,
2234
LST_DSPACC_DATATYPE, DSPACC_TYPE_NORMAL,
2235
LST_DSPACC_BANK, acc->bal_bank,
2236
LST_DSPACC_TODAY, acc->bal_today,
2237
LST_DSPACC_FUTURE, acc->bal_future,
2241
if(group->acclist->len > 1)
2243
DB( g_print(" + total :: %.2f %.2f %.2f\n", tbank, ttoday, tfuture) );
2245
// insert the total line
2246
gtk_tree_store_append (GTK_TREE_STORE(model), &child_iter, &iter1);
2247
gtk_tree_store_set (GTK_TREE_STORE(model), &child_iter,
2248
LST_DSPACC_DATATYPE, DSPACC_TYPE_SUBTOTAL,
2249
LST_DSPACC_NAME, _("Total"),
2250
LST_DSPACC_BANK, tbank,
2251
LST_DSPACC_TODAY, ttoday,
2252
LST_DSPACC_FUTURE, tfuture,
2256
/* set balance to header to display when collasped */
2257
DB( g_print(" (enrich group total header) :: %.2f %.2f %.2f\n", tbank, ttoday, tfuture) );
2258
gtk_tree_store_set (GTK_TREE_STORE(model), &iter1,
2259
LST_DSPACC_BANK, tbank,
2260
LST_DSPACC_TODAY, ttoday,
2261
LST_DSPACC_FUTURE, tfuture,
2264
if( group->expanded == TRUE )
2266
GtkTreePath *tmppath = gtk_tree_model_get_path(model, &iter1);
2268
DB( g_print(" expanding '%s'\n", (gchar *)key) );
2269
gtk_tree_view_expand_row(GTK_TREE_VIEW(data->LV_acc), tmppath, TRUE);
2270
gtk_tree_path_free(tmppath);
2273
/* add to grand total */
2276
gtfuture += tfuture;
2282
DB( g_print(" + grand total :: %.2f %.2f %.2f\n", gtbank, gttoday, gtfuture) );
2287
gtk_tree_store_append (GTK_TREE_STORE(model), &iter1, NULL);
2288
gtk_tree_store_set (GTK_TREE_STORE(model), &iter1,
2289
LST_DSPACC_DATATYPE, DSPACC_TYPE_SUBTOTAL,
2290
LST_DSPACC_NAME, _("Grand total"),
2291
LST_DSPACC_BANK, gtbank,
2292
LST_DSPACC_TODAY, gttoday,
2293
LST_DSPACC_FUTURE, gtfuture,
2297
//gtk_tree_view_expand_all(GTK_TREE_VIEW(data->LV_acc));
2299
ui_panel_accounts_groups_free(h_group);
2304
1432
void ui_mainwindow_update(GtkWidget *widget, gpointer user_data)
2306
1434
struct hbfile_data *data;
2935
/* Callback function for the undo action */
2937
activate_action (GSimpleAction *action, GVariant *parameter, gpointer user_data)
2939
g_print ("Action %s activated\n", g_action_get_name (G_ACTION (action)));
2943
activate_toggle (GSimpleAction *action, GVariant *parameter, gpointer user_data)
2945
struct hbfile_data *data = user_data;
2946
GVariant *old_state, *new_state;
2948
old_state = g_action_get_state (G_ACTION (action));
2949
new_state = g_variant_new_boolean (!g_variant_get_boolean (old_state));
2951
DB( g_print ("Toggle action %s activated, state changes from %d to %d\n",
2952
g_action_get_name (G_ACTION (action)),
2953
g_variant_get_boolean (old_state),
2954
g_variant_get_boolean (new_state)) );
2956
data->showall = g_variant_get_boolean (new_state);
2957
ui_mainwindow_populate_accounts(GLOBALS->mainwindow, NULL);
2959
g_simple_action_set_state (action, new_state);
2960
g_variant_unref (old_state);
2964
activate_radio (GSimpleAction *action, GVariant *parameter, gpointer user_data)
2966
//struct hbfile_data *data = user_data;
2967
GVariant *old_state, *new_state;
2969
old_state = g_action_get_state (G_ACTION (action));
2970
new_state = g_variant_new_string (g_variant_get_string (parameter, NULL));
2972
DB( g_print ("Radio action %s activated, state changes from %s to %s\n",
2973
g_action_get_name (G_ACTION (action)),
2974
g_variant_get_string (old_state, NULL),
2975
g_variant_get_string (new_state, NULL)) );
2977
PREFS->pnl_acc_show_by = DSPACC_GROUP_BY_TYPE;
2978
if( !strcmp("bank", g_variant_get_string(new_state, NULL)) )
2979
PREFS->pnl_acc_show_by = DSPACC_GROUP_BY_BANK;
2981
ui_mainwindow_populate_accounts(GLOBALS->mainwindow, NULL);
2983
g_simple_action_set_state (action, new_state);
2984
g_variant_unref (old_state);
2988
static const GActionEntry actions[] = {
2989
// name, function(), type, state,
2990
// { "paste", activate_action, NULL, NULL, NULL, {0,0,0} },
2991
{ "showall", activate_toggle, NULL, "false" , NULL, {0,0,0} },
2992
{ "groupby", activate_radio , "s", "'type'", NULL, {0,0,0} }
2996
static void ui_panel_accounts_setup(struct hbfile_data *data)
2999
GVariant *new_state;
3001
if( !G_IS_SIMPLE_ACTION_GROUP(data->action_group_acc) )
3004
action = g_action_map_lookup_action (G_ACTION_MAP (data->action_group_acc), "showall");
3007
new_state = g_variant_new_boolean (data->showall);
3008
g_simple_action_set_state (G_SIMPLE_ACTION(action), new_state);
3011
action = g_action_map_lookup_action (G_ACTION_MAP (data->action_group_acc), "groupby");
3014
const gchar *value = (PREFS->pnl_acc_show_by == DSPACC_GROUP_BY_TYPE) ? "type" : "bank";
3015
new_state = g_variant_new_string (value);
3016
g_simple_action_set_state (G_SIMPLE_ACTION (action), new_state);
3022
static GtkWidget *ui_mainwindow_create_youraccounts(struct hbfile_data *data)
3024
GtkWidget *panel, *label, *widget, *sw, *tbar, *hbox, *image;
3025
GtkToolItem *toolitem;
3027
panel = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3028
gtk_container_set_border_width(GTK_CONTAINER(panel), SPACING_SMALL);
3030
sw = gtk_scrolled_window_new (NULL, NULL);
3031
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
3032
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3033
gtk_box_pack_start (GTK_BOX (panel), sw, TRUE, TRUE, 0);
3034
widget = (GtkWidget *)create_list_account();
3035
data->LV_acc = widget;
3036
gtk_container_add (GTK_CONTAINER (sw), widget);
3039
tbar = gtk_toolbar_new();
3040
gtk_toolbar_set_icon_size (GTK_TOOLBAR(tbar), GTK_ICON_SIZE_MENU);
3041
gtk_toolbar_set_style(GTK_TOOLBAR(tbar), GTK_TOOLBAR_ICONS);
3042
gtk_style_context_add_class (gtk_widget_get_style_context (tbar), GTK_STYLE_CLASS_INLINE_TOOLBAR);
3043
gtk_box_pack_start (GTK_BOX (panel), tbar, FALSE, FALSE, 0);
3045
label = make_label_group(_("Your accounts"));
3046
toolitem = gtk_tool_item_new();
3047
gtk_container_add (GTK_CONTAINER(toolitem), label);
3048
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3050
toolitem = gtk_separator_tool_item_new ();
3051
gtk_tool_item_set_expand (toolitem, TRUE);
3052
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE);
3053
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3055
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
3056
toolitem = gtk_tool_item_new();
3057
gtk_container_add (GTK_CONTAINER(toolitem), hbox);
3058
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3060
widget = make_image_button(ICONNAME_HB_BUTTON_EXPAND, _("Expand all"));
3061
data->BT_expandall = widget;
3062
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
3064
widget = make_image_button(ICONNAME_HB_BUTTON_COLLAPSE, _("Collapse all"));
3065
data->BT_collapseall = widget;
3066
gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
3068
toolitem = gtk_separator_tool_item_new ();
3069
gtk_tool_item_set_expand (toolitem, FALSE);
3070
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE);
3071
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3074
//gmenu test (see test folder into gtk)
3075
GMenu *menu, *section;
3077
menu = g_menu_new ();
3078
//g_menu_append (menumodel, "About", "actions.undo");
3079
//g_menu_append (menumodel, "Test", "actions.redo");
3080
section = g_menu_new ();
3081
g_menu_append (section, _("Show all"), "actions.showall");
3082
g_menu_append_section(menu, NULL, G_MENU_MODEL(section));
3083
g_object_unref (section);
3085
section = g_menu_new ();
3086
g_menu_append (section, _("By type"), "actions.groupby::type");
3087
g_menu_append (section, _("By institution"), "actions.groupby::bank");
3088
g_menu_append_section(menu, NULL, G_MENU_MODEL(section));
3089
g_object_unref (section);
3092
GSimpleActionGroup *group = g_simple_action_group_new ();
3093
data->action_group_acc = group;
3094
g_action_map_add_action_entries (G_ACTION_MAP (group), actions, G_N_ELEMENTS (actions), data);
3097
widget = gtk_menu_button_new();
3098
gtk_menu_button_set_direction (GTK_MENU_BUTTON(widget), GTK_ARROW_UP);
3099
gtk_widget_set_halign (widget, GTK_ALIGN_END);
3100
image = gtk_image_new_from_icon_name (ICONNAME_EMBLEM_SYSTEM, GTK_ICON_SIZE_MENU);
3101
g_object_set (widget, "image", image, NULL);
3103
toolitem = gtk_tool_item_new();
3104
gtk_container_add (GTK_CONTAINER(toolitem), widget);
3105
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3107
gtk_widget_insert_action_group (widget, "actions", G_ACTION_GROUP(group));
3108
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (widget), G_MENU_MODEL (menu));
3114
static GtkWidget *ui_mainwindow_create_topspending(struct hbfile_data *data)
3116
GtkWidget *panel, *hbox, *tbar;
3117
GtkWidget *label, *widget;
3118
GtkToolItem *toolitem;
3120
widget = (GtkWidget *)create_list_topspending();
3121
data->LV_top = widget;
3123
panel = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3124
gtk_container_set_border_width(GTK_CONTAINER(panel), SPACING_SMALL);
3125
data->GR_top = panel;
3127
/* chart + listview */
3128
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
3129
gtk_box_pack_start (GTK_BOX (panel), hbox, TRUE, TRUE, 0);
3131
widget = gtk_chart_new(CHART_TYPE_PIE);
3132
data->RE_pie = widget;
3133
gtk_chart_set_minor_prefs(GTK_CHART(widget), PREFS->euro_value, PREFS->minor_cur.symbol);
3134
gtk_chart_show_legend(GTK_CHART(data->RE_pie), TRUE, TRUE);
3135
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
3138
tbar = gtk_toolbar_new();
3139
gtk_toolbar_set_icon_size (GTK_TOOLBAR(tbar), GTK_ICON_SIZE_MENU);
3140
gtk_toolbar_set_style(GTK_TOOLBAR(tbar), GTK_TOOLBAR_ICONS);
3141
gtk_style_context_add_class (gtk_widget_get_style_context (tbar), GTK_STYLE_CLASS_INLINE_TOOLBAR);
3142
gtk_box_pack_start (GTK_BOX (panel), tbar, FALSE, FALSE, 0);
3144
label = make_label_group(_("Where your money goes"));
3145
toolitem = gtk_tool_item_new();
3146
gtk_container_add (GTK_CONTAINER(toolitem), label);
3147
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3149
toolitem = gtk_separator_tool_item_new ();
3150
gtk_tool_item_set_expand (toolitem, TRUE);
3151
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE);
3152
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3154
/* total + date range */
3155
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
3156
toolitem = gtk_tool_item_new();
3157
gtk_container_add (GTK_CONTAINER(toolitem), hbox);
3158
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3160
data->CY_range = make_daterange(label, FALSE);
3161
gtk_box_pack_end (GTK_BOX (hbox), data->CY_range, FALSE, FALSE, 0);
3163
widget = hbtk_radio_new(CYA_CATSUBCAT, TRUE);
3164
data->RA_type = widget;
3165
gtk_box_pack_end (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
3171
static GtkWidget *ui_mainwindow_scheduled_create(struct hbfile_data *data)
3173
GtkWidget *panel, *hbox, *vbox, *bbox, *sw, *tbar;
3174
GtkWidget *label, *widget;
3175
GtkToolItem *toolitem;
3177
panel = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3178
gtk_container_set_border_width(GTK_CONTAINER(panel), SPACING_SMALL);
3179
data->GR_upc = panel;
3181
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3182
//gtk_widget_set_margin_top(GTK_WIDGET(vbox), 0);
3183
//gtk_widget_set_margin_bottom(GTK_WIDGET(vbox), SPACING_SMALL);
3184
//gtk_widget_set_margin_start(GTK_WIDGET(vbox), 2*SPACING_SMALL);
3185
//gtk_widget_set_margin_end(GTK_WIDGET(vbox), SPACING_SMALL);
3186
gtk_box_pack_start (GTK_BOX (panel), vbox, TRUE, TRUE, 0);
3188
sw = gtk_scrolled_window_new (NULL, NULL);
3189
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
3190
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3191
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
3193
widget = (GtkWidget *)create_list_upcoming();
3194
data->LV_upc = widget;
3195
gtk_container_add (GTK_CONTAINER (sw), widget);
3197
tbar = gtk_toolbar_new();
3198
gtk_toolbar_set_icon_size (GTK_TOOLBAR(tbar), GTK_ICON_SIZE_MENU);
3199
gtk_toolbar_set_style(GTK_TOOLBAR(tbar), GTK_TOOLBAR_ICONS);
3200
gtk_style_context_add_class (gtk_widget_get_style_context (tbar), GTK_STYLE_CLASS_INLINE_TOOLBAR);
3201
gtk_box_pack_start (GTK_BOX (vbox), tbar, FALSE, FALSE, 0);
3203
label = make_label_group(_("Scheduled transactions"));
3204
toolitem = gtk_tool_item_new();
3205
gtk_container_add (GTK_CONTAINER(toolitem), label);
3206
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3208
toolitem = gtk_separator_tool_item_new ();
3209
gtk_tool_item_set_expand (toolitem, FALSE);
3210
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE);
3211
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3214
bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
3215
toolitem = gtk_tool_item_new();
3216
gtk_container_add (GTK_CONTAINER(toolitem), bbox);
3217
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3219
widget = gtk_button_new_with_label(_("Skip"));
3220
data->BT_sched_skip = widget;
3221
gtk_box_pack_start (GTK_BOX (bbox), widget, FALSE, FALSE, 0);
3223
widget = gtk_button_new_with_label(_("Edit & Post"));
3224
data->BT_sched_editpost = widget;
3225
gtk_box_pack_start (GTK_BOX (bbox), widget, FALSE, FALSE, 0);
3227
//TRANSLATORS: Posting a scheduled transaction is the action to materialize it into its target account.
3228
//TRANSLATORS: Before that action the automated transaction occurrence is pending and not yet really existing.
3229
widget = gtk_button_new_with_label (_("Post"));
3230
data->BT_sched_post = widget;
3231
gtk_box_pack_start (GTK_BOX (bbox), widget, FALSE, FALSE, 0);
3233
toolitem = gtk_separator_tool_item_new ();
3234
gtk_tool_item_set_expand (toolitem, FALSE);
3235
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(toolitem), FALSE);
3236
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3238
hbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
3239
gtk_widget_set_valign (hbox, GTK_ALIGN_CENTER);
3240
toolitem = gtk_tool_item_new();
3241
gtk_container_add (GTK_CONTAINER(toolitem), hbox);
3242
gtk_toolbar_insert(GTK_TOOLBAR(tbar), GTK_TOOL_ITEM(toolitem), -1);
3244
label = make_label(_("maximum post date"), 0.0, 0.7);
3245
gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
3246
gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1);
3247
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3249
label = make_label(NULL, 0.0, 0.7);
3250
data->LB_maxpostdate = label;
3251
gtk_widget_set_halign (label, GTK_ALIGN_CENTER);
3252
gimp_label_set_attributes (GTK_LABEL (label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1);
3253
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
3260
2067
** the window creation