diff --git a/ChangeLog b/ChangeLog index 59e86ac8d7..5508f5d74e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2002-05-27 Derek Atkins + + * src/app-utils/option-util.c: Add a function to reset all the gui + widgets for an option-db, ignoring sections that begin "__". + + * dialog-options.c: remove all the 'set to default' buttons and + add a single 'defaults' button in the dialog button box, which + resets all the options to their default values. The user still + has to 'apply' the changes to take effect. Also change "close" to + "cancel". + 2002-05-27 David Hampton * src/dialog-account/dialog-account.c: Sort the account type list diff --git a/src/app-utils/option-util.c b/src/app-utils/option-util.c index 4322aa2591..5c84c48f3e 100644 --- a/src/app-utils/option-util.c +++ b/src/app-utils/option-util.c @@ -1654,6 +1654,50 @@ gnc_option_db_commit(GNCOptionDB *odb) } +/********************************************************************\ + * gnc_option_db_reset_widgets * + * reset all option widgets to their default values. * + * * + * Args: odb - option database to reset * + * Return: nothing * +\********************************************************************/ +void +gnc_option_db_reset_widgets (GNCOptionDB *odb) +{ + GSList *section_node; + GSList *option_node; + GNCOptionSection *section; + GNCOption *option; + + g_return_if_fail (odb); + + for (section_node = odb->option_sections; + section_node != NULL; + section_node = section_node->next) + { + section = section_node->data; + + /* Don't reset "invisible" options. + * If the section name begins "__" we should not reset + */ + if (section->section_name == NULL || + strncmp (section->section_name, "__", 2) == 0) + continue; + + for (option_node = section->options; + option_node != NULL; + option_node = option_node->next) + { + option = option_node->data; + + gnc_option_set_ui_value (option, TRUE); + gnc_option_set_changed (option, TRUE); + + } + } +} + + /********************************************************************\ * gnc_option_db_get_default_section * * returns the malloc'd section name of the default section, * diff --git a/src/app-utils/option-util.h b/src/app-utils/option-util.h index d6e2b32cb8..b141811268 100644 --- a/src/app-utils/option-util.h +++ b/src/app-utils/option-util.h @@ -239,4 +239,7 @@ void gncp_option_db_register_option(GNCOptionDBHandle handle, void gncp_option_invoke_callback(GNCOptionChangeCallback callback, gpointer data); +/* Reset all the widgets to their default values */ +void gnc_option_db_reset_widgets (GNCOptionDB *odb); + #endif /* OPTION_UTIL_H */ diff --git a/src/gnome-utils/dialog-options.c b/src/gnome-utils/dialog-options.c index 456bb3f3df..0ad0d15c40 100644 --- a/src/gnome-utils/dialog-options.c +++ b/src/gnome-utils/dialog-options.c @@ -64,6 +64,9 @@ struct gnc_option_win GNCOptionWinCallback close_cb; gpointer close_cb_data; + + /* Hold onto this for a complete reset */ + GNCOptionDB * option_db; }; typedef enum { @@ -95,16 +98,44 @@ gnc_options_dialog_get_apply_button (GtkWidget *widget) return NULL; } +static GtkWidget * +gnc_options_dialog_get_cancel_button (GtkWidget *widget) +{ + while (widget) + { + GtkWidget *button; + + button = gtk_object_get_data (GTK_OBJECT (widget), + "gnc_option_cancel_button"); + if (button) + return button; + + widget = widget->parent; + } + + return NULL; +} + static void gnc_options_dialog_changed_internal (GtkWidget *widget) { GtkWidget *button; - button = gnc_options_dialog_get_apply_button (widget); - if (!button) - return; + do { + button = gnc_options_dialog_get_apply_button (widget); + if (!button) + break; - gtk_widget_set_sensitive (button, TRUE); + gtk_widget_set_sensitive (button, TRUE); + } while (FALSE); + + do { + button = gnc_options_dialog_get_cancel_button (widget); + if (!button) + break; + + gtk_widget_set_sensitive (button, TRUE); + } while (FALSE); } static void @@ -112,11 +143,21 @@ gnc_options_dialog_clear_changed (GtkWidget *widget) { GtkWidget *button; - button = gnc_options_dialog_get_apply_button (widget); - if (!button) - return; + do { + button = gnc_options_dialog_get_apply_button (widget); + if (!button) + break;; - gtk_widget_set_sensitive (button, FALSE); + gtk_widget_set_sensitive (button, FALSE); + } while (FALSE); + + do { + button = gnc_options_dialog_get_cancel_button (widget); + if (!button) + break;; + + gtk_widget_set_sensitive (button, FALSE); + } while (FALSE); } void @@ -319,7 +360,6 @@ gnc_option_set_selectable_internal (GNCOption *option, gboolean selectable) gtk_widget_set_sensitive (widget, selectable); } - static void default_button_cb(GtkButton *button, gpointer data) { @@ -332,22 +372,6 @@ default_button_cb(GtkButton *button, gpointer data) gnc_options_dialog_changed_internal (GTK_WIDGET(button)); } -static GtkWidget * -gnc_option_create_default_button(GNCOption *option, GtkTooltips *tooltips) -{ - GtkWidget *default_button = gtk_button_new_with_label(_("Set to default")); - - gtk_container_set_border_width(GTK_CONTAINER(default_button), 2); - - gtk_signal_connect(GTK_OBJECT(default_button), "clicked", - GTK_SIGNAL_FUNC(default_button_cb), option); - - gtk_tooltips_set_tip(tooltips, default_button, - _("Set the option to its default value"), NULL); - - return default_button; -} - static void gnc_option_toggled_cb(GtkToggleButton *button, gpointer data) { @@ -1104,6 +1128,7 @@ gnc_build_options_dialog_contents(GNCOptionWin *propertybox, gnc_option_set_selectable_internal); propertybox->tips = gtk_tooltips_new(); + propertybox->option_db = odb; gtk_object_ref (GTK_OBJECT (propertybox->tips)); gtk_object_sink (GTK_OBJECT (propertybox->tips)); @@ -1161,14 +1186,11 @@ static void gnc_options_dialog_apply_stub_cb(GtkWidget * w, gpointer data) { GNCOptionWin * window = data; - GtkWidget *button; if (window->apply_cb) window->apply_cb (window, window->apply_cb_data); - button = gnc_options_dialog_get_apply_button (window->container); - if (button) - gtk_widget_set_sensitive (button, FALSE); + gnc_options_dialog_clear_changed (window->container); } static void @@ -1188,7 +1210,7 @@ gnc_options_dialog_destroy_stub_cb(GtkObject * obj, gpointer data) { } static void -gnc_options_dialog_close_stub_cb(GtkWidget * w, gpointer data) { +gnc_options_dialog_cancel_stub_cb(GtkWidget * w, gpointer data) { GNCOptionWin * window = data; GtkWidget *container; @@ -1219,7 +1241,19 @@ gnc_options_dialog_close_stub_cb(GtkWidget * w, gpointer data) { static void gnc_options_dialog_ok_cb(GtkWidget * w, gpointer data) { gnc_options_dialog_apply_stub_cb(w, data); - gnc_options_dialog_close_stub_cb(w, data); + gnc_options_dialog_cancel_stub_cb(w, data); +} + +static void +gnc_options_dialog_reset_cb(GtkWidget * w, gpointer data) +{ + GNCOptionWin *win = data; + + g_return_if_fail (win); + g_return_if_fail (win->option_db); + + gnc_option_db_reset_widgets (win->option_db); + gnc_options_dialog_changed_internal (win->container); } GNCOptionWin * @@ -1231,7 +1265,8 @@ gnc_options_dialog_new(gboolean make_toplevel, gchar *title) { GtkWidget * ok_button=NULL; GtkWidget * apply_button=NULL; GtkWidget * help_button=NULL; - GtkWidget * close_button=NULL; + GtkWidget * cancel_button=NULL; + GtkWidget * reset_button=NULL; retval->toplevel = make_toplevel; @@ -1263,13 +1298,18 @@ gnc_options_dialog_new(gboolean make_toplevel, gchar *title) { apply_button = gnome_stock_button (GNOME_STOCK_BUTTON_APPLY); help_button = gnome_stock_button (GNOME_STOCK_BUTTON_HELP); ok_button = gnome_stock_button (GNOME_STOCK_BUTTON_OK); - close_button = gnome_stock_button (GNOME_STOCK_BUTTON_CLOSE); + cancel_button = gnome_stock_button (GNOME_STOCK_BUTTON_CANCEL); + reset_button = gtk_button_new_with_label (_("Defaults")); gtk_widget_set_sensitive (apply_button, FALSE); + gtk_widget_set_sensitive (cancel_button, FALSE); gtk_object_set_data (GTK_OBJECT (retval->container), "gnc_option_apply_button", apply_button); + gtk_object_set_data (GTK_OBJECT (retval->container), + "gnc_option_cancel_button", cancel_button); + gtk_signal_connect(GTK_OBJECT(apply_button), "clicked", GTK_SIGNAL_FUNC(gnc_options_dialog_apply_stub_cb), retval); @@ -1282,8 +1322,12 @@ gnc_options_dialog_new(gboolean make_toplevel, gchar *title) { GTK_SIGNAL_FUNC(gnc_options_dialog_ok_cb), retval); - gtk_signal_connect(GTK_OBJECT(close_button), "clicked", - GTK_SIGNAL_FUNC(gnc_options_dialog_close_stub_cb), + gtk_signal_connect(GTK_OBJECT(cancel_button), "clicked", + GTK_SIGNAL_FUNC(gnc_options_dialog_cancel_stub_cb), + retval); + + gtk_signal_connect(GTK_OBJECT(reset_button), "clicked", + GTK_SIGNAL_FUNC(gnc_options_dialog_reset_cb), retval); gtk_signal_connect(GTK_OBJECT(retval->container), "destroy", @@ -1292,8 +1336,9 @@ gnc_options_dialog_new(gboolean make_toplevel, gchar *title) { gtk_box_pack_start(GTK_BOX(buttonbox), ok_button, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(buttonbox), apply_button, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(buttonbox), cancel_button, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(buttonbox), help_button, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(buttonbox), close_button, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(buttonbox), reset_button, TRUE, TRUE, 0); retval->notebook = gtk_notebook_new(); gtk_box_pack_start(GTK_BOX(vbox), retval->notebook, TRUE, TRUE, 0); @@ -1473,9 +1518,6 @@ gnc_option_set_ui_widget_boolean (GNCOption *option, GtkBox *page_box, GTK_SIGNAL_FUNC(gnc_option_toggled_cb), option); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; @@ -1508,9 +1550,6 @@ gnc_option_set_ui_widget_string (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1550,9 +1589,6 @@ gnc_option_set_ui_widget_text (GNCOption *option, GtkBox *page_box, GTK_SIGNAL_FUNC(gnc_option_changed_cb), option); gtk_box_pack_start(GTK_BOX(*enclosing), frame, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1588,9 +1624,6 @@ gnc_option_set_ui_widget_currency (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1629,9 +1662,6 @@ gnc_option_set_ui_widget_commodity (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1660,9 +1690,6 @@ gnc_option_set_ui_widget_multichoice (GNCOption *option, GtkBox *page_box, gnc_option_set_ui_value(option, FALSE); gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1691,9 +1718,6 @@ gnc_option_set_ui_widget_date (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_box_pack_start(page_box, *enclosing, FALSE, FALSE, 5); *packed = TRUE; @@ -1849,9 +1873,6 @@ gnc_option_set_ui_widget_number_range (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1889,9 +1910,6 @@ gnc_option_set_ui_widget_color (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1926,9 +1944,6 @@ gnc_option_set_ui_widget_font (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; } @@ -1942,7 +1957,6 @@ gnc_option_set_ui_widget_pixmap (GNCOption *option, GtkBox *page_box, { GtkWidget *value; GtkWidget *label; - GtkWidget *default_button; gchar *colon_name; colon_name = g_strconcat(name, ":", NULL); @@ -1967,12 +1981,8 @@ gnc_option_set_ui_widget_pixmap (GNCOption *option, GtkBox *page_box, gtk_box_pack_start(GTK_BOX(*enclosing), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - default_button = gnc_option_create_default_button(option, tooltips); - gtk_box_pack_end(GTK_BOX(*enclosing), default_button, FALSE, FALSE, 0); - gtk_widget_show(value); gtk_widget_show(label); - gtk_widget_show(default_button); gtk_widget_show(*enclosing); return value; } @@ -1993,9 +2003,6 @@ gnc_option_set_ui_widget_radiobutton (GNCOption *option, GtkBox *page_box, gnc_option_set_ui_value(option, FALSE); gtk_box_pack_start(GTK_BOX(*enclosing), value, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(*enclosing), - gnc_option_create_default_button(option, tooltips), - FALSE, FALSE, 0); gtk_widget_show_all(*enclosing); return value; }