From f3b3ccb8d891eeb4571b3036a2e5ea96c33d5137 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 29 Aug 2022 10:50:51 +0800 Subject: [PATCH] [lot-viewer] don't show Open & Close dates when not applicable Bug: an empty lot would show "Opened" date as 01/01/1970. Fix on lot editor UI: Empty lots have opening date "Empty", blank closing date. Open lots have appropriate opening date, closing date "Open" Closed lots have appropriate opening and closing dates. --- gnucash/gnome/dialog-lot-viewer.c | 70 +++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/gnucash/gnome/dialog-lot-viewer.c b/gnucash/gnome/dialog-lot-viewer.c index ae237c4a8f..7f76813643 100644 --- a/gnucash/gnome/dialog-lot-viewer.c +++ b/gnucash/gnome/dialog-lot-viewer.c @@ -365,8 +365,6 @@ gnc_lot_viewer_fill (GNCLotViewer *lv) char gain_buff[200]; GNCLot *lot = node->data; Split *esplit = gnc_lot_get_earliest_split (lot); - Transaction *etrans = xaccSplitGetParent (esplit); - time64 open_date = xaccTransGetDate (etrans); gnc_numeric amt_baln = gnc_lot_get_balance (lot); gnc_commodity *currency = find_first_currency (lot); gnc_numeric gains_baln = get_realized_gains (lot, currency); @@ -389,7 +387,14 @@ gnc_lot_viewer_fill (GNCLotViewer *lv) gtk_list_store_set(store, &iter, LOT_COL_TYPE, type_buff, -1); /* Opening date */ - gtk_list_store_set(store, &iter, LOT_COL_OPEN, open_date, -1); + if (esplit) + { + Transaction *etrans = xaccSplitGetParent (esplit); + time64 open_date = xaccTransGetDate (etrans); + gtk_list_store_set(store, &iter, LOT_COL_OPEN, open_date, -1); + } + else + gtk_list_store_set(store, &iter, LOT_COL_OPEN, G_MININT64, -1); /* Closing date */ if (gnc_lot_is_closed (lot)) @@ -804,6 +809,49 @@ lv_response_cb (GtkDialog *dialog, gint response, gpointer data) /* ======================================================================== */ +static gchar* lot_get_open_date (GNCLot *lot) +{ + g_return_val_if_fail (lot, NULL); + + if (!gnc_lot_get_split_list (lot)) + return g_strdup (_("Empty")); + else + return qof_print_date (xaccTransGetDate (xaccSplitGetParent (gnc_lot_get_earliest_split (lot)))); +} + +static gchar* lot_get_closing_date (GNCLot *lot) +{ + g_return_val_if_fail (lot, NULL); + + if (!gnc_lot_get_split_list (lot)) + return NULL; + else if (!gnc_lot_is_closed (lot)) + return g_strdup (_("Open")); + else + return qof_print_date (xaccTransGetDate (xaccSplitGetParent (gnc_lot_get_latest_split (lot)))); +} + +typedef gchar* (*LotToDateFunc) (GNCLot *lot); + +static void lot_print_date (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, + GtkTreeIter *iter, + LotToDateFunc lot_to_date) +{ + GNCLot *lot; + gchar *str = NULL; + + g_return_if_fail (cell && iter && tree_model); + gtk_tree_model_get (tree_model, iter, LOT_COL_PNTR, &lot, -1); + + if (lot) + str = lot_to_date (lot); + + g_object_set (G_OBJECT (cell), "text", str, NULL); + g_free (str); +} + static void print_date (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, @@ -811,18 +859,14 @@ static void print_date (GtkTreeViewColumn *tree_column, gpointer data) { time64 doc_date_time; - gchar *doc_date_str = g_strdup (_("Open")); + gchar *doc_date_str; gint col = GPOINTER_TO_INT(data); g_return_if_fail (cell && iter && tree_model); gtk_tree_model_get (tree_model, iter, col, &doc_date_time, -1); - if (doc_date_time != G_MAXINT64) /* assumes INT64_MAX represents an invalid date/time */ - { - g_free (doc_date_str); - doc_date_str = qof_print_date (doc_date_time); - } + doc_date_str = qof_print_date (doc_date_time); g_object_set (G_OBJECT (cell), "text", doc_date_str, NULL); g_free (doc_date_str); } @@ -871,8 +915,8 @@ lv_init_lot_view (GNCLotViewer *lv) gtk_tree_view_column_set_sort_column_id(column, LOT_COL_OPEN); tree_view_column_set_default_width (view, column, "31-12-2013"); gtk_tree_view_column_set_cell_data_func (column, renderer, - (GtkTreeCellDataFunc) print_date, - GINT_TO_POINTER (LOT_COL_OPEN), NULL); + (GtkTreeCellDataFunc) lot_print_date, + lot_get_open_date, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new(); @@ -881,8 +925,8 @@ lv_init_lot_view (GNCLotViewer *lv) gtk_tree_view_column_set_sort_column_id(column, LOT_COL_CLOSE); tree_view_column_set_default_width (view, column, "31-12-2013"); gtk_tree_view_column_set_cell_data_func (column, renderer, - (GtkTreeCellDataFunc) print_date, - GINT_TO_POINTER (LOT_COL_CLOSE), NULL); + (GtkTreeCellDataFunc) lot_print_date, + lot_get_closing_date, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new();