diff --git a/ChangeLog b/ChangeLog index ea79b7a5b4..a3bc41e71f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-04-05 David Hampton + + * src/gnome-utils/gnc-main-window.c: + * src/gnome-utils/gnc-window.[ch]: + * src/gnome/gnc-plugin-basic-commands.c: Make the entire UI (menus + and toolbar) insensitive when the progress bar is showing. + Replaces the code to make the Save/Save As menus insensitive while + saving. Should prevent a whole class of bugs caused by gtk + commands sneaking in and causing non-recursive code to be entered + recursively. + 2006-04-05 Chris Lyttle * NEWS: Added some text about the release. diff --git a/src/gnome-utils/gnc-main-window.c b/src/gnome-utils/gnc-main-window.c index 6961c67a42..bcf4311759 100644 --- a/src/gnome-utils/gnc-main-window.c +++ b/src/gnome-utils/gnc-main-window.c @@ -3356,6 +3356,27 @@ gnc_main_window_get_progressbar (GncWindow *window_in) } +static void +gnc_main_window_all_ui_set_sensitive (GncWindow *unused, gboolean sensitive) +{ + GncMainWindow *window; + GList *winp; + GSList *widgetp, *toplevels; + + for (winp = active_windows; winp; winp = g_list_next(winp)) { + window = winp->data; + toplevels = gtk_ui_manager_get_toplevels(window->ui_merge, + GTK_UI_MANAGER_MENUBAR | + GTK_UI_MANAGER_TOOLBAR | + GTK_UI_MANAGER_POPUP); + for (widgetp = toplevels; widgetp; widgetp = g_slist_next(widgetp)) { + gtk_widget_set_sensitive (widgetp->data, sensitive); + } + g_slist_free(toplevels); + } +} + + /** Initialize the generic window interface for a main window. * * @param iface A pointer to the interface data structure to @@ -3366,6 +3387,7 @@ gnc_window_main_window_init (GncWindowIface *iface) iface->get_gtk_window = gnc_main_window_get_gtk_window; iface->get_statusbar = gnc_main_window_get_statusbar; iface->get_progressbar = gnc_main_window_get_progressbar; + iface->ui_set_sensitive = gnc_main_window_all_ui_set_sensitive; } diff --git a/src/gnome-utils/gnc-window.c b/src/gnome-utils/gnc-window.c index 79bd4c2989..a075267e11 100644 --- a/src/gnome-utils/gnc-window.c +++ b/src/gnome-utils/gnc-window.c @@ -176,9 +176,14 @@ gnc_window_show_progress (const char *message, double percentage) if (percentage < 0) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progressbar), NULL); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar), 0.0); + if (GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive != NULL) + GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive(window, TRUE); } else { if (message) gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progressbar), message); + if ((percentage == 0) && + (GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive != NULL)) + GNC_WINDOW_GET_IFACE(window)->ui_set_sensitive(window, FALSE); if (percentage <= 100) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressbar), percentage/100); } else { diff --git a/src/gnome-utils/gnc-window.h b/src/gnome-utils/gnc-window.h index 5c3a419df3..843641572d 100644 --- a/src/gnome-utils/gnc-window.h +++ b/src/gnome-utils/gnc-window.h @@ -62,6 +62,7 @@ typedef struct { GtkWindow * (* get_gtk_window) (GncWindow *window); GtkWidget * (* get_statusbar) (GncWindow *window); GtkWidget * (* get_progressbar) (GncWindow *window); + void (* ui_set_sensitive) (GncWindow *window, gboolean sensitive); } GncWindowIface; /* function prototypes */ diff --git a/src/gnome/gnc-plugin-basic-commands.c b/src/gnome/gnc-plugin-basic-commands.c index a5222c8125..febd23be9b 100644 --- a/src/gnome/gnc-plugin-basic-commands.c +++ b/src/gnome/gnc-plugin-basic-commands.c @@ -295,13 +295,6 @@ gnc_plugin_basic_commands_finalize (GObject *object) * Command Callbacks * ************************************************************/ -static void -save_allowed (gboolean allowed) -{ - gnc_main_window_all_action_set_sensitive("FileSaveAction", allowed); - gnc_main_window_all_action_set_sensitive("FileSaveAsAction", allowed); -} - static void gnc_main_window_cmd_file_new (GtkAction *action, GncMainWindowActionData *data) { @@ -328,9 +321,7 @@ gnc_main_window_cmd_file_save (GtkAction *action, GncMainWindowActionData *data) return; gnc_window_set_progressbar_window (GNC_WINDOW(data->window)); - save_allowed(FALSE); gnc_file_save (); - save_allowed(TRUE); gnc_window_set_progressbar_window (NULL); /* FIXME GNOME 2 Port (update the title etc.) */ } @@ -344,9 +335,7 @@ gnc_main_window_cmd_file_save_as (GtkAction *action, GncMainWindowActionData *da return; gnc_window_set_progressbar_window (GNC_WINDOW(data->window)); - save_allowed(FALSE); gnc_file_save_as (); - save_allowed(TRUE); gnc_window_set_progressbar_window (NULL); /* FIXME GNOME 2 Port (update the title etc.) */ }