[import-main-matcher] 1 dialog to edit all 3 fields

This commit is contained in:
Christopher Lam 2022-07-13 23:55:46 +08:00
parent 3db8c56a90
commit fb6091fb3e

View File

@ -80,6 +80,11 @@ struct _main_matcher_info
GSList* temp_trans_list; // Temporary list of imported transactions GSList* temp_trans_list; // Temporary list of imported transactions
GHashTable* acct_id_hash; // Hash table, per account, of list of transaction IDs. GHashTable* acct_id_hash; // Hash table, per account, of list of transaction IDs.
GSList* edited_accounts; // List of accounts currently edited. GSList* edited_accounts; // List of accounts currently edited.
/* only when editing fields */
gboolean edit_desc;
gboolean edit_notes;
gboolean edit_memo;
}; };
enum downloaded_cols enum downloaded_cols
@ -889,13 +894,6 @@ gnc_gen_trans_assign_transfer_account_to_selection_cb (GtkMenuItem *menuitem,
LEAVE(""); LEAVE("");
} }
typedef enum
{
DESCRIPTION,
MEMO,
NOTES,
} edit_field;
typedef struct typedef struct
{ {
Split *split; Split *split;
@ -929,16 +927,79 @@ static RowInfo * row_get_info (gpointer row, GNCImportMainMatcher *info)
return retval; return retval;
} }
static gboolean
input_new_fields (GtkWidget *parent, RowInfo *info, GtkTreeStore *store,
gboolean edit_desc, gboolean edit_notes, gboolean edit_memo,
char **new_desc, char **new_notes, char **new_memo)
{
GtkWidget *desc_entry, *notes_entry, *memo_entry, *label, *grid;
GtkWidget *dialog =
gtk_dialog_new_with_buttons ("Edit imported transaction details",
GTK_WINDOW (parent),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
_("_OK"), GTK_RESPONSE_ACCEPT,
_("_Cancel"), GTK_RESPONSE_REJECT,
NULL);
GtkWidget *content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
gboolean retval;
grid = gtk_grid_new ();
label = gtk_label_new ("Description");
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
desc_entry = gtk_entry_new ();
gtk_widget_set_halign (desc_entry, GTK_ALIGN_START);
gtk_widget_set_sensitive (desc_entry, edit_desc);
gtk_entry_set_text (GTK_ENTRY (desc_entry), xaccTransGetDescription (info->trans));
gtk_grid_attach (GTK_GRID (grid), desc_entry, 1, 0, 1, 1);
label = gtk_label_new ("Notes");
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
notes_entry = gtk_entry_new ();
gtk_widget_set_halign (notes_entry, GTK_ALIGN_START);
gtk_widget_set_sensitive (notes_entry, edit_notes);
gtk_entry_set_text (GTK_ENTRY (notes_entry), xaccTransGetNotes (info->trans));
gtk_grid_attach (GTK_GRID (grid), notes_entry, 1, 1, 1, 1);
label = gtk_label_new ("Memo");
gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
memo_entry = gtk_entry_new ();
gtk_widget_set_halign (memo_entry, GTK_ALIGN_START);
gtk_widget_set_sensitive (memo_entry, edit_memo);
gtk_entry_set_text (GTK_ENTRY (memo_entry), xaccSplitGetMemo (info->split));
gtk_grid_attach (GTK_GRID (grid), memo_entry, 1, 2, 1, 1);
gtk_container_add_with_properties (GTK_CONTAINER (content_area), grid,
"position", 1, NULL);
// run the dialog
gtk_widget_show_all (grid);
retval = (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT);
if (retval)
{
*new_desc = g_strdup (gtk_entry_get_text (GTK_ENTRY (desc_entry)));
*new_notes = g_strdup (gtk_entry_get_text (GTK_ENTRY (notes_entry)));
*new_memo = g_strdup (gtk_entry_get_text (GTK_ENTRY (memo_entry)));
}
gtk_widget_destroy (dialog);
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)
{ {
GtkTreeView *treeview; GtkTreeView *treeview;
GtkTreeSelection *selection; GtkTreeSelection *selection;
GtkTreeModel *model; GtkTreeModel *model;
GList *selected_rows, *row_info_list; GList *selected_rows, *row_info_list;
GtkTreeStore* store; GtkTreeStore* store;
Transaction* trans; char *new_desc, *new_notes, *new_memo;
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");
@ -956,86 +1017,42 @@ gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info,
} }
row_info_list = gnc_g_list_map (selected_rows, (GncGMapFunc) row_get_info, info); row_info_list = gnc_g_list_map (selected_rows, (GncGMapFunc) row_get_info, info);
trans = ((RowInfo*)row_info_list->data)->trans;
switch (field) if (input_new_fields (info->main_widget, row_info_list->data, store,
info->edit_desc, info->edit_notes, info->edit_memo,
&new_desc, &new_notes, &new_memo))
{ {
case DESCRIPTION: for (GList *n = row_info_list; n; n = g_list_next (n))
{ {
char* new_field = RowInfo *row = n->data;
gnc_input_dialog_with_entry(info->main_widget, "", if (info->edit_desc)
_("Enter new Description"),
xaccTransGetDescription (trans));
if (!new_field) break;
for (GList *n = row_info_list; n; n = g_list_next (n))
{ {
RowInfo *info = n->data; gtk_tree_store_set (store, &row->iter,
xaccTransSetDescription (info->trans, new_field); DOWNLOADED_COL_DESCRIPTION, new_desc,
gtk_tree_store_set (store, &info->iter,
DOWNLOADED_COL_DESCRIPTION, new_field,
-1); -1);
xaccTransSetDescription (row->trans, new_desc);
} }
g_free (new_field);
break; if (info->edit_notes)
} xaccTransSetNotes (row->trans, new_notes);
case MEMO:
{ if (info->edit_memo)
Split *first_split = xaccTransGetSplit (trans, 0);
char *new_field =
gnc_input_dialog_with_entry(info->main_widget, "",
_("Enter new Memo"),
xaccSplitGetMemo (first_split));
if (!new_field) break;
for (GList *n = row_info_list; n; n = g_list_next (n))
{ {
RowInfo *info = n->data; gtk_tree_store_set (store, &row->iter,
xaccSplitSetMemo (info->split, new_field); DOWNLOADED_COL_MEMO, new_memo,
gtk_tree_store_set (store, &info->iter,
DOWNLOADED_COL_MEMO, new_field,
-1); -1);
xaccSplitSetMemo (row->split, new_memo);
} }
g_free (new_field);
break;
}
case NOTES:
{
char* new_field =
gnc_input_dialog_with_entry(info->main_widget, "",
_("Enter new Notes"),
xaccTransGetNotes (trans));
if (!new_field) break;
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);
break;
} }
g_free (new_desc);
g_free (new_memo);
g_free (new_notes);
} }
g_list_free_full (row_info_list, (GDestroyNotify)rowinfo_free); 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("");
} }
static void
gnc_gen_trans_edit_description_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
{
gnc_gen_trans_edit_fields (menuitem, info, DESCRIPTION);
}
static void
gnc_gen_trans_edit_memo_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
{
gnc_gen_trans_edit_fields (menuitem, info, MEMO);
}
static void
gnc_gen_trans_edit_notes_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
{
gnc_gen_trans_edit_fields (menuitem, info, NOTES);
}
static void static void
gnc_gen_trans_reset_edits_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info) gnc_gen_trans_reset_edits_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info)
{ {
@ -1170,7 +1187,6 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
GtkTreeSelection *selection; GtkTreeSelection *selection;
GList *selected_rows; GList *selected_rows;
const char *desc, *memo, *notes; const char *desc, *memo, *notes;
gboolean edit_desc = TRUE, edit_notes = TRUE, edit_memo = TRUE;
gboolean has_edits = FALSE; gboolean has_edits = FALSE;
ENTER (""); ENTER ("");
@ -1187,7 +1203,14 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
model = gtk_tree_view_get_model (treeview); model = gtk_tree_view_get_model (treeview);
selection = gtk_tree_view_get_selection (treeview); selection = gtk_tree_view_get_selection (treeview);
selected_rows = gtk_tree_selection_get_selected_rows (selection, &model); selected_rows = gtk_tree_selection_get_selected_rows (selection, &model);
for (GList *n = selected_rows; (edit_desc || edit_notes || edit_memo) && n;
/* initialise */
info->edit_desc = TRUE;
info->edit_notes = TRUE;
info->edit_memo = TRUE;
for (GList *n = selected_rows;
(!has_edits || info->edit_desc || info->edit_notes || info->edit_memo) && n;
n = g_list_next(n)) n = g_list_next(n))
{ {
RowInfo *rowinfo = row_get_info (n->data, info); RowInfo *rowinfo = row_get_info (n->data, info);
@ -1206,33 +1229,20 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview,
rowinfo_free (rowinfo); rowinfo_free (rowinfo);
continue; continue;
} }
if (edit_desc && g_strcmp0 (desc, xaccTransGetDescription (rowinfo->trans))) if (info->edit_desc && g_strcmp0 (desc, xaccTransGetDescription (rowinfo->trans)))
edit_desc = FALSE; info->edit_desc = FALSE;
if (edit_notes && g_strcmp0 (notes, xaccTransGetNotes (rowinfo->trans))) if (info->edit_notes && g_strcmp0 (notes, xaccTransGetNotes (rowinfo->trans)))
edit_notes = FALSE; info->edit_notes = FALSE;
if (edit_memo && g_strcmp0 (memo, xaccSplitGetMemo (rowinfo->split))) if (info->edit_memo && g_strcmp0 (memo, xaccSplitGetMemo (rowinfo->split)))
edit_memo = FALSE; info->edit_memo = FALSE;
rowinfo_free (rowinfo); rowinfo_free (rowinfo);
} }
menuitem = gtk_menu_item_new_with_label (_("Edit description.")); menuitem = gtk_menu_item_new_with_label (_("Edit description, notes, memo."));
gtk_widget_set_sensitive (menuitem, edit_desc); gtk_widget_set_sensitive (menuitem,
info->edit_desc || info->edit_notes || info->edit_memo);
g_signal_connect (menuitem, "activate", g_signal_connect (menuitem, "activate",
G_CALLBACK (gnc_gen_trans_edit_description_cb), G_CALLBACK (gnc_gen_trans_edit_fields),
info);
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);
menuitem = gtk_menu_item_new_with_label (_("Edit memo."));
gtk_widget_set_sensitive (menuitem, edit_memo);
g_signal_connect (menuitem, "activate",
G_CALLBACK (gnc_gen_trans_edit_memo_cb),
info);
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);
menuitem = gtk_menu_item_new_with_label (_("Edit notes."));
gtk_widget_set_sensitive (menuitem, edit_notes);
g_signal_connect (menuitem, "activate",
G_CALLBACK (gnc_gen_trans_edit_notes_cb),
info); info);
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem);