mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Enable the "Duplicate Invoice" button even for multiple selected items.
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@21623 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
6d56a869fa
commit
a5caa69df9
@ -2586,7 +2586,7 @@ duplicate_invoice_direct (gpointer invoice, gpointer user_data)
|
||||
static void
|
||||
duplicate_invoice_cb (gpointer *invoice_p, gpointer user_data)
|
||||
{
|
||||
g_return_if_fail (invoice_p && user_data);
|
||||
g_return_if_fail (invoice_p); // && user_data);
|
||||
if (! *invoice_p)
|
||||
return;
|
||||
duplicate_invoice_direct (*invoice_p, user_data);
|
||||
@ -2594,16 +2594,30 @@ duplicate_invoice_cb (gpointer *invoice_p, gpointer user_data)
|
||||
|
||||
static void multi_duplicate_invoice_one(gpointer data, gpointer user_data)
|
||||
{
|
||||
GncInvoice *invoice = data;
|
||||
if (invoice)
|
||||
gnc_ui_invoice_duplicate(invoice, FALSE);
|
||||
GncInvoice *old_invoice = data;
|
||||
if (old_invoice)
|
||||
{
|
||||
GncInvoice *new_invoice;
|
||||
// In this simplest form, we just use the existing duplication
|
||||
// algorithm, only without opening the "edit invoice" window for editing
|
||||
// the number etc. for each of the invoices.
|
||||
InvoiceWindow *iw = gnc_ui_invoice_duplicate(old_invoice, FALSE);
|
||||
// FIXME: Now we could use this invoice and manipulate further data.
|
||||
g_assert(iw);
|
||||
new_invoice = iw->created_invoice;
|
||||
//g_assert(new_invoice); // FIXME: This is NULL?!?
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
multi_duplicate_invoice_cb (GList *invoice_list, gpointer user_data)
|
||||
{
|
||||
g_return_if_fail (invoice_list && user_data);
|
||||
g_list_foreach(invoice_list, multi_duplicate_invoice_one, NULL);
|
||||
g_return_if_fail (invoice_list);
|
||||
|
||||
// Note: If we want to have a more sophisticated duplication, we might want
|
||||
// to ask for particular data right here, then insert this data upon
|
||||
// duplication.
|
||||
g_list_foreach(invoice_list, multi_duplicate_invoice_one, user_data);
|
||||
}
|
||||
|
||||
static gpointer
|
||||
|
@ -75,7 +75,6 @@ struct _GNCSearchWindow
|
||||
GtkWidget * result_list;
|
||||
gpointer selected_item;
|
||||
GList *selected_item_list;
|
||||
GTree *selected_row_btree;
|
||||
|
||||
/* The search_type radio-buttons */
|
||||
GtkWidget * new_rb;
|
||||
@ -140,27 +139,43 @@ static void gnc_search_dialog_display_results (GNCSearchWindow *sw);
|
||||
|
||||
/** The callback for converting the row numbers from a GTree to actual item
|
||||
pointers in a GList */
|
||||
static gboolean cb_tree_to_itemlist (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
static void cb_tree_to_itemlist (gpointer element,
|
||||
gpointer user_data)
|
||||
{
|
||||
GNCSearchWindow *sw = user_data;
|
||||
gpointer item = gtk_clist_get_row_data (GTK_CLIST(sw->result_list), GPOINTER_TO_INT(key));
|
||||
gint row_number = GPOINTER_TO_INT(element);
|
||||
gpointer item = gtk_clist_get_row_data (GTK_CLIST(sw->result_list), row_number);
|
||||
sw->selected_item_list = g_list_prepend(sw->selected_item_list, item);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_search_callback_button_execute (GNCSearchCallbackButton *cb,
|
||||
GNCSearchWindow *sw)
|
||||
{
|
||||
GNCQueryList* gql = GNC_QUERY_LIST(sw->result_list);
|
||||
GtkCList* clist;
|
||||
|
||||
// Sanity check
|
||||
g_assert(gql);
|
||||
clist = &gql->clist;
|
||||
g_assert(clist->selection_mode == GTK_SELECTION_MULTIPLE);
|
||||
|
||||
// Do we have a callback for multi-selections, and also more than one selected item?
|
||||
if (cb->cb_multiselect_fn && (g_tree_nnodes(sw->selected_row_btree) > 1))
|
||||
if (cb->cb_multiselect_fn && g_list_length(clist->selection) > 1)
|
||||
{
|
||||
GList *selected_rows_list = clist->selection;
|
||||
// Yes, use the multi-selection callback
|
||||
|
||||
// Obtain the GncInvoice pointer for each selected row
|
||||
sw->selected_item_list = NULL;
|
||||
g_tree_foreach(sw->selected_row_btree, cb_tree_to_itemlist, sw);
|
||||
g_list_foreach(selected_rows_list, cb_tree_to_itemlist, sw);
|
||||
// We use g_list_prepend (for performance reasons), so we have to reverse once here
|
||||
sw->selected_item_list = g_list_reverse(sw->selected_item_list);
|
||||
|
||||
// Call the callback
|
||||
(cb->cb_multiselect_fn)(sw->selected_item_list, sw->user_data);
|
||||
|
||||
// And clean up again
|
||||
g_list_free(sw->selected_item_list);
|
||||
sw->selected_item_list = NULL;
|
||||
}
|
||||
@ -241,9 +256,6 @@ gnc_search_dialog_select_row_cb (GtkCList *clist, gint row, gint column,
|
||||
sw->selected_item = gtk_clist_get_row_data (clist, row);
|
||||
//g_message("select-row, row=%d", row);
|
||||
|
||||
// Keep note of the selection of this row
|
||||
g_tree_insert(sw->selected_row_btree, GINT_TO_POINTER(row), NULL);
|
||||
|
||||
/* If we double-click an item, then either "select" it, or run it
|
||||
* through the first button (which should be view/edit
|
||||
*/
|
||||
@ -269,9 +281,6 @@ gnc_search_dialog_unselect_row_cb (GtkCList *clist, gint row, gint column,
|
||||
gpointer item = gtk_clist_get_row_data (clist, row);
|
||||
//g_message("unselect-row, row=%d", row);
|
||||
|
||||
// Remove this row from the noted selection
|
||||
g_tree_remove(sw->selected_row_btree, GINT_TO_POINTER(row));
|
||||
|
||||
if (sw->selected_item == item)
|
||||
sw->selected_item = NULL;
|
||||
}
|
||||
@ -281,10 +290,9 @@ static void
|
||||
gnc_search_dialog_init_result_list (GNCSearchWindow *sw)
|
||||
{
|
||||
sw->result_list = gnc_query_list_new(sw->display_list, sw->q);
|
||||
//#if GTK_CHECK_VERSION(2, 24, 0)
|
||||
// // Apparently the multi-selection mode of GtkCList is broken in gtk-2.20
|
||||
// gtk_clist_set_selection_mode(GTK_CLIST(sw->result_list), GTK_SELECTION_MULTIPLE);
|
||||
//#endif
|
||||
|
||||
// We want the multi-selection mode of GtkCList.
|
||||
gtk_clist_set_selection_mode(&GNC_QUERY_LIST(sw->result_list)->clist, GTK_SELECTION_MULTIPLE);
|
||||
|
||||
/* Setup the list callbacks */
|
||||
g_signal_connect (G_OBJECT (sw->result_list), "select-row",
|
||||
@ -1085,7 +1093,6 @@ gnc_search_dialog_destroy (GNCSearchWindow *sw)
|
||||
if (!sw) return;
|
||||
if (sw->gconf_section)
|
||||
gnc_save_window_size(sw->gconf_section, GTK_WINDOW(sw->dialog));
|
||||
g_tree_destroy(sw->selected_row_btree);
|
||||
gnc_close_gui_component (sw->component_id);
|
||||
}
|
||||
|
||||
@ -1097,12 +1104,6 @@ gnc_search_dialog_raise (GNCSearchWindow *sw)
|
||||
gtk_window_present (GTK_WINDOW(sw->dialog));
|
||||
}
|
||||
|
||||
static gint
|
||||
my_comparefunc_gint(gconstpointer a, gconstpointer b)
|
||||
{
|
||||
return GPOINTER_TO_INT(a) < GPOINTER_TO_INT(b);
|
||||
}
|
||||
|
||||
GNCSearchWindow *
|
||||
gnc_search_dialog_create (QofIdTypeConst obj_type, const gchar *title,
|
||||
GList *param_list,
|
||||
@ -1139,8 +1140,6 @@ gnc_search_dialog_create (QofIdTypeConst obj_type, const gchar *title,
|
||||
sw->gconf_section = gconf_section;
|
||||
sw->type_label = type_label;
|
||||
|
||||
sw->selected_row_btree = g_tree_new(my_comparefunc_gint);
|
||||
|
||||
/* Grab the get_guid function */
|
||||
sw->get_guid = qof_class_get_parameter (sw->search_for, QOF_PARAM_GUID);
|
||||
if (start_query)
|
||||
|
Loading…
Reference in New Issue
Block a user