From c1d074c5c9d23a90d86c89ed54ad4863b09a7217 Mon Sep 17 00:00:00 2001 From: David Hampton Date: Sat, 26 Nov 2005 05:56:41 +0000 Subject: [PATCH] Allow deletion of multiple prices at once. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@12034 57a11ea4-9604-0410-9ed3-97b8803252fd --- ChangeLog | 8 +++ src/gnome-utils/gnc-tree-view-price.c | 3 +- src/gnome/dialog-price-edit-db.c | 70 +++++++++++++++++---------- 3 files changed, 54 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index aa7a5d9d58..03901feaf9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2005-11-25 David Hampton + * src/gnome/dialog-price-edit-db.c: Allow selection of multiple + prices at once. Multiple prices can be deleted at the same time, + but not edited. implements 147557. + + * src/gnome-utils/gnc-tree-view-price.c: Fix the + gnc_tree_view_price_set_selected_price function to ignore exchange + and commodity entries. + * src/gnome/dialog-price-edit-db.c: Enhance the "remove old prices" code to have options to retain the last price entered, and to retain any user entered prices. The "remove old" button should diff --git a/src/gnome-utils/gnc-tree-view-price.c b/src/gnome-utils/gnc-tree-view-price.c index 558b24a89c..0ab70edb2c 100644 --- a/src/gnome-utils/gnc-tree-view-price.c +++ b/src/gnome-utils/gnc-tree-view-price.c @@ -924,7 +924,8 @@ get_selected_prices_helper (GtkTreeModel *s_model, model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(f_model)); price = gnc_tree_model_price_get_price (GNC_TREE_MODEL_PRICE(model), &iter); - *return_list = g_list_append(*return_list, price); + if (price) + *return_list = g_list_append(*return_list, price); } /* diff --git a/src/gnome/dialog-price-edit-db.c b/src/gnome/dialog-price-edit-db.c index 684fbfd806..cc66602d9a 100644 --- a/src/gnome/dialog-price-edit-db.c +++ b/src/gnome/dialog-price-edit-db.c @@ -72,7 +72,6 @@ typedef struct GtkWidget * remove_button; GNCPriceDB *price_db; - GNCPrice * price; /* Currently selected price */ } PricesDialog; @@ -84,12 +83,6 @@ gnc_prices_dialog_window_destroy_cb (GtkObject *object, gpointer data) ENTER(" "); gnc_unregister_gui_component_by_data (DIALOG_PRICE_DB_CM_CLASS, pdb_dialog); - if (pdb_dialog->price) - { - gnc_price_unref (pdb_dialog->price); - pdb_dialog->price = NULL; - } - if (pdb_dialog->dialog) { gtk_widget_destroy(pdb_dialog->dialog); pdb_dialog->dialog = NULL; @@ -123,37 +116,58 @@ void gnc_prices_dialog_edit_clicked (GtkWidget *widget, gpointer data) { PricesDialog *pdb_dialog = data; + GList *price_list; ENTER(" "); - if (!pdb_dialog->price) { + price_list = gnc_tree_view_price_get_selected_prices(pdb_dialog->price_tree); + if (!price_list) { LEAVE("no price selected"); return; } + if (g_list_next(!price_list)) { + LEAVE("soo many prices selected"); + return; + } - gnc_price_edit_dialog (pdb_dialog->dialog, pdb_dialog->price, GNC_PRICE_EDIT); + gnc_price_edit_dialog (pdb_dialog->dialog, price_list->data, GNC_PRICE_EDIT); + g_list_free(price_list); LEAVE(" "); } +static void +remove_helper(GNCPrice *price, GNCPriceDB *pdb) +{ + gnc_pricedb_remove_price (pdb, price); +} + void gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data) { PricesDialog *pdb_dialog = data; - const char *message = _("Are you sure you want to delete the\n" - "selected price?"); + GList *price_list; + gint length; + const char *message_sg = N_("Are you sure you want to delete the %d " + "selected price?"); + const char *message_pl = N_("Are you sure you want to delete the %d " + "selected prices?"); ENTER(" "); - if (!pdb_dialog->price) { + price_list = gnc_tree_view_price_get_selected_prices(pdb_dialog->price_tree); + if (!price_list) { LEAVE("no price selected"); return; } - if (gnc_verify_dialog (pdb_dialog->dialog, TRUE, message)) + length = g_list_length(price_list); + if (gnc_verify_dialog (pdb_dialog->dialog, TRUE, + ngettext(message_sg, message_pl, length), length)) { GNCBook *book = gnc_get_current_book (); GNCPriceDB *pdb = gnc_book_get_pricedb (book); - gnc_pricedb_remove_price (pdb, pdb_dialog->price); + g_list_foreach(price_list, (GFunc)remove_helper, pdb); } + g_list_free(price_list); LEAVE(" "); } @@ -200,9 +214,16 @@ void gnc_prices_dialog_add_clicked (GtkWidget *widget, gpointer data) { PricesDialog *pdb_dialog = data; + GNCPrice *price = NULL; + GList *price_list; ENTER(" "); - gnc_price_edit_dialog (pdb_dialog->dialog, pdb_dialog->price, GNC_PRICE_NEW); + price_list = gnc_tree_view_price_get_selected_prices(pdb_dialog->price_tree); + if (price_list) { + price = price_list->data; + g_list_free(price_list); + } + gnc_price_edit_dialog (pdb_dialog->dialog, price, GNC_PRICE_NEW); LEAVE(" "); } @@ -238,22 +259,18 @@ gnc_prices_dialog_selection_changed (GtkTreeSelection *treeselection, gpointer data) { PricesDialog *pdb_dialog = data; + GList *price_list; + gint length; ENTER(" "); - if (pdb_dialog->price) - gnc_price_unref (pdb_dialog->price); - - pdb_dialog->price = - gnc_tree_view_price_get_selected_price (pdb_dialog->price_tree); - - if (pdb_dialog->price) - gnc_price_ref (pdb_dialog->price); + price_list = gnc_tree_view_price_get_selected_prices(pdb_dialog->price_tree); + length = g_list_length(price_list); gtk_widget_set_sensitive (pdb_dialog->edit_button, - pdb_dialog->price != NULL); + length == 1); gtk_widget_set_sensitive (pdb_dialog->remove_button, - pdb_dialog->price != NULL); - LEAVE(" "); + length >= 1); + LEAVE("%d prices selected", length); } @@ -347,6 +364,7 @@ gnc_prices_dialog_create (GtkWidget * parent, PricesDialog *pdb_dialog) pdb_dialog, NULL); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (gnc_prices_dialog_selection_changed), pdb_dialog);