Bug 797768 - View Lots sorting numbers not right.

When you try and sort on balance, amount and value the columns are
sorted alphabetically as opposed to numeric value. Fixed by adding
extra double columns to the list store and use them to sort the numeric
columns.
This commit is contained in:
Robert Fewell 2020-05-27 13:52:27 +01:00
parent 6419857462
commit c0abdb28d1

View File

@ -61,7 +61,9 @@ enum lot_cols
LOT_COL_CLOSE,
LOT_COL_TITLE,
LOT_COL_BALN,
LOT_COL_BALN_DOUBLE, // used only for sorting
LOT_COL_GAINS,
LOT_COL_GAINS_DOUBLE, // used only for sorting
LOT_COL_PNTR,
NUM_LOT_COLS
};
@ -72,9 +74,13 @@ enum split_cols
SPLIT_COL_NUM,
SPLIT_COL_DESCRIPTION,
SPLIT_COL_AMOUNT,
SPLIT_COL_AMOUNT_DOUBLE, // used only for sorting
SPLIT_COL_VALUE,
SPLIT_COL_VALUE_DOUBLE, // used only for sorting
SPLIT_COL_GAIN_LOSS,
SPLIT_COL_GAIN_LOSS_DOUBLE, // used only for sorting
SPLIT_COL_BALANCE,
SPLIT_COL_BALANCE_DOUBLE, // used only for sorting
SPLIT_COL_PNTR,
NUM_SPLIT_COLS
};
@ -403,11 +409,13 @@ gnc_lot_viewer_fill (GNCLotViewer *lv)
xaccSPrintAmount (baln_buff, amt_baln,
gnc_account_print_info (lv->account, TRUE));
gtk_list_store_set(store, &iter, LOT_COL_BALN, baln_buff, -1);
gtk_list_store_set(store, &iter, LOT_COL_BALN_DOUBLE, gnc_numeric_to_double (amt_baln), -1);
/* Capital Gains/Losses Appreciation/Depreciation */
xaccSPrintAmount (gain_buff, gains_baln,
gnc_commodity_print_info (currency, TRUE));
gtk_list_store_set(store, &iter, LOT_COL_GAINS, gain_buff, -1);
gtk_list_store_set(store, &iter, LOT_COL_GAINS_DOUBLE, gnc_numeric_to_double (gains_baln), -1);
/* Self-reference */
gtk_list_store_set(store, &iter, LOT_COL_PNTR, lot, -1);
@ -524,6 +532,7 @@ gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store, SplitList *split_l
xaccSPrintAmount (amtbuff, amnt,
gnc_account_print_info (lv->account, TRUE));
gtk_list_store_set (store, &iter, SPLIT_COL_AMOUNT, amtbuff, -1);
gtk_list_store_set (store, &iter, SPLIT_COL_AMOUNT_DOUBLE, gnc_numeric_to_double (amnt), -1);
/* Value.
* For non-business accounts which are part of a lot,
@ -535,6 +544,7 @@ gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store, SplitList *split_l
xaccSPrintAmount (valbuff, valu,
gnc_commodity_print_info (currency, TRUE));
gtk_list_store_set (store, &iter, SPLIT_COL_VALUE, valbuff, -1);
gtk_list_store_set (store, &iter, SPLIT_COL_VALUE_DOUBLE, gnc_numeric_to_double (valu), -1);
/* Gains. Blank if none. */
gains = xaccSplitGetCapGains (split);
@ -548,6 +558,7 @@ gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store, SplitList *split_l
gnc_commodity_print_info (currency, TRUE));
}
gtk_list_store_set (store, &iter, SPLIT_COL_GAIN_LOSS, gainbuff, -1);
gtk_list_store_set (store, &iter, SPLIT_COL_GAIN_LOSS_DOUBLE, gnc_numeric_to_double (gains), -1);
/* Balance of Gains */
baln = gnc_numeric_add_fixed (baln, amnt);
@ -561,6 +572,7 @@ gnc_split_viewer_fill (GNCLotViewer *lv, GtkListStore *store, SplitList *split_l
gnc_account_print_info (lv->account, TRUE));
}
gtk_list_store_set (store, &iter, SPLIT_COL_BALANCE, balnbuff, -1);
gtk_list_store_set (store, &iter, SPLIT_COL_BALANCE_DOUBLE, gnc_numeric_to_double (baln), -1);
/* Self-reference */
gtk_list_store_set(store, &iter, SPLIT_COL_PNTR, split, -1);
@ -824,8 +836,10 @@ lv_init_lot_view (GNCLotViewer *lv)
view = lv->lot_view;
store = gtk_list_store_new(NUM_LOT_COLS, G_TYPE_STRING, G_TYPE_INT64,
G_TYPE_INT64, G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_POINTER);
G_TYPE_INT64, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_DOUBLE,
G_TYPE_STRING,G_TYPE_DOUBLE,
G_TYPE_POINTER);
gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
g_object_unref(store);
lv->lot_store = store;
@ -866,13 +880,13 @@ lv_init_lot_view (GNCLotViewer *lv)
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Balance"), renderer,
"text", LOT_COL_BALN, NULL);
gtk_tree_view_column_set_sort_column_id(column, LOT_COL_BALN);
gtk_tree_view_column_set_sort_column_id (column, LOT_COL_BALN_DOUBLE);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Gains"), renderer,
"text", LOT_COL_GAINS, NULL);
gtk_tree_view_column_set_sort_column_id(column, LOT_COL_GAINS);
gtk_tree_view_column_set_sort_column_id (column, LOT_COL_GAINS_DOUBLE);
gtk_tree_view_append_column(view, column);
/* Set up signals */
@ -896,9 +910,12 @@ lv_init_split_view (GNCLotViewer *lv, GtkTreeView *view)
g_return_val_if_fail(GTK_IS_TREE_VIEW(view), NULL);
store = gtk_list_store_new(NUM_SPLIT_COLS, G_TYPE_INT64, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
store = gtk_list_store_new(NUM_SPLIT_COLS, G_TYPE_INT64,
G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_DOUBLE,
G_TYPE_STRING, G_TYPE_DOUBLE,
G_TYPE_STRING, G_TYPE_DOUBLE,
G_TYPE_STRING, G_TYPE_DOUBLE,
G_TYPE_POINTER);
gtk_tree_view_set_model(view, GTK_TREE_MODEL(store));
g_object_unref(store);
@ -929,25 +946,25 @@ lv_init_split_view (GNCLotViewer *lv, GtkTreeView *view)
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Amount"), renderer,
"text", SPLIT_COL_AMOUNT, NULL);
gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_AMOUNT);
gtk_tree_view_column_set_sort_column_id (column, SPLIT_COL_AMOUNT_DOUBLE);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Value"), renderer,
"text", SPLIT_COL_VALUE, NULL);
gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_VALUE);
gtk_tree_view_column_set_sort_column_id (column, SPLIT_COL_VALUE_DOUBLE);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Gain/Loss"), renderer,
"text", SPLIT_COL_GAIN_LOSS, NULL);
gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_GAIN_LOSS);
gtk_tree_view_column_set_sort_column_id (column, SPLIT_COL_GAIN_LOSS_DOUBLE);
gtk_tree_view_append_column(view, column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(_("Balance"), renderer,
"text", SPLIT_COL_BALANCE, NULL);
gtk_tree_view_column_set_sort_column_id(column, SPLIT_COL_BALANCE);
gtk_tree_view_column_set_sort_column_id (column, SPLIT_COL_BALANCE_DOUBLE);
gtk_tree_view_append_column(view, column);
/* Set up the selection callbacks */