[import-main-matcher] further refinement to edit multiple rows

but is only enabled iff the desc/notes/memo to be renamed are
identical.
This commit is contained in:
Christopher Lam 2022-07-09 20:24:36 +08:00
parent 892b80f685
commit fac0cde7a2

View File

@ -894,6 +894,30 @@ typedef enum
NOTES, NOTES,
} edit_field; } edit_field;
typedef struct
{
Split *split;
Transaction *trans;
GtkTreeIter iter;
} RowInfo;
static void rowinfo_free (RowInfo* info)
{
g_free (info);
}
static RowInfo * row_get_info (gpointer row, GNCImportMainMatcher *info)
{
GNCImportTransInfo *trans_info;
GtkTreeModel *model = gtk_tree_view_get_model (info->view);
RowInfo *retval = g_new (RowInfo, 1);
gtk_tree_model_get_iter (model, &retval->iter, row);
gtk_tree_model_get (model, &retval->iter, DOWNLOADED_COL_DATA, &trans_info, -1);
retval->trans = gnc_import_TransInfo_get_trans (trans_info);
retval->split = gnc_import_TransInfo_get_fsplit (trans_info);
return retval;
}
static void static void
gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info, gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
edit_field field) edit_field field)
@ -901,12 +925,9 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
GtkTreeView *treeview; GtkTreeView *treeview;
GtkTreeSelection *selection; GtkTreeSelection *selection;
GtkTreeModel *model; GtkTreeModel *model;
GList *selected_rows; GList *selected_rows, *row_info_list;
GList *refs = NULL;
GtkTreeStore* store; GtkTreeStore* store;
GNCImportTransInfo *trans_info;
Transaction* trans; Transaction* trans;
GtkTreeIter iter;
g_return_if_fail (info != NULL); g_return_if_fail (info != NULL);
ENTER("assign_transfer_account_to_selection_cb"); ENTER("assign_transfer_account_to_selection_cb");
@ -923,18 +944,8 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
return; return;
} }
if (selected_rows->next) row_info_list = gnc_g_list_map (selected_rows, (GncGMapFunc) row_get_info, info);
{ trans = ((RowInfo*)row_info_list->data)->trans;
LEAVE ("User selected multiple rows, not supported");
return;
}
g_return_if_fail (gtk_tree_model_get_iter (model, &iter,
selected_rows->data));
gtk_tree_model_get (model, &iter, DOWNLOADED_COL_DATA,
&trans_info, -1);
trans = gnc_import_TransInfo_get_trans (trans_info);
switch (field) switch (field)
{ {
@ -945,24 +956,33 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
_("Enter new Description"), _("Enter new Description"),
xaccTransGetDescription (trans)); xaccTransGetDescription (trans));
if (!new_field) break; if (!new_field) break;
xaccTransSetDescription (trans, new_field); for (GList *n = row_info_list; n; n = g_list_next (n))
gtk_tree_store_set (store, &iter, DOWNLOADED_COL_DESCRIPTION, {
new_field, -1); RowInfo *info = n->data;
xaccTransSetDescription (info->trans, new_field);
gtk_tree_store_set (store, &info->iter,
DOWNLOADED_COL_DESCRIPTION, new_field,
-1);
}
g_free (new_field); g_free (new_field);
break; break;
} }
case MEMO: case MEMO:
{ {
Split *first_split = Split *first_split = xaccTransGetSplit (trans, 0);
gnc_import_TransInfo_get_fsplit (trans_info);
char *new_field = char *new_field =
gnc_input_dialog_with_entry(info->main_widget, "", gnc_input_dialog_with_entry(info->main_widget, "",
_("Enter new Memo"), _("Enter new Memo"),
xaccSplitGetMemo (first_split)); xaccSplitGetMemo (first_split));
if (!new_field) break; if (!new_field) break;
xaccSplitSetMemo (first_split, new_field); for (GList *n = row_info_list; n; n = g_list_next (n))
gtk_tree_store_set (store, &iter, {
DOWNLOADED_COL_MEMO, new_field, -1); RowInfo *info = n->data;
xaccSplitSetMemo (info->split, new_field);
gtk_tree_store_set (store, &info->iter,
DOWNLOADED_COL_MEMO, new_field,
-1);
}
g_free (new_field); g_free (new_field);
break; break;
} }
@ -973,11 +993,16 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
_("Enter new Notes"), _("Enter new Notes"),
xaccTransGetNotes (trans)); xaccTransGetNotes (trans));
if (!new_field) break; if (!new_field) break;
xaccTransSetNotes (trans, new_field); for (GList *n = row_info_list; n; n = g_list_next (n))
{
RowInfo *info = n->data;
xaccTransSetNotes (info->trans, new_field);
}
g_free (new_field); g_free (new_field);
break; break;
} }
} }
g_list_free_full (row_info_list, (GDestroyNotify)rowinfo_free);
g_list_free_full (selected_rows, (GDestroyNotify)gtk_tree_path_free); g_list_free_full (selected_rows, (GDestroyNotify)gtk_tree_path_free);
LEAVE(""); LEAVE("");
} }
@ -1092,6 +1117,11 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
{ {
GtkWidget *menu, *menuitem; GtkWidget *menu, *menuitem;
GdkEventButton *event_button; GdkEventButton *event_button;
GtkTreeModel *model;
GtkTreeSelection *selection;
GList *selected_rows;
const char *desc, *memo, *notes;
gboolean edit_desc = TRUE, edit_notes = TRUE, edit_memo = TRUE;
ENTER (""); ENTER ("");
menu = gtk_menu_new(); menu = gtk_menu_new();
@ -1104,7 +1134,31 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
DEBUG("Callback to assign destination account to selection connected"); DEBUG("Callback to assign destination account to selection connected");
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);
if (show_edit_actions) model = gtk_tree_view_get_model (treeview);
selection = gtk_tree_view_get_selection (treeview);
selected_rows = gtk_tree_selection_get_selected_rows (selection, &model);
for (GList *n = selected_rows; (edit_desc || edit_notes || edit_memo) && n;
n = g_list_next(n))
{
RowInfo *rowinfo = row_get_info (n->data, info);
if (!n->prev) /* only the first row */
{
desc = xaccTransGetDescription (rowinfo->trans);
notes = xaccTransGetNotes (rowinfo->trans);
memo = xaccSplitGetMemo (rowinfo->split);
rowinfo_free (rowinfo);
continue;
}
if (edit_desc && g_strcmp0 (desc, xaccTransGetDescription (rowinfo->trans)))
edit_desc = FALSE;
if (edit_notes && g_strcmp0 (notes, xaccTransGetNotes (rowinfo->trans)))
edit_notes = FALSE;
if (edit_memo && g_strcmp0 (memo, xaccSplitGetMemo (rowinfo->split)))
edit_memo = FALSE;
rowinfo_free (rowinfo);
}
if (edit_desc)
{ {
menuitem = gtk_menu_item_new_with_label ( menuitem = gtk_menu_item_new_with_label (
_("Edit description.")); _("Edit description."));
@ -1113,7 +1167,10 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
info); info);
DEBUG("Callback to edit description"); DEBUG("Callback to edit description");
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);
}
if (edit_memo)
{
menuitem = gtk_menu_item_new_with_label ( menuitem = gtk_menu_item_new_with_label (
_("Edit memo.")); _("Edit memo."));
g_signal_connect (menuitem, "activate", g_signal_connect (menuitem, "activate",
@ -1121,7 +1178,10 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
info); info);
DEBUG("Callback to edit memo"); DEBUG("Callback to edit memo");
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);
}
if (edit_notes)
{
menuitem = gtk_menu_item_new_with_label ( menuitem = gtk_menu_item_new_with_label (
_("Edit notes.")); _("Edit notes."));
g_signal_connect (menuitem, "activate", g_signal_connect (menuitem, "activate",
@ -1135,6 +1195,7 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
/* Note: event can be NULL here when called from view_onPopupMenu; */ /* Note: event can be NULL here when called from view_onPopupMenu; */
gtk_menu_popup_at_pointer (GTK_MENU(menu), (GdkEvent*)event); gtk_menu_popup_at_pointer (GTK_MENU(menu), (GdkEvent*)event);
g_list_free_full (selected_rows, (GDestroyNotify)gtk_tree_path_free);
LEAVE (""); LEAVE ("");
} }
@ -1160,9 +1221,7 @@ gnc_gen_trans_onButtonPressed_cb (GtkTreeView *treeview,
// or the selected transaction is an ADD. // or the selected transaction is an ADD.
selection = gtk_tree_view_get_selection (treeview); selection = gtk_tree_view_get_selection (treeview);
count = gtk_tree_selection_count_selected_rows (selection); count = gtk_tree_selection_count_selected_rows (selection);
if (count > 1) if (count > 0)
gnc_gen_trans_view_popup_menu (treeview, event, info, FALSE);
else if (count > 0)
{ {
GList* selected; GList* selected;
GtkTreeModel *model; GtkTreeModel *model;