From 6e83494008347d172bc567c76f58a4e60c323dad Mon Sep 17 00:00:00 2001 From: Robert Fewell <14uBobIT@gmail.com> Date: Mon, 18 May 2020 17:00:47 +0100 Subject: [PATCH] Add opening the transaction association from register sheet. Add option to open transaction association by clicking on the association in the association cell. --- gnucash/gnome/gnc-split-reg.c | 31 +++++++++++++++++++ .../register-gnome/gnucash-register.c | 15 +++++++++ .../register-gnome/gnucash-register.h | 2 ++ .../register/register-gnome/gnucash-sheet.c | 7 +++++ .../register/register-gnome/gnucash-sheetP.h | 3 ++ 5 files changed, 58 insertions(+) diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c index eae824c273..926d6e92d8 100644 --- a/gnucash/gnome/gnc-split-reg.c +++ b/gnucash/gnome/gnc-split-reg.c @@ -119,6 +119,7 @@ void gsr_default_reverse_txn_handler ( GNCSplitReg *w, gpointer ud ); void gsr_default_associate_handler ( GNCSplitReg *w ); void gsr_default_associate_open_handler ( GNCSplitReg *w ); void gsr_default_associate_remove_handler ( GNCSplitReg *w ); +static void gsr_default_associate_from_sheet_handler ( GNCSplitReg *w ); static void gsr_emit_simple_signal ( GNCSplitReg *gsr, const char *sigName ); static void gsr_emit_help_changed ( GnucashRegister *reg, gpointer user_data ); @@ -578,6 +579,11 @@ gsr_create_table( GNCSplitReg *gsr ) gtk_box_pack_start (GTK_BOX (gsr), GTK_WIDGET(gsr->reg), TRUE, TRUE, 0); gnucash_sheet_set_window (gnucash_register_get_sheet (gsr->reg), gsr->window); + + // setup the callback for when the associate cell clicked on + gnucash_register_set_open_assoc_cb (gsr->reg, + (GFunc)gsr_default_associate_from_sheet_handler, gsr); + gtk_widget_show ( GTK_WIDGET(gsr->reg) ); g_signal_connect (gsr->reg, "activate_cursor", G_CALLBACK(gnc_split_reg_record_cb), gsr); @@ -1435,6 +1441,31 @@ gsr_default_associate_remove_handler (GNCSplitReg *gsr) xaccTransSetAssociation (trans, ""); } +static void +gsr_default_associate_from_sheet_handler (GNCSplitReg *gsr) +{ + CursorClass cursor_class; + SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger); + Transaction *trans; + Split *split; + gchar *uri = NULL; + + /* get the current split based on cursor position */ + split = gnc_split_register_get_current_split (reg); + if (!split) + return; + + trans = xaccSplitGetParent (split); + + // fix an earlier error when storing relative paths before version 3.5 + uri = gnc_assoc_convert_trans_associate_uri (trans, gsr->read_only); + + if (uri) + gnc_assoc_open_uri (GTK_WINDOW (gsr->window), uri); + + g_free (uri); +} + void gsr_default_delete_handler( GNCSplitReg *gsr, gpointer data ) { diff --git a/gnucash/register/register-gnome/gnucash-register.c b/gnucash/register/register-gnome/gnucash-register.c index 37e8920980..2e89f56928 100644 --- a/gnucash/register/register-gnome/gnucash-register.c +++ b/gnucash/register/register-gnome/gnucash-register.c @@ -644,3 +644,18 @@ GnucashSheet *gnucash_register_get_sheet (GnucashRegister *reg) return GNUCASH_SHEET(reg->sheet); } + +void +gnucash_register_set_open_assoc_cb (GnucashRegister *reg, + GFunc cb, gpointer cb_data) +{ + GnucashSheet *sheet; + + if (!reg || !reg->sheet) + return; + sheet = GNUCASH_SHEET(reg->sheet); + sheet->open_assoc_cb = cb; + sheet->open_assoc_cb_data = cb_data; +} + + diff --git a/gnucash/register/register-gnome/gnucash-register.h b/gnucash/register/register-gnome/gnucash-register.h index 968dbd8cf6..adb21d87be 100644 --- a/gnucash/register/register-gnome/gnucash-register.h +++ b/gnucash/register/register-gnome/gnucash-register.h @@ -81,6 +81,8 @@ void gnucash_register_paste_clipboard (GnucashRegister *reg); void gnucash_register_refresh_from_prefs (GnucashRegister *reg); void gnucash_register_set_moved_cb (GnucashRegister *reg, GFunc cb, gpointer cb_data); +void gnucash_register_set_open_assoc_cb (GnucashRegister *reg, + GFunc cb, gpointer cb_data); GnucashSheet *gnucash_register_get_sheet (GnucashRegister *reg); void gnucash_register_reset_sheet_layout (GnucashRegister *reg); diff --git a/gnucash/register/register-gnome/gnucash-sheet.c b/gnucash/register/register-gnome/gnucash-sheet.c index b1ea6d2b8f..fb688994af 100644 --- a/gnucash/register/register-gnome/gnucash-sheet.c +++ b/gnucash/register/register-gnome/gnucash-sheet.c @@ -1514,6 +1514,13 @@ gnucash_sheet_button_press_event (GtkWidget *widget, GdkEventButton *event) //FIXME does something need to be done if changed_cells is true or false ? gnucash_sheet_cursor_move (sheet, new_virt_loc); + // if clicked in associate cell, run call back + if (g_strcmp0 (gnc_table_get_cell_name (table, new_virt_loc), ASSOC_CELL) == 0) + { + if (sheet->open_assoc_cb) + (sheet->open_assoc_cb)(sheet->open_assoc_cb_data, NULL); + } + if (button_1) gnucash_sheet_check_grab (sheet); diff --git a/gnucash/register/register-gnome/gnucash-sheetP.h b/gnucash/register/register-gnome/gnucash-sheetP.h index fa3370abbf..cd132bdbb0 100644 --- a/gnucash/register/register-gnome/gnucash-sheetP.h +++ b/gnucash/register/register-gnome/gnucash-sheetP.h @@ -95,6 +95,9 @@ struct _GnucashSheet GFunc moved_cb; gpointer moved_cb_data; + GFunc open_assoc_cb; + gpointer open_assoc_cb_data; + guint shift_state; guint keyval_state; gboolean direct_update_cell; /** Indicates that this cell has special operation keys. */