From fd565429ac049006a49475e98cd37ccbcaf3c7ee Mon Sep 17 00:00:00 2001 From: Derek Atkins Date: Tue, 27 May 2003 02:12:38 +0000 Subject: [PATCH] * src/register/ledger-core/dialog-dup-trans.c: If the "number" is set to 0, then empty out the entry. Considering the SpinButton wants to force a digit, this lets you set an empty number if you accidentally tab into and out of the number field. This also means you cannot have a check numbered '0', but that is probably a reasonable limitation. Fixes #109610. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/1.8@8412 57a11ea4-9604-0410-9ed3-97b8803252fd --- ChangeLog | 7 +++ src/register/ledger-core/dialog-dup-trans.c | 57 +++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/ChangeLog b/ChangeLog index f973768878..d84dfaffcc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2003-05-26 Derek Atkins + * src/register/ledger-core/dialog-dup-trans.c: If the "number" is + set to 0, then empty out the entry. Considering the SpinButton + wants to force a digit, this lets you set an empty number if you + accidentally tab into and out of the number field. This also + means you cannot have a check numbered '0', but that is probably + a reasonable limitation. Fixes #109610. + * src/business/business-core/gncInvoice.[ch]: define INVOICE_IS_PAID and create gncInvoiceIsPaid() function (the prototype already existed, but it was never implemented). diff --git a/src/register/ledger-core/dialog-dup-trans.c b/src/register/ledger-core/dialog-dup-trans.c index 80f65efa4d..b98b509942 100644 --- a/src/register/ledger-core/dialog-dup-trans.c +++ b/src/register/ledger-core/dialog-dup-trans.c @@ -40,6 +40,8 @@ typedef struct { GtkWidget * dialog; + gboolean focus_out; + GtkWidget * date_edit; GtkWidget * num_edit; } DupTransDialog; @@ -70,6 +72,56 @@ parse_num (const char *string, long int *num) return TRUE; } +/* + * This code works around an annoying bug in the SpinButton -- as soon + * as you focus into the spin button it wants to force a digit to + * appear and there is nothing the user can do. Once you focus in, + * the user cannot make the spin button entry be empty. + * + * To make matters worse, the spin button draws this number AFTER a + * focus-out event, so we can't just use that event to clear it out. + * + * To work around this problem we hook into two signals, focus-out and + * draw. The focus-out event lets us know when we leave the + * spinbutton entry, and we set a flag to remember this fact, and also + * queue a redraw (just to be sure). The draw event happens more + * frequently, but also happens after the spin button digitizes + * itself. So when we hit a draw event we can check the flag and if + * it's set we can potentially empty out the entry. + * + * This also means you cannot have a check numbered "0", but that is + * probably a reasonable limitation. + */ +static void +gnc_dup_trans_focus_out_cb (GtkSpinButton *button, GdkEventFocus *event, + gpointer user_data) +{ + DupTransDialog *dt_dialog = user_data; + + g_return_if_fail(GTK_IS_SPIN_BUTTON(button)); + if (!dt_dialog) return; + + dt_dialog->focus_out = TRUE; + gtk_widget_queue_draw(GTK_WIDGET(button)); +} + +static void +gnc_dup_trans_draw_cb (GtkSpinButton *button, GdkRectangle *unused, gpointer data) +{ + DupTransDialog *dt_dialog = data; + + g_return_if_fail(GTK_IS_SPIN_BUTTON(button)); + if (!dt_dialog) return; + + if (!dt_dialog->focus_out) + return; + + dt_dialog->focus_out = FALSE; + + if (!gtk_spin_button_get_value_as_int(button)) + gtk_entry_set_text(GTK_ENTRY(button), ""); +} + static void gnc_dup_trans_dialog_create (GtkWidget * parent, DupTransDialog *dt_dialog, time_t date, const char *num_str) @@ -112,6 +164,11 @@ gnc_dup_trans_dialog_create (GtkWidget * parent, DupTransDialog *dt_dialog, gnome_dialog_editable_enters (GNOME_DIALOG (dialog), GTK_EDITABLE (num_spin)); + gtk_signal_connect (GTK_OBJECT(num_spin), "focus-out-event", + GTK_SIGNAL_FUNC(gnc_dup_trans_focus_out_cb), dt_dialog); + gtk_signal_connect (GTK_OBJECT(num_spin), "draw", + GTK_SIGNAL_FUNC(gnc_dup_trans_draw_cb), dt_dialog); + if (num_str && parse_num (num_str, &num)) gtk_spin_button_set_value (GTK_SPIN_BUTTON (num_spin), num + 1); else