X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Flist-operation.c;fp=src%2Flist_operation.c;h=341fe9e48cfda47fa2806ace711f30a9a52aebcd;hp=18ab3b0e307016ad5b281a28b335c874f660d04a;hb=a6c6b0df5492c2160ed97e3a376bdb2fe7c5ebc4;hpb=cd13d9691c46c2b2d6d459e9e6a76bed1c21b7a6 diff --git a/src/list_operation.c b/src/list-operation.c similarity index 79% rename from src/list_operation.c rename to src/list-operation.c index 18ab3b0..341fe9e 100644 --- a/src/list_operation.c +++ b/src/list-operation.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2018 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -20,7 +20,7 @@ #include "homebank.h" -#include "list_operation.h" +#include "list-operation.h" /****************************************************************************/ /* Debug macros */ @@ -104,22 +104,33 @@ static gint case LST_DSPOPE_PAYEE: { - if( ope1->paymode==PAYMODE_INTXFER && ope2->paymode==PAYMODE_INTXFER ) - { - Account *a1, *a2; + //#1721980 + gchar *name1 = NULL; + gchar *name2 = NULL; - a1 = da_acc_get(ope1->kxferacc); - a2 = da_acc_get(ope2->kxferacc); - retval = list_txn_sort_iter_compare_strings((a1 != NULL) ? a1->name : NULL, (a2 != NULL) ? a2->name : NULL); - } + if( ope1->paymode == PAYMODE_INTXFER ) + { + Account *acc = da_acc_get(ope1->kxferacc); + name1 = (acc != NULL) ? acc->name : NULL; + } else { - Payee *p1, *p2; + Payee *pay = da_pay_get(ope1->kpay); + name1 = (pay != NULL) ? pay->name : NULL; + } - p1 = da_pay_get(ope1->kpay); - p2 = da_pay_get(ope2->kpay); - retval = list_txn_sort_iter_compare_strings((p1 != NULL) ? p1->name : NULL, (p2 != NULL) ? p2->name : NULL); + if( ope2->paymode == PAYMODE_INTXFER ) + { + Account *acc = da_acc_get(ope2->kxferacc); + name2 = (acc != NULL) ? acc->name : NULL; + } + else + { + Payee *pay = da_pay_get(ope2->kpay); + name2 = (pay != NULL) ? pay->name : NULL; } + + retval = list_txn_sort_iter_compare_strings(name1, name2); } break; @@ -141,17 +152,12 @@ static gint case LST_DSPOPE_CATEGORY: { Category *c1, *c2; - gchar *name1, *name2; c1 = da_cat_get(ope1->kcat); c2 = da_cat_get(ope2->kcat); if( c1 != NULL && c2 != NULL ) { - name1 = da_cat_get_fullname(c1); - name2 = da_cat_get_fullname(c2); - retval = list_txn_sort_iter_compare_strings(name1, name2); - g_free(name2); - g_free(name1); + retval = list_txn_sort_iter_compare_strings(c1->fullname, c2->fullname); } } break; @@ -160,8 +166,8 @@ static gint { gchar *t1, *t2; - t1 = transaction_tags_tostring(ope1); - t2 = transaction_tags_tostring(ope2); + t1 = tags_tostring(ope1->tags); + t2 = tags_tostring(ope2->tags); retval = list_txn_sort_iter_compare_strings(t1, t2); g_free(t2); g_free(t1); @@ -178,26 +184,12 @@ static gint static void list_txn_eval_future(GtkCellRenderer *renderer, Transaction *txn) { - - //it seems we are not able to get a valid GdkRGBA - //nor to set/use the alpha - /*GdkRGBA *rgba; - g_object_get(renderer, "foreground-rgba", &rgba, NULL); - g_print("forcol: %p %f %f %f %f\n", rgba, rgba->red, rgba->green, rgba->blue, rgba->alpha); - rgba->red = 1.0; - rgba->alpha = 0.1; - g_object_set(renderer, "foreground-set", TRUE, - "foreground-rgba", rgba, - NULL); - gdk_rgba_free(rgba); - */ - if(txn->date > GLOBALS->today) { g_object_set(renderer, - "scale-set", TRUE, + // "scale-set", TRUE, "scale", 0.8, - "style-set", TRUE, + // "style-set", TRUE, "style", PANGO_STYLE_OBLIQUE, NULL); } @@ -206,6 +198,35 @@ static void list_txn_eval_future(GtkCellRenderer *renderer, Transaction *txn) g_object_set(renderer, "scale-set", FALSE, "style-set", FALSE, NULL); } + + if( txn->marker == TXN_MARK_DUPDST ) + { + g_object_set(renderer, + // "strikethrough-set", TRUE, + "strikethrough", TRUE, + NULL); + } + else + { + g_object_set(renderer, "strikethrough-set", FALSE, + NULL); + } + + if( txn->marker == TXN_MARK_DUPSRC ) + { + g_object_set(renderer, + // "weight-set", TRUE, + "weight", PANGO_WEIGHT_BOLD, + NULL); + } + else + { + g_object_set(renderer, "weight-set", FALSE, + NULL); + } + + + } @@ -214,10 +235,10 @@ static void list_txn_eval_future(GtkCellRenderer *renderer, Transaction *txn) */ static void list_txn_status_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { -Transaction *entry; +Transaction *txn; gchar *iconname = NULL; - gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &entry, -1); + gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &txn, -1); /* stat[0] = ( entry->ope_Flags & OF_ADDED ) ? data->istatus[2] : data->istatus[0]; @@ -229,10 +250,13 @@ gchar *iconname = NULL; switch(GPOINTER_TO_INT(user_data)) { case 1: - iconname = ( entry->flags & OF_AUTO ) ? ICONNAME_HB_OPE_AUTO : ( entry->flags & OF_ADDED ) ? ICONNAME_NEW : NULL; + iconname = ( txn->flags & OF_AUTO ) ? ICONNAME_HB_OPE_AUTO : ( txn->flags & OF_ADDED ) ? ICONNAME_HB_OPE_NEW : NULL; break; case 2: - iconname = ( entry->flags & OF_CHANGED ) ? ICONNAME_HB_OPE_EDIT : NULL; + iconname = ( txn->flags & OF_CHANGED ) ? ICONNAME_HB_OPE_EDIT : NULL; + break; + case 3: + iconname = ( txn->marker == TXN_MARK_DUPDST ) ? ICONNAME_HB_OPE_SIMILAR : NULL; break; /*case 3: if( entry->flags & OF_VALID ) @@ -283,11 +307,14 @@ GDate date; { g_date_set_julian (&date, ope->date); g_date_strftime (buffer, 256-1, PREFS->date_format, &date); - - //g_snprintf(buf, sizeof(buf), "%d", ope->ope_Date); - + #if MYDEBUG + gchar *ds = g_strdup_printf ("%s [%02d]", buffer, ope->pos ); + g_object_set(renderer, "text", ds, NULL); + g_free(ds); + #else g_object_set(renderer, "text", buffer, NULL); - } + #endif + } else g_object_set(renderer, "text", "????", NULL); } @@ -352,7 +379,7 @@ gchar *str; if(ope->tags != NULL) { - str = transaction_tags_tostring(ope); + str = tags_tostring(ope->tags); g_object_set(renderer, "text", str, NULL); g_free(str); } @@ -462,7 +489,6 @@ static void list_txn_category_cell_data_function (GtkTreeViewColumn *col, GtkCel { Transaction *ope; Category *cat; -gchar *fullname; gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); list_txn_eval_future(renderer, ope); @@ -476,9 +502,7 @@ gchar *fullname; cat = da_cat_get(ope->kcat); if( cat != NULL ) { - fullname = da_cat_get_fullname(cat); - g_object_set(renderer, "text", fullname, NULL); - g_free(fullname); + g_object_set(renderer, "text", cat->fullname, NULL); } else g_object_set(renderer, "text", "", NULL); @@ -529,12 +553,14 @@ char amountbuf[G_ASCII_DTOSTR_BUF_SIZE]; payee = da_pay_get(ope->kpay); payeename = (payee->name == NULL) ? "" : payee->name; category = da_cat_get(ope->kcat); - categoryname = (category->name == NULL) ? NULL : da_cat_get_fullname(category); - tags = transaction_tags_tostring(ope); + categoryname = (category->name == NULL) ? NULL : category->fullname; + tags = tags_tostring(ope->tags); //#793719 //g_ascii_dtostr (amountbuf, sizeof (amountbuf), ope->amount); - g_ascii_formatd (amountbuf, sizeof (amountbuf), "%.2f", ope->amount); + //#1750257 use locale numdigit + //g_ascii_formatd (amountbuf, sizeof (amountbuf), "%.2f", ope->amount); + g_snprintf(amountbuf, sizeof (amountbuf), "%.2f", ope->amount); DB( g_print("amount = %f '%s'\n", ope->amount, amountbuf) ); @@ -551,7 +577,6 @@ char amountbuf[G_ASCII_DTOSTR_BUF_SIZE]; ); //leak - g_free(categoryname); g_free(tags); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); @@ -653,6 +678,30 @@ struct list_txn_data *data; } +void list_txn_set_column_acc_visible(GtkTreeView *treeview, gboolean visible) +{ +struct list_txn_data *data; +GList *list; +GtkTreeViewColumn *column; + + data = g_object_get_data(G_OBJECT(treeview), "inst_data"); + + data->showall = visible; + + list = gtk_tree_view_get_columns( treeview ); + //if acc visible: balance must be invisible + column = list_txn_get_column(list, LST_DSPOPE_ACCOUNT); + if(column) + gtk_tree_view_column_set_visible (column, visible); + column = list_txn_get_column(list, LST_DSPOPE_BALANCE); + if(column) + gtk_tree_view_column_set_visible (column, !visible); + + + g_list_free(list); +} + + void list_txn_sort_force(GtkTreeSortable *sortable, gpointer user_data) { gint sort_column_id; @@ -674,7 +723,7 @@ struct list_txn_data *data; GtkTreeViewColumn *column; gint i, col_id; - DB( g_print("\n[list_txn] get columns order/width\n") ); + DB( g_print("\n[list_txn] get columns position/width\n") ); data = g_object_get_data(G_OBJECT(treeview), "inst_data"); @@ -695,13 +744,15 @@ gint i, col_id; visible = data->tvc_is_visible; if( visible ) + { PREFS->lst_ope_columns[i] = col_id; + //5.2 moved here to keep old width in case not visible + PREFS->lst_ope_col_width[col_id-1] = gtk_tree_view_column_get_width(column); + } else PREFS->lst_ope_columns[i] = -col_id; - - PREFS->lst_ope_col_size[col_id-1] = gtk_tree_view_column_get_width(column); - DB( g_print(" col-%2d => %2d '%s' w=%d\n", i, col_id, gtk_tree_view_column_get_title(column), PREFS->lst_ope_col_size[col_id-1] ) ); + DB( g_print(" col-%2d => %2d '%s' w=%d\n", i, col_id, gtk_tree_view_column_get_title(column), PREFS->lst_ope_col_width[col_id-1] ) ); } else //should not occurs PREFS->lst_ope_columns[i] = 0; @@ -779,7 +830,7 @@ gint id; || id == LST_DSPOPE_TAGS || id == LST_DSPOPE_ACCOUNT ) { - gtk_tree_view_column_set_fixed_width( column, PREFS->lst_ope_col_size[id - 1]); + gtk_tree_view_column_set_fixed_width( column, PREFS->lst_ope_col_width[id - 1]); } } @@ -807,6 +858,7 @@ gboolean showBalance; //manage visibility of balance column //showBalance = (id == LST_DSPOPE_DATE && order == GTK_SORT_ASCENDING) ? data->tvc_is_visible : FALSE; showBalance = (id == LST_DSPOPE_DATE) ? data->tvc_is_visible : FALSE; + if(data->showall == TRUE) showBalance = FALSE; gtk_tree_view_column_set_visible (data->tvc_balance, showBalance); } @@ -1088,17 +1140,15 @@ GtkTreeViewColumn *column, *col_acc = NULL, *col_status = NULL; gtk_tree_view_column_set_alignment (column, 0.5); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - if(list_type == LIST_TXN_TYPE_DETAIL) - { - column = list_txn_column_text_create(list_type, _("Account"), LST_DSPOPE_ACCOUNT, list_txn_account_cell_data_function, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - col_acc = column; - // add column popup - g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), - "button-press-event", - G_CALLBACK ( list_txn_column_popup_callback ), - data ); - } + //5.2 we always create the column and set it not visible + column = list_txn_column_text_create(list_type, _("Account"), LST_DSPOPE_ACCOUNT, list_txn_account_cell_data_function, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + col_acc = column; + // add column popup + g_signal_connect ( G_OBJECT (gtk_tree_view_column_get_button (column)), + "button-press-event", + G_CALLBACK ( list_txn_column_popup_callback ), + data ); /* column 2: Date */ column = gtk_tree_view_column_new(); @@ -1144,6 +1194,7 @@ GtkTreeViewColumn *column, *col_acc = NULL, *col_status = NULL; /* column status CLR */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Status")); + //renderer = gtk_cell_renderer_text_new (); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); @@ -1236,10 +1287,12 @@ GtkTreeViewColumn *column, *col_acc = NULL, *col_status = NULL; list_txn_set_columns(GTK_TREE_VIEW(treeview), pref_columns); /* force account column for detail treeview */ - if(list_type == LIST_TXN_TYPE_DETAIL) - { - gtk_tree_view_move_column_after(GTK_TREE_VIEW(treeview), col_acc, col_status); - } + gtk_tree_view_move_column_after(GTK_TREE_VIEW(treeview), col_acc, col_status); + + /* by default book don't display acc column, except shoall */ + //#1821850 detail account column visible + gboolean visible = (list_type == LIST_TXN_TYPE_BOOK) ? FALSE: TRUE; + gtk_tree_view_column_set_visible (col_acc, visible); /* set initial sort order */ DB( g_print("set sort to %d %d\n", PREFS->lst_ope_sort_id, PREFS->lst_ope_sort_order) ); @@ -1254,198 +1307,3 @@ GtkTreeViewColumn *column, *col_acc = NULL, *col_status = NULL; } -/* ---------------------------------------------- */ -/* import list : soon obsolete */ -/* ---------------------------------------------- */ - -/* -** account cell function -*/ -static void ope_importaccount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) -{ -Transaction *ope; -Account *acc, *dacc; - - gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); - - acc = da_acc_get(ope->kacc); - if( acc ) - { - if(acc->imp_key > 0) - { - dacc = da_acc_get(acc->imp_key); - if( dacc ) - g_object_set(renderer, "text", dacc->name, NULL); - } - else - g_object_set(renderer, "text", acc->name, NULL); - - } -} - -/* -** amount cell function -*/ -static void ope_importamount_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) -{ -Transaction *ope; -gchar formatd_buf[G_ASCII_DTOSTR_BUF_SIZE]; -gchar *color; - - gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); - - //mystrfnum(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); - //hb_strfmon(buf, G_ASCII_DTOSTR_BUF_SIZE-1, ope->amount, GLOBALS->minor); - g_ascii_formatd(formatd_buf, G_ASCII_DTOSTR_BUF_SIZE-1, "%.2f", ope->amount); - - color = get_normal_color_amount(ope->amount); - - g_object_set(renderer, - "foreground", color, - "text", formatd_buf, - NULL); - -} - - -static void ope_importstatus_cell_data_function (GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) -{ -Transaction *ope; -gchar *iconname = NULL; - - // get the transaction - gtk_tree_model_get(model, iter, LST_DSPOPE_DATAS, &ope, -1); - - iconname = ( ope->same != NULL ) ? ICONNAME_WARNING : NULL; - - g_object_set(renderer, "icon-name", iconname, NULL); -} - - -static void -ope_importfixed_toggled (GtkCellRendererToggle *cell, - gchar *path_str, - gpointer data) -{ - GtkTreeModel *model = (GtkTreeModel *)data; - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string (path_str); - gboolean fixed; - - /* get toggled iter */ - gtk_tree_model_get_iter (model, &iter, path); - gtk_tree_model_get (model, &iter, LST_OPE_IMPTOGGLE, &fixed, -1); - - /* do something with the value */ - fixed ^= 1; - - /* set new value */ - gtk_list_store_set (GTK_LIST_STORE (model), &iter, LST_OPE_IMPTOGGLE, fixed, -1); - - /* clean up */ - gtk_tree_path_free (path); -} - -/* -** create our transaction list -*/ -GtkWidget *create_list_import_transaction(gboolean enable_choose) -{ -GtkListStore *store; -GtkWidget *treeview; -GtkCellRenderer *renderer; -GtkTreeViewColumn *column; - - /* create list store */ - store = gtk_list_store_new( - 10, - G_TYPE_POINTER, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN - ); - - //treeview - treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - g_object_unref(store); - - gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (treeview), PREFS->grid_lines); - //gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), - // COLUMN_DESCRIPTION); - - //gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE); - - /* column: Selection */ - if(enable_choose) - { - renderer = gtk_cell_renderer_toggle_new (); - - g_signal_connect (renderer, "toggled", G_CALLBACK (ope_importfixed_toggled), store); - - - column = gtk_tree_view_column_new_with_attributes (NULL, - renderer, - "active", LST_OPE_IMPTOGGLE, - NULL); - - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - /* column: Duplicate */ - column = gtk_tree_view_column_new(); - //gtk_tree_view_column_set_title(column, _("Import ?")); - renderer = gtk_cell_renderer_pixbuf_new (); - //gtk_cell_renderer_set_fixed_size(renderer, GLOBALS->lst_pixbuf_maxwidth, -1); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importstatus_cell_data_function, NULL, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - } - -//#ifndef NOOFX - /* column: Account */ - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Account")); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, ope_importaccount_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); -//#endif - - /* column: Date */ - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Date")); - renderer = gtk_cell_renderer_text_new (); - g_object_set(renderer, "xalign", 1.0, NULL); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_set_cell_data_func(column, renderer, list_txn_date_cell_data_function, NULL, NULL); - //gtk_tree_view_column_set_sort_column_id (column, LST_DSPOPE_DATE); - gtk_tree_view_column_set_resizable(column, TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Memo"), -1, list_txn_memo_cell_data_function, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = list_txn_column_amount_create(LIST_TXN_TYPE_IMPORT, _("Amount"), -1, ope_importamount_cell_data_function); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = list_txn_column_info_create(LIST_TXN_TYPE_IMPORT); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Payee"), -1, list_txn_payee_cell_data_function, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = list_txn_column_text_create(LIST_TXN_TYPE_IMPORT, _("Category"), -1, list_txn_category_cell_data_function, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - column = gtk_tree_view_column_new(); - gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); - - return(treeview); -}