* 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
zzzoldreleases/1.8
Derek Atkins 23 years ago
parent ef614e0804
commit fd565429ac

@ -1,5 +1,12 @@
2003-05-26 Derek Atkins <derek@ihtfp.com>
* 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).

@ -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

Loading…
Cancel
Save