From 527aa849cbfdab1f0c443914e3583738c5808c98 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 27 Feb 2004 14:20:19 +0000 Subject: [PATCH] app/widgets/Makefile.am app/widgets/widgets-types.h new widget swallowing 2004-02-27 Michael Natterer * app/widgets/Makefile.am * app/widgets/widgets-types.h * app/widgets/gimpfiledialog.[ch]: new widget swallowing most of file-dialog-utils.[ch]'s functionality. * app/widgets/widgets-types.h: added "gpointer callback_data" to GimpItemFactorySetupFunc so the setup_funcs can create items in the same context as the item factory's default items. * app/widgets/gimpmenufactory.c (gimp_menu_factory_menu_new): pass "callback_data" to setup_func(). * app/gui/file-open-menu.[ch] * app/gui/file-save-menu.[ch]: use the passed callback_data when creating the menus and attach the file_proc to the menu items using g_object_set_data(). * app/gui/file-commands.[ch]: merged separate file type callbacks for open and save dialogs into one callback which simply calls gimp_file_dialog_set_file_proc(). * app/gui/file-dialog-utils.[ch]: removed file_dialog_new() and file_dialog_set_proc(). * app/gui/file-open-dialog.[ch] * app/gui/file-save-dialog.[ch]: use the new widget and removed global variables except the dialog pointer itself. * app/gui/image-menu.[ch] * app/gui/tool-options-menu.[ch] * app/gui/toolbox-menu.[ch]: changed accordingly. --- ChangeLog | 34 +++++ app/actions/file-commands.c | 35 +---- app/actions/file-commands.h | 88 ++++++------- app/dialogs/file-dialog-utils.c | 112 +--------------- app/dialogs/file-dialog-utils.h | 12 -- app/dialogs/file-open-dialog.c | 45 +++---- app/dialogs/file-open-dialog.h | 12 +- app/dialogs/file-save-dialog.c | 89 ++++++------- app/dialogs/file-save-dialog.h | 2 - app/gui/file-commands.c | 35 +---- app/gui/file-commands.h | 88 ++++++------- app/gui/file-dialog-utils.c | 112 +--------------- app/gui/file-dialog-utils.h | 12 -- app/gui/file-open-dialog.c | 45 +++---- app/gui/file-open-dialog.h | 12 +- app/gui/file-open-menu.c | 28 ++-- app/gui/file-open-menu.h | 3 +- app/gui/file-save-dialog.c | 89 ++++++------- app/gui/file-save-dialog.h | 2 - app/gui/file-save-menu.c | 28 ++-- app/gui/file-save-menu.h | 5 +- app/gui/image-menu.c | 3 +- app/gui/image-menu.h | 5 +- app/gui/tool-options-menu.c | 3 +- app/gui/tool-options-menu.h | 5 +- app/gui/toolbox-menu.c | 3 +- app/gui/toolbox-menu.h | 3 +- app/menus/file-open-menu.c | 28 ++-- app/menus/file-open-menu.h | 3 +- app/menus/file-save-menu.c | 28 ++-- app/menus/file-save-menu.h | 5 +- app/menus/image-menu.c | 3 +- app/menus/image-menu.h | 5 +- app/menus/tool-options-menu.c | 3 +- app/menus/tool-options-menu.h | 5 +- app/menus/toolbox-menu.c | 3 +- app/menus/toolbox-menu.h | 3 +- app/widgets/Makefile.am | 2 + app/widgets/gimpfiledialog.c | 224 ++++++++++++++++++++++++++++++++ app/widgets/gimpfiledialog.h | 75 +++++++++++ app/widgets/gimpmenufactory.c | 2 +- app/widgets/widgets-types.h | 6 +- 42 files changed, 656 insertions(+), 649 deletions(-) create mode 100644 app/widgets/gimpfiledialog.c create mode 100644 app/widgets/gimpfiledialog.h diff --git a/ChangeLog b/ChangeLog index e1c6651e91..ad23e3943c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,37 @@ +2004-02-27 Michael Natterer + + * app/widgets/Makefile.am + * app/widgets/widgets-types.h + * app/widgets/gimpfiledialog.[ch]: new widget swallowing most + of file-dialog-utils.[ch]'s functionality. + + * app/widgets/widgets-types.h: added "gpointer callback_data" to + GimpItemFactorySetupFunc so the setup_funcs can create items in + the same context as the item factory's default items. + + * app/widgets/gimpmenufactory.c (gimp_menu_factory_menu_new): + pass "callback_data" to setup_func(). + + * app/gui/file-open-menu.[ch] + * app/gui/file-save-menu.[ch]: use the passed callback_data + when creating the menus and attach the file_proc to the + menu items using g_object_set_data(). + + * app/gui/file-commands.[ch]: merged separate file type callbacks + for open and save dialogs into one callback which simply + calls gimp_file_dialog_set_file_proc(). + + * app/gui/file-dialog-utils.[ch]: removed file_dialog_new() + and file_dialog_set_proc(). + + * app/gui/file-open-dialog.[ch] + * app/gui/file-save-dialog.[ch]: use the new widget and removed + global variables except the dialog pointer itself. + + * app/gui/image-menu.[ch] + * app/gui/tool-options-menu.[ch] + * app/gui/toolbox-menu.[ch]: changed accordingly. + 2004-02-26 Sven Neumann * INSTALL: improved help on missing libraries at run-time. diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c index db003458d5..9685aa0aaa 100644 --- a/app/actions/file-commands.c +++ b/app/actions/file-commands.c @@ -43,6 +43,7 @@ #include "widgets/gimpdock.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "display/gimpdisplay.h" #include "display/gimpdisplay-foreach.h" @@ -124,19 +125,13 @@ file_new_cmd_callback (GtkWidget *widget, } void -file_open_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) +file_type_cmd_callback (GtkWidget *widget, + gpointer data, + guint action) { - file_open_dialog_set_type (NULL); -} - -void -file_open_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_open_dialog_set_type ((PlugInProcDef *) data); + gimp_file_dialog_set_file_proc (GIMP_FILE_DIALOG (data), + g_object_get_data (G_OBJECT (widget), + "file-proc")); } void @@ -200,22 +195,6 @@ file_last_opened_cmd_callback (GtkWidget *widget, } } -void -file_save_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_save_dialog_set_type (NULL); -} - -void -file_save_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_save_dialog_set_type ((PlugInProcDef *) data); -} - void file_save_cmd_callback (GtkWidget *widget, gpointer data, diff --git a/app/actions/file-commands.h b/app/actions/file-commands.h index ea54d7b109..f0fb9febd3 100644 --- a/app/actions/file-commands.h +++ b/app/actions/file-commands.h @@ -20,58 +20,50 @@ #define __FILE_COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_new_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_open_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_open_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_open_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_last_opened_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_type_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_save_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_as_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_a_copy_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_template_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_open_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_last_opened_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_revert_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_pref_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_close_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_quit_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_save_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_as_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_a_copy_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_template_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_file_open_dialog (Gimp *gimp, - const gchar *uri, - GtkWidget *parent); +void file_revert_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_pref_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_close_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_quit_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); + +void file_file_open_dialog (Gimp *gimp, + const gchar *uri, + GtkWidget *parent); #endif /* __FILE_COMMANDS_H__ */ diff --git a/app/dialogs/file-dialog-utils.c b/app/dialogs/file-dialog-utils.c index ba118a66a8..c22a15e70b 100644 --- a/app/dialogs/file-dialog-utils.c +++ b/app/dialogs/file-dialog-utils.c @@ -32,6 +32,7 @@ #include "plug-in/plug-in-proc.h" #include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimpitemfactory.h" #include "widgets/gimpmenufactory.h" @@ -40,87 +41,6 @@ #include "gimp-intl.h" -GtkWidget * -file_dialog_new (Gimp *gimp, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - GimpMenuFactory *menu_factory, - const gchar *menu_identifier, - const gchar *title, - const gchar *role, - const gchar *help_id) -{ - GtkWidget *filesel; - GtkFileSelection *fs; - - g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); - g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (dialog_factory), NULL); - g_return_val_if_fail (dialog_identifier != NULL, NULL); - g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL); - g_return_val_if_fail (menu_identifier != NULL, NULL); - g_return_val_if_fail (title != NULL, NULL); - g_return_val_if_fail (role != NULL, NULL); - g_return_val_if_fail (help_id != NULL, NULL); - - filesel = gtk_file_selection_new (title); - - fs = GTK_FILE_SELECTION (filesel); - - g_object_set_data (G_OBJECT (filesel), "gimp", gimp); - - gtk_window_set_role (GTK_WINDOW (filesel), role); - - gimp_help_connect (filesel, gimp_standard_help_func, help_id, NULL); - - gtk_container_set_border_width (GTK_CONTAINER (filesel), 6); - gtk_container_set_border_width (GTK_CONTAINER (fs->button_area), 4); - - g_signal_connect (filesel, "delete_event", - G_CALLBACK (gtk_true), - NULL); - - /* The file type menu */ - { - GimpItemFactory *item_factory; - GtkWidget *hbox; - GtkWidget *option_menu; - GtkWidget *label; - - hbox = gtk_hbox_new (FALSE, 4); - gtk_box_pack_end (GTK_BOX (fs->main_vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - item_factory = gimp_menu_factory_menu_new (menu_factory, - menu_identifier, - GTK_TYPE_MENU, - gimp, - FALSE); - - g_object_set_data (G_OBJECT (filesel), "gimp-item-factory", item_factory); - - option_menu = gtk_option_menu_new (); - gtk_box_pack_end (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0); - gtk_widget_show (option_menu); - - g_object_weak_ref (G_OBJECT (option_menu), - (GWeakNotify) g_object_unref, - item_factory); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), - GTK_ITEM_FACTORY (item_factory)->widget); - - label = gtk_label_new_with_mnemonic (_("Determine File _Type:")); - gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), option_menu); - } - - gimp_dialog_factory_add_foreign (dialog_factory, dialog_identifier, filesel); - - return filesel; -} - void file_dialog_show (GtkWidget *filesel, GtkWidget *parent) @@ -151,33 +71,3 @@ file_dialog_hide (GtkWidget *filesel) gimp_item_factories_set_sensitive ("", "/File/Save as...", TRUE); gimp_item_factories_set_sensitive ("", "/File/Save a Copy...", TRUE); } - -void -file_dialog_update_name (PlugInProcDef *proc, - GtkFileSelection *filesel) -{ - if (proc->extensions_list) - { - const gchar *text; - gchar *last_dot; - GString *s; - - text = gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)); - last_dot = strrchr (text, '.'); - - if (last_dot == text || !text[0]) - return; - - s = g_string_new (text); - - if (last_dot) - g_string_truncate (s, last_dot-text); - - g_string_append (s, "."); - g_string_append (s, (gchar *) proc->extensions_list->data); - - gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), s->str); - - g_string_free (s, TRUE); - } -} diff --git a/app/dialogs/file-dialog-utils.h b/app/dialogs/file-dialog-utils.h index b3a44390fe..13b9f4452c 100644 --- a/app/dialogs/file-dialog-utils.h +++ b/app/dialogs/file-dialog-utils.h @@ -20,21 +20,9 @@ #define __FILE_DIALOG_UTILS_H__ -GtkWidget * file_dialog_new (Gimp *gimp, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - GimpMenuFactory *menu_factory, - const gchar *menu_identifier, - const gchar *title, - const gchar *role, - const gchar *help_id); - void file_dialog_show (GtkWidget *filesel, GtkWidget *parent); void file_dialog_hide (GtkWidget *filesel); -void file_dialog_update_name (PlugInProcDef *proc, - GtkFileSelection *filesel); - #endif /* __FILE_DIALOG_UTILS_H__ */ diff --git a/app/dialogs/file-open-dialog.c b/app/dialogs/file-open-dialog.c index 192ba422dd..e20f90818e 100644 --- a/app/dialogs/file-open-dialog.c +++ b/app/dialogs/file-open-dialog.c @@ -38,6 +38,8 @@ #include "file/file-open.h" #include "file/file-utils.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpmenufactory.h" #include "widgets/gimpthumbbox.h" @@ -65,21 +67,12 @@ static void file_open_dialog_open_image (GtkWidget *open_dialog, PlugInProcDef *load_proc); -static GtkWidget *fileload = NULL; -static GtkWidget *thumb_box = NULL; -static PlugInProcDef *load_file_proc = NULL; +static GtkWidget *fileload = NULL; +static GtkWidget *thumb_box = NULL; /* public functions */ -void -file_open_dialog_set_type (PlugInProcDef *proc) -{ - /* Don't call file_dialog_update_name() here, see bug #112273. */ - - load_file_proc = proc; -} - void file_open_dialog_show (Gimp *gimp, GimpImage *gimage, @@ -146,12 +139,15 @@ file_open_dialog_create (Gimp *gimp, GtkWidget *open_dialog; GtkFileSelection *fs; - open_dialog = file_dialog_new (gimp, - global_dialog_factory, - "gimp-file-open-dialog", - menu_factory, "", - _("Open Image"), "gimp-file-open", - GIMP_HELP_FILE_OPEN); + open_dialog = gimp_file_dialog_new (gimp, + menu_factory, "", + _("Open Image"), "gimp-file-open", + GTK_STOCK_OPEN, + GIMP_HELP_FILE_OPEN); + + gimp_dialog_factory_add_foreign (global_dialog_factory, + "gimp-file-open-dialog", + open_dialog); g_signal_connect (open_dialog, "response", G_CALLBACK (file_open_response_callback), @@ -202,8 +198,8 @@ static void file_open_selchanged_callback (GtkTreeSelection *sel, GtkWidget *open_dialog) { - GtkFileSelection *fs; - Gimp *gimp; + GimpFileDialog *dialog = GIMP_FILE_DIALOG (open_dialog); + GtkFileSelection *fs = GTK_FILE_SELECTION (open_dialog); const gchar *fullfname; gboolean selected = FALSE; @@ -211,17 +207,14 @@ file_open_selchanged_callback (GtkTreeSelection *sel, selchanged_foreach, &selected); - fs = GTK_FILE_SELECTION (open_dialog); - - gimp = GIMP (g_object_get_data (G_OBJECT (open_dialog), "gimp")); - if (selected) { gchar *uri; fullfname = gtk_file_selection_get_filename (fs); - uri = file_utils_filename_to_uri (gimp->load_procs, fullfname, NULL); + uri = file_utils_filename_to_uri (dialog->gimp->load_procs, + fullfname, NULL); gimp_thumb_box_set_uri (GIMP_THUMB_BOX (thumb_box), uri); g_free (uri); } @@ -310,7 +303,7 @@ file_open_response_callback (GtkWidget *open_dialog, gimp, uri, entered_filename, - load_file_proc); + GIMP_FILE_DIALOG (open_dialog)->file_proc); g_free (uri); @@ -328,7 +321,7 @@ file_open_response_callback (GtkWidget *open_dialog, gimp, uri, uri, - load_file_proc); + GIMP_FILE_DIALOG (open_dialog)->file_proc); g_free (uri); } diff --git a/app/dialogs/file-open-dialog.h b/app/dialogs/file-open-dialog.h index 86ffd7b13d..807563017a 100644 --- a/app/dialogs/file-open-dialog.h +++ b/app/dialogs/file-open-dialog.h @@ -20,13 +20,11 @@ #define __FILE_OPEN_DIALOG_H__ -void file_open_dialog_set_type (PlugInProcDef *proc); - -void file_open_dialog_show (Gimp *gimp, - GimpImage *gimage, - const gchar *uri, - GimpMenuFactory *menu_factory, - GtkWidget *parent); +void file_open_dialog_show (Gimp *gimp, + GimpImage *gimage, + const gchar *uri, + GimpMenuFactory *menu_factory, + GtkWidget *parent); #endif /* __FILE_OPEN_DIALOG_H__ */ diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c index a725787f4f..dcc14be26e 100644 --- a/app/dialogs/file-save-dialog.c +++ b/app/dialogs/file-save-dialog.c @@ -36,6 +36,8 @@ #include "file/file-save.h" #include "file/file-utils.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpitemfactory.h" #include "widgets/gimpmenufactory.h" @@ -69,32 +71,17 @@ static void file_save_dialog_save_image (GtkWidget *save_dialog, gboolean set_image_clean); -static GtkWidget *filesave = NULL; - -static PlugInProcDef *save_file_proc = NULL; -static GimpImage *the_gimage = NULL; -static gboolean set_uri_and_proc = TRUE; -static gboolean set_image_clean = TRUE; +static GtkWidget *filesave = NULL; /* public functions */ -void -file_save_dialog_set_type (PlugInProcDef *proc) -{ - if (proc) - file_dialog_update_name (proc, GTK_FILE_SELECTION (filesave)); - - save_file_proc = proc; -} - void file_save_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent) { - GimpItemFactory *item_factory; - gchar *filename; + gchar *filename; g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory)); @@ -102,13 +89,13 @@ file_save_dialog_show (GimpImage *gimage, if (! gimp_image_active_drawable (gimage)) return; - the_gimage = gimage; - set_uri_and_proc = TRUE; - set_image_clean = TRUE; - if (! filesave) filesave = file_save_dialog_create (gimage->gimp, menu_factory); + GIMP_FILE_DIALOG (filesave)->gimage = gimage; + GIMP_FILE_DIALOG (filesave)->set_uri_and_proc = TRUE; + GIMP_FILE_DIALOG (filesave)->set_image_clean = TRUE; + gtk_widget_set_sensitive (GTK_WIDGET (filesave), TRUE); if (GTK_WIDGET_VISIBLE (filesave)) @@ -128,9 +115,7 @@ file_save_dialog_show (GimpImage *gimage, g_free (filename); - item_factory = g_object_get_data (G_OBJECT (filesave), "gimp-item-factory"); - - gimp_item_factory_update (item_factory, + gimp_item_factory_update (GIMP_FILE_DIALOG (filesave)->item_factory, gimp_image_active_drawable (gimage)); file_dialog_show (filesave, parent); @@ -141,9 +126,8 @@ file_save_a_copy_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent) { - GimpItemFactory *item_factory; - const gchar *uri; - gchar *filename = NULL; + const gchar *uri; + gchar *filename = NULL; g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory)); @@ -151,10 +135,6 @@ file_save_a_copy_dialog_show (GimpImage *gimage, if (! gimp_image_active_drawable (gimage)) return; - the_gimage = gimage; - set_uri_and_proc = FALSE; - set_image_clean = FALSE; - uri = gimp_object_get_name (GIMP_OBJECT (gimage)); if (uri) @@ -163,6 +143,10 @@ file_save_a_copy_dialog_show (GimpImage *gimage, if (! filesave) filesave = file_save_dialog_create (gimage->gimp, menu_factory); + GIMP_FILE_DIALOG (filesave)->gimage = gimage; + GIMP_FILE_DIALOG (filesave)->set_uri_and_proc = FALSE; + GIMP_FILE_DIALOG (filesave)->set_image_clean = FALSE; + gtk_widget_set_sensitive (GTK_WIDGET (filesave), TRUE); if (GTK_WIDGET_VISIBLE (filesave)) @@ -180,9 +164,7 @@ file_save_a_copy_dialog_show (GimpImage *gimage, g_free (filename); - item_factory = g_object_get_data (G_OBJECT (filesave), "gimp-item-factory"); - - gimp_item_factory_update (item_factory, + gimp_item_factory_update (GIMP_FILE_DIALOG (filesave)->item_factory, gimp_image_active_drawable (gimage)); file_dialog_show (filesave, parent); @@ -197,12 +179,15 @@ file_save_dialog_create (Gimp *gimp, { GtkWidget *save_dialog; - save_dialog = file_dialog_new (gimp, - global_dialog_factory, - "gimp-file-save-dialog", - menu_factory, "", - _("Save Image"), "gimp-file-save", - GIMP_HELP_FILE_SAVE); + save_dialog = gimp_file_dialog_new (gimp, + menu_factory, "", + _("Save Image"), "gimp-file-save", + GTK_STOCK_SAVE, + GIMP_HELP_FILE_SAVE); + + gimp_dialog_factory_add_foreign (global_dialog_factory, + "gimp-file-save-dialog", + save_dialog); g_signal_connect (save_dialog, "response", G_CALLBACK (file_save_response_callback), @@ -258,17 +243,19 @@ file_save_response_callback (GtkWidget *save_dialog, } else { - gtk_widget_set_sensitive (GTK_WIDGET (fs), FALSE); + GimpFileDialog *dialog = GIMP_FILE_DIALOG (save_dialog); + + gtk_widget_set_sensitive (save_dialog, FALSE); file_save_dialog_save_image (save_dialog, - the_gimage, + dialog->gimage, uri, raw_filename, - save_file_proc, - set_uri_and_proc, - set_image_clean); + dialog->file_proc, + dialog->set_uri_and_proc, + dialog->set_image_clean); - gtk_widget_set_sensitive (GTK_WIDGET (fs), TRUE); + gtk_widget_set_sensitive (save_dialog, TRUE); } g_free (uri); @@ -336,13 +323,15 @@ file_save_overwrite_callback (GtkWidget *widget, if (overwrite) { + GimpFileDialog *dialog = GIMP_FILE_DIALOG (overwrite_data->save_dialog); + file_save_dialog_save_image (overwrite_data->save_dialog, - the_gimage, + dialog->gimage, overwrite_data->uri, overwrite_data->raw_filename, - save_file_proc, - set_uri_and_proc, - set_image_clean); + dialog->file_proc, + dialog->set_uri_and_proc, + dialog->set_image_clean); } gtk_widget_set_sensitive (overwrite_data->save_dialog, TRUE); diff --git a/app/dialogs/file-save-dialog.h b/app/dialogs/file-save-dialog.h index f7bf47278b..5dc00997b3 100644 --- a/app/dialogs/file-save-dialog.h +++ b/app/dialogs/file-save-dialog.h @@ -20,8 +20,6 @@ #define __FILE_SAVE_DIALOG_H__ -void file_save_dialog_set_type (PlugInProcDef *proc); - void file_save_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent); diff --git a/app/gui/file-commands.c b/app/gui/file-commands.c index db003458d5..9685aa0aaa 100644 --- a/app/gui/file-commands.c +++ b/app/gui/file-commands.c @@ -43,6 +43,7 @@ #include "widgets/gimpdock.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "display/gimpdisplay.h" #include "display/gimpdisplay-foreach.h" @@ -124,19 +125,13 @@ file_new_cmd_callback (GtkWidget *widget, } void -file_open_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) +file_type_cmd_callback (GtkWidget *widget, + gpointer data, + guint action) { - file_open_dialog_set_type (NULL); -} - -void -file_open_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_open_dialog_set_type ((PlugInProcDef *) data); + gimp_file_dialog_set_file_proc (GIMP_FILE_DIALOG (data), + g_object_get_data (G_OBJECT (widget), + "file-proc")); } void @@ -200,22 +195,6 @@ file_last_opened_cmd_callback (GtkWidget *widget, } } -void -file_save_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_save_dialog_set_type (NULL); -} - -void -file_save_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action) -{ - file_save_dialog_set_type ((PlugInProcDef *) data); -} - void file_save_cmd_callback (GtkWidget *widget, gpointer data, diff --git a/app/gui/file-commands.h b/app/gui/file-commands.h index ea54d7b109..f0fb9febd3 100644 --- a/app/gui/file-commands.h +++ b/app/gui/file-commands.h @@ -20,58 +20,50 @@ #define __FILE_COMMANDS_H__ -void file_new_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_new_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_open_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_open_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_open_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_last_opened_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_type_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_save_by_extension_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_type_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_as_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_a_copy_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_save_template_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_open_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_last_opened_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_revert_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_pref_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_close_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); -void file_quit_cmd_callback (GtkWidget *widget, - gpointer data, - guint action); +void file_save_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_as_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_a_copy_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_save_template_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); -void file_file_open_dialog (Gimp *gimp, - const gchar *uri, - GtkWidget *parent); +void file_revert_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_pref_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_close_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); +void file_quit_cmd_callback (GtkWidget *widget, + gpointer data, + guint action); + +void file_file_open_dialog (Gimp *gimp, + const gchar *uri, + GtkWidget *parent); #endif /* __FILE_COMMANDS_H__ */ diff --git a/app/gui/file-dialog-utils.c b/app/gui/file-dialog-utils.c index ba118a66a8..c22a15e70b 100644 --- a/app/gui/file-dialog-utils.c +++ b/app/gui/file-dialog-utils.c @@ -32,6 +32,7 @@ #include "plug-in/plug-in-proc.h" #include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimpitemfactory.h" #include "widgets/gimpmenufactory.h" @@ -40,87 +41,6 @@ #include "gimp-intl.h" -GtkWidget * -file_dialog_new (Gimp *gimp, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - GimpMenuFactory *menu_factory, - const gchar *menu_identifier, - const gchar *title, - const gchar *role, - const gchar *help_id) -{ - GtkWidget *filesel; - GtkFileSelection *fs; - - g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); - g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (dialog_factory), NULL); - g_return_val_if_fail (dialog_identifier != NULL, NULL); - g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL); - g_return_val_if_fail (menu_identifier != NULL, NULL); - g_return_val_if_fail (title != NULL, NULL); - g_return_val_if_fail (role != NULL, NULL); - g_return_val_if_fail (help_id != NULL, NULL); - - filesel = gtk_file_selection_new (title); - - fs = GTK_FILE_SELECTION (filesel); - - g_object_set_data (G_OBJECT (filesel), "gimp", gimp); - - gtk_window_set_role (GTK_WINDOW (filesel), role); - - gimp_help_connect (filesel, gimp_standard_help_func, help_id, NULL); - - gtk_container_set_border_width (GTK_CONTAINER (filesel), 6); - gtk_container_set_border_width (GTK_CONTAINER (fs->button_area), 4); - - g_signal_connect (filesel, "delete_event", - G_CALLBACK (gtk_true), - NULL); - - /* The file type menu */ - { - GimpItemFactory *item_factory; - GtkWidget *hbox; - GtkWidget *option_menu; - GtkWidget *label; - - hbox = gtk_hbox_new (FALSE, 4); - gtk_box_pack_end (GTK_BOX (fs->main_vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - item_factory = gimp_menu_factory_menu_new (menu_factory, - menu_identifier, - GTK_TYPE_MENU, - gimp, - FALSE); - - g_object_set_data (G_OBJECT (filesel), "gimp-item-factory", item_factory); - - option_menu = gtk_option_menu_new (); - gtk_box_pack_end (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0); - gtk_widget_show (option_menu); - - g_object_weak_ref (G_OBJECT (option_menu), - (GWeakNotify) g_object_unref, - item_factory); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), - GTK_ITEM_FACTORY (item_factory)->widget); - - label = gtk_label_new_with_mnemonic (_("Determine File _Type:")); - gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0); - gtk_widget_show (label); - - gtk_label_set_mnemonic_widget (GTK_LABEL (label), option_menu); - } - - gimp_dialog_factory_add_foreign (dialog_factory, dialog_identifier, filesel); - - return filesel; -} - void file_dialog_show (GtkWidget *filesel, GtkWidget *parent) @@ -151,33 +71,3 @@ file_dialog_hide (GtkWidget *filesel) gimp_item_factories_set_sensitive ("", "/File/Save as...", TRUE); gimp_item_factories_set_sensitive ("", "/File/Save a Copy...", TRUE); } - -void -file_dialog_update_name (PlugInProcDef *proc, - GtkFileSelection *filesel) -{ - if (proc->extensions_list) - { - const gchar *text; - gchar *last_dot; - GString *s; - - text = gtk_entry_get_text (GTK_ENTRY (filesel->selection_entry)); - last_dot = strrchr (text, '.'); - - if (last_dot == text || !text[0]) - return; - - s = g_string_new (text); - - if (last_dot) - g_string_truncate (s, last_dot-text); - - g_string_append (s, "."); - g_string_append (s, (gchar *) proc->extensions_list->data); - - gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), s->str); - - g_string_free (s, TRUE); - } -} diff --git a/app/gui/file-dialog-utils.h b/app/gui/file-dialog-utils.h index b3a44390fe..13b9f4452c 100644 --- a/app/gui/file-dialog-utils.h +++ b/app/gui/file-dialog-utils.h @@ -20,21 +20,9 @@ #define __FILE_DIALOG_UTILS_H__ -GtkWidget * file_dialog_new (Gimp *gimp, - GimpDialogFactory *dialog_factory, - const gchar *dialog_identifier, - GimpMenuFactory *menu_factory, - const gchar *menu_identifier, - const gchar *title, - const gchar *role, - const gchar *help_id); - void file_dialog_show (GtkWidget *filesel, GtkWidget *parent); void file_dialog_hide (GtkWidget *filesel); -void file_dialog_update_name (PlugInProcDef *proc, - GtkFileSelection *filesel); - #endif /* __FILE_DIALOG_UTILS_H__ */ diff --git a/app/gui/file-open-dialog.c b/app/gui/file-open-dialog.c index 192ba422dd..e20f90818e 100644 --- a/app/gui/file-open-dialog.c +++ b/app/gui/file-open-dialog.c @@ -38,6 +38,8 @@ #include "file/file-open.h" #include "file/file-utils.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpmenufactory.h" #include "widgets/gimpthumbbox.h" @@ -65,21 +67,12 @@ static void file_open_dialog_open_image (GtkWidget *open_dialog, PlugInProcDef *load_proc); -static GtkWidget *fileload = NULL; -static GtkWidget *thumb_box = NULL; -static PlugInProcDef *load_file_proc = NULL; +static GtkWidget *fileload = NULL; +static GtkWidget *thumb_box = NULL; /* public functions */ -void -file_open_dialog_set_type (PlugInProcDef *proc) -{ - /* Don't call file_dialog_update_name() here, see bug #112273. */ - - load_file_proc = proc; -} - void file_open_dialog_show (Gimp *gimp, GimpImage *gimage, @@ -146,12 +139,15 @@ file_open_dialog_create (Gimp *gimp, GtkWidget *open_dialog; GtkFileSelection *fs; - open_dialog = file_dialog_new (gimp, - global_dialog_factory, - "gimp-file-open-dialog", - menu_factory, "", - _("Open Image"), "gimp-file-open", - GIMP_HELP_FILE_OPEN); + open_dialog = gimp_file_dialog_new (gimp, + menu_factory, "", + _("Open Image"), "gimp-file-open", + GTK_STOCK_OPEN, + GIMP_HELP_FILE_OPEN); + + gimp_dialog_factory_add_foreign (global_dialog_factory, + "gimp-file-open-dialog", + open_dialog); g_signal_connect (open_dialog, "response", G_CALLBACK (file_open_response_callback), @@ -202,8 +198,8 @@ static void file_open_selchanged_callback (GtkTreeSelection *sel, GtkWidget *open_dialog) { - GtkFileSelection *fs; - Gimp *gimp; + GimpFileDialog *dialog = GIMP_FILE_DIALOG (open_dialog); + GtkFileSelection *fs = GTK_FILE_SELECTION (open_dialog); const gchar *fullfname; gboolean selected = FALSE; @@ -211,17 +207,14 @@ file_open_selchanged_callback (GtkTreeSelection *sel, selchanged_foreach, &selected); - fs = GTK_FILE_SELECTION (open_dialog); - - gimp = GIMP (g_object_get_data (G_OBJECT (open_dialog), "gimp")); - if (selected) { gchar *uri; fullfname = gtk_file_selection_get_filename (fs); - uri = file_utils_filename_to_uri (gimp->load_procs, fullfname, NULL); + uri = file_utils_filename_to_uri (dialog->gimp->load_procs, + fullfname, NULL); gimp_thumb_box_set_uri (GIMP_THUMB_BOX (thumb_box), uri); g_free (uri); } @@ -310,7 +303,7 @@ file_open_response_callback (GtkWidget *open_dialog, gimp, uri, entered_filename, - load_file_proc); + GIMP_FILE_DIALOG (open_dialog)->file_proc); g_free (uri); @@ -328,7 +321,7 @@ file_open_response_callback (GtkWidget *open_dialog, gimp, uri, uri, - load_file_proc); + GIMP_FILE_DIALOG (open_dialog)->file_proc); g_free (uri); } diff --git a/app/gui/file-open-dialog.h b/app/gui/file-open-dialog.h index 86ffd7b13d..807563017a 100644 --- a/app/gui/file-open-dialog.h +++ b/app/gui/file-open-dialog.h @@ -20,13 +20,11 @@ #define __FILE_OPEN_DIALOG_H__ -void file_open_dialog_set_type (PlugInProcDef *proc); - -void file_open_dialog_show (Gimp *gimp, - GimpImage *gimage, - const gchar *uri, - GimpMenuFactory *menu_factory, - GtkWidget *parent); +void file_open_dialog_show (Gimp *gimp, + GimpImage *gimage, + const gchar *uri, + GimpMenuFactory *menu_factory, + GtkWidget *parent); #endif /* __FILE_OPEN_DIALOG_H__ */ diff --git a/app/gui/file-open-menu.c b/app/gui/file-open-menu.c index 9c55e084b3..a0da6a126d 100644 --- a/app/gui/file-open-menu.c +++ b/app/gui/file-open-menu.c @@ -44,7 +44,7 @@ GimpItemFactoryEntry file_open_menu_entries[] = { { { N_("/Automatic"), NULL, - file_open_by_extension_cmd_callback, 0 }, + file_type_cmd_callback, 0 }, NULL, GIMP_HELP_FILE_OPEN_BY_EXTENSION, NULL }, @@ -55,21 +55,21 @@ gint n_file_open_menu_entries = G_N_ELEMENTS (file_open_menu_entries); void -file_open_menu_setup (GimpItemFactory *factory) +file_open_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { GSList *list; for (list = factory->gimp->load_procs; list; list = g_slist_next (list)) { - PlugInProcDef *file_proc; - GimpItemFactoryEntry entry; + PlugInProcDef *file_proc = list->data; const gchar *locale_domain = NULL; const gchar *item_type = NULL; const gchar *stock_id = NULL; gchar *help_id; + GimpItemFactoryEntry entry; gboolean is_xcf; - - file_proc = (PlugInProcDef *) list->data; + GtkWidget *menu_item; if (! file_proc->menu_path) continue; @@ -97,7 +97,7 @@ file_open_menu_setup (GimpItemFactory *factory) entry.entry.path = strstr (file_proc->menu_path, "/"); entry.entry.accelerator = NULL; - entry.entry.callback = file_open_type_cmd_callback; + entry.entry.callback = file_type_cmd_callback; entry.entry.callback_action = 0; entry.entry.item_type = (gchar *) item_type; entry.entry.extra_data = stock_id; @@ -108,16 +108,16 @@ file_open_menu_setup (GimpItemFactory *factory) gimp_item_factory_create_item (factory, &entry, locale_domain, - file_proc, 2, FALSE); + callback_data, 2, FALSE); - if (is_xcf) + menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), + entry.entry.path); + + if (menu_item) { - GtkWidget *menu_item; + g_object_set_data (G_OBJECT (menu_item), "file-proc", file_proc); - menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), - entry.entry.path); - - if (menu_item) + if (is_xcf) gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, 1); } diff --git a/app/gui/file-open-menu.h b/app/gui/file-open-menu.h index 7b3fa8060d..8a31ae889c 100644 --- a/app/gui/file-open-menu.h +++ b/app/gui/file-open-menu.h @@ -24,7 +24,8 @@ extern GimpItemFactoryEntry file_open_menu_entries[]; extern gint n_file_open_menu_entries; -void file_open_menu_setup (GimpItemFactory *factory); +void file_open_menu_setup (GimpItemFactory *factory, + gpointer callback_data); #endif /* __FILE_OPEN_MENU_H__ */ diff --git a/app/gui/file-save-dialog.c b/app/gui/file-save-dialog.c index a725787f4f..dcc14be26e 100644 --- a/app/gui/file-save-dialog.c +++ b/app/gui/file-save-dialog.c @@ -36,6 +36,8 @@ #include "file/file-save.h" #include "file/file-utils.h" +#include "widgets/gimpdialogfactory.h" +#include "widgets/gimpfiledialog.h" #include "widgets/gimphelp-ids.h" #include "widgets/gimpitemfactory.h" #include "widgets/gimpmenufactory.h" @@ -69,32 +71,17 @@ static void file_save_dialog_save_image (GtkWidget *save_dialog, gboolean set_image_clean); -static GtkWidget *filesave = NULL; - -static PlugInProcDef *save_file_proc = NULL; -static GimpImage *the_gimage = NULL; -static gboolean set_uri_and_proc = TRUE; -static gboolean set_image_clean = TRUE; +static GtkWidget *filesave = NULL; /* public functions */ -void -file_save_dialog_set_type (PlugInProcDef *proc) -{ - if (proc) - file_dialog_update_name (proc, GTK_FILE_SELECTION (filesave)); - - save_file_proc = proc; -} - void file_save_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent) { - GimpItemFactory *item_factory; - gchar *filename; + gchar *filename; g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory)); @@ -102,13 +89,13 @@ file_save_dialog_show (GimpImage *gimage, if (! gimp_image_active_drawable (gimage)) return; - the_gimage = gimage; - set_uri_and_proc = TRUE; - set_image_clean = TRUE; - if (! filesave) filesave = file_save_dialog_create (gimage->gimp, menu_factory); + GIMP_FILE_DIALOG (filesave)->gimage = gimage; + GIMP_FILE_DIALOG (filesave)->set_uri_and_proc = TRUE; + GIMP_FILE_DIALOG (filesave)->set_image_clean = TRUE; + gtk_widget_set_sensitive (GTK_WIDGET (filesave), TRUE); if (GTK_WIDGET_VISIBLE (filesave)) @@ -128,9 +115,7 @@ file_save_dialog_show (GimpImage *gimage, g_free (filename); - item_factory = g_object_get_data (G_OBJECT (filesave), "gimp-item-factory"); - - gimp_item_factory_update (item_factory, + gimp_item_factory_update (GIMP_FILE_DIALOG (filesave)->item_factory, gimp_image_active_drawable (gimage)); file_dialog_show (filesave, parent); @@ -141,9 +126,8 @@ file_save_a_copy_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent) { - GimpItemFactory *item_factory; - const gchar *uri; - gchar *filename = NULL; + const gchar *uri; + gchar *filename = NULL; g_return_if_fail (GIMP_IS_IMAGE (gimage)); g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory)); @@ -151,10 +135,6 @@ file_save_a_copy_dialog_show (GimpImage *gimage, if (! gimp_image_active_drawable (gimage)) return; - the_gimage = gimage; - set_uri_and_proc = FALSE; - set_image_clean = FALSE; - uri = gimp_object_get_name (GIMP_OBJECT (gimage)); if (uri) @@ -163,6 +143,10 @@ file_save_a_copy_dialog_show (GimpImage *gimage, if (! filesave) filesave = file_save_dialog_create (gimage->gimp, menu_factory); + GIMP_FILE_DIALOG (filesave)->gimage = gimage; + GIMP_FILE_DIALOG (filesave)->set_uri_and_proc = FALSE; + GIMP_FILE_DIALOG (filesave)->set_image_clean = FALSE; + gtk_widget_set_sensitive (GTK_WIDGET (filesave), TRUE); if (GTK_WIDGET_VISIBLE (filesave)) @@ -180,9 +164,7 @@ file_save_a_copy_dialog_show (GimpImage *gimage, g_free (filename); - item_factory = g_object_get_data (G_OBJECT (filesave), "gimp-item-factory"); - - gimp_item_factory_update (item_factory, + gimp_item_factory_update (GIMP_FILE_DIALOG (filesave)->item_factory, gimp_image_active_drawable (gimage)); file_dialog_show (filesave, parent); @@ -197,12 +179,15 @@ file_save_dialog_create (Gimp *gimp, { GtkWidget *save_dialog; - save_dialog = file_dialog_new (gimp, - global_dialog_factory, - "gimp-file-save-dialog", - menu_factory, "", - _("Save Image"), "gimp-file-save", - GIMP_HELP_FILE_SAVE); + save_dialog = gimp_file_dialog_new (gimp, + menu_factory, "", + _("Save Image"), "gimp-file-save", + GTK_STOCK_SAVE, + GIMP_HELP_FILE_SAVE); + + gimp_dialog_factory_add_foreign (global_dialog_factory, + "gimp-file-save-dialog", + save_dialog); g_signal_connect (save_dialog, "response", G_CALLBACK (file_save_response_callback), @@ -258,17 +243,19 @@ file_save_response_callback (GtkWidget *save_dialog, } else { - gtk_widget_set_sensitive (GTK_WIDGET (fs), FALSE); + GimpFileDialog *dialog = GIMP_FILE_DIALOG (save_dialog); + + gtk_widget_set_sensitive (save_dialog, FALSE); file_save_dialog_save_image (save_dialog, - the_gimage, + dialog->gimage, uri, raw_filename, - save_file_proc, - set_uri_and_proc, - set_image_clean); + dialog->file_proc, + dialog->set_uri_and_proc, + dialog->set_image_clean); - gtk_widget_set_sensitive (GTK_WIDGET (fs), TRUE); + gtk_widget_set_sensitive (save_dialog, TRUE); } g_free (uri); @@ -336,13 +323,15 @@ file_save_overwrite_callback (GtkWidget *widget, if (overwrite) { + GimpFileDialog *dialog = GIMP_FILE_DIALOG (overwrite_data->save_dialog); + file_save_dialog_save_image (overwrite_data->save_dialog, - the_gimage, + dialog->gimage, overwrite_data->uri, overwrite_data->raw_filename, - save_file_proc, - set_uri_and_proc, - set_image_clean); + dialog->file_proc, + dialog->set_uri_and_proc, + dialog->set_image_clean); } gtk_widget_set_sensitive (overwrite_data->save_dialog, TRUE); diff --git a/app/gui/file-save-dialog.h b/app/gui/file-save-dialog.h index f7bf47278b..5dc00997b3 100644 --- a/app/gui/file-save-dialog.h +++ b/app/gui/file-save-dialog.h @@ -20,8 +20,6 @@ #define __FILE_SAVE_DIALOG_H__ -void file_save_dialog_set_type (PlugInProcDef *proc); - void file_save_dialog_show (GimpImage *gimage, GimpMenuFactory *menu_factory, GtkWidget *parent); diff --git a/app/gui/file-save-menu.c b/app/gui/file-save-menu.c index 9bd105f72f..a53573190e 100644 --- a/app/gui/file-save-menu.c +++ b/app/gui/file-save-menu.c @@ -45,7 +45,7 @@ GimpItemFactoryEntry file_save_menu_entries[] = { { { N_("/By Extension"), NULL, - file_save_by_extension_cmd_callback, 0 }, + file_type_cmd_callback, 0 }, NULL, GIMP_HELP_FILE_SAVE_BY_EXTENSION, NULL }, @@ -56,21 +56,21 @@ gint n_file_save_menu_entries = G_N_ELEMENTS (file_save_menu_entries); void -file_save_menu_setup (GimpItemFactory *factory) +file_save_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { GSList *list; for (list = factory->gimp->save_procs; list; list = g_slist_next (list)) { - PlugInProcDef *file_proc; - GimpItemFactoryEntry entry; + PlugInProcDef *file_proc = list->data; const gchar *locale_domain = NULL; const gchar *item_type = NULL; const gchar *stock_id = NULL; gchar *help_id; + GimpItemFactoryEntry entry; gboolean is_xcf; - - file_proc = (PlugInProcDef *) list->data; + GtkWidget *menu_item; if (! file_proc->menu_path) continue; @@ -98,7 +98,7 @@ file_save_menu_setup (GimpItemFactory *factory) entry.entry.path = strstr (file_proc->menu_path, "/"); entry.entry.accelerator = NULL; - entry.entry.callback = file_save_type_cmd_callback; + entry.entry.callback = file_type_cmd_callback; entry.entry.callback_action = 0; entry.entry.item_type = (gchar *) item_type; entry.entry.extra_data = stock_id; @@ -109,16 +109,16 @@ file_save_menu_setup (GimpItemFactory *factory) gimp_item_factory_create_item (factory, &entry, locale_domain, - file_proc, 2, FALSE); + callback_data, 2, FALSE); - if (is_xcf) + menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), + entry.entry.path); + + if (menu_item) { - GtkWidget *menu_item; + g_object_set_data (G_OBJECT (menu_item), "file-proc", file_proc); - menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), - entry.entry.path); - - if (menu_item) + if (is_xcf) gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, 1); } diff --git a/app/gui/file-save-menu.h b/app/gui/file-save-menu.h index a025e2f0c5..5559e2ed18 100644 --- a/app/gui/file-save-menu.h +++ b/app/gui/file-save-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry file_save_menu_entries[]; extern gint n_file_save_menu_entries; -void file_save_menu_setup (GimpItemFactory *factory); +void file_save_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void file_save_menu_update (GtkItemFactory *item_factory, - gpointer data); + gpointer update_data); #endif /* __FILE_SAVE_MENU_H__ */ diff --git a/app/gui/image-menu.c b/app/gui/image-menu.c index 7bf509b5c5..b2fe372f27 100644 --- a/app/gui/image-menu.c +++ b/app/gui/image-menu.c @@ -1130,7 +1130,8 @@ gint n_image_menu_entries = G_N_ELEMENTS (image_menu_entries); void -image_menu_setup (GimpItemFactory *factory) +image_menu_setup (GimpItemFactory *factory, + gpointer setup_data) { if (GTK_IS_MENU_BAR (GTK_ITEM_FACTORY (factory)->widget)) { diff --git a/app/gui/image-menu.h b/app/gui/image-menu.h index 1718685181..1d7be09410 100644 --- a/app/gui/image-menu.h +++ b/app/gui/image-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry image_menu_entries[]; extern gint n_image_menu_entries; -void image_menu_setup (GimpItemFactory *factory); +void image_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void image_menu_update (GtkItemFactory *factory, - gpointer data); + gpointer update_data); #endif /* __IMAGE_MENU_H__ */ diff --git a/app/gui/tool-options-menu.c b/app/gui/tool-options-menu.c index 62ac04216d..a01fcd6af4 100644 --- a/app/gui/tool-options-menu.c +++ b/app/gui/tool-options-menu.c @@ -104,7 +104,8 @@ gint n_tool_options_menu_entries = G_N_ELEMENTS (tool_options_menu_entries); /* public functions */ void -tool_options_menu_setup (GimpItemFactory *factory) +tool_options_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { gimp_item_factory_set_sensitive (GTK_ITEM_FACTORY (factory), "/Restore Options from/(None)", FALSE); diff --git a/app/gui/tool-options-menu.h b/app/gui/tool-options-menu.h index 5dbbd146e9..d7a0ffa9cd 100644 --- a/app/gui/tool-options-menu.h +++ b/app/gui/tool-options-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry tool_options_menu_entries[]; extern gint n_tool_options_menu_entries; -void tool_options_menu_setup (GimpItemFactory *factory); +void tool_options_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void tool_options_menu_update (GtkItemFactory *factory, - gpointer data); + gpointer update_data); #endif /* __TOOL_OPTIONS_MENU_H__ */ diff --git a/app/gui/toolbox-menu.c b/app/gui/toolbox-menu.c index edfdae2066..66ba4f1234 100644 --- a/app/gui/toolbox-menu.c +++ b/app/gui/toolbox-menu.c @@ -285,7 +285,8 @@ gint n_toolbox_menu_entries = G_N_ELEMENTS (toolbox_menu_entries); void -toolbox_menu_setup (GimpItemFactory *factory) +toolbox_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { static gchar *reorder_subsubmenus[] = { "/Xtns" }; diff --git a/app/gui/toolbox-menu.h b/app/gui/toolbox-menu.h index 886ed6a4d1..419471cbfe 100644 --- a/app/gui/toolbox-menu.h +++ b/app/gui/toolbox-menu.h @@ -24,7 +24,8 @@ extern GimpItemFactoryEntry toolbox_menu_entries[]; extern gint n_toolbox_menu_entries; -void toolbox_menu_setup (GimpItemFactory *factory); +void toolbox_menu_setup (GimpItemFactory *factory, + gpointer callback_data); #endif /* __TOOLBOX_MENU_H__ */ diff --git a/app/menus/file-open-menu.c b/app/menus/file-open-menu.c index 9c55e084b3..a0da6a126d 100644 --- a/app/menus/file-open-menu.c +++ b/app/menus/file-open-menu.c @@ -44,7 +44,7 @@ GimpItemFactoryEntry file_open_menu_entries[] = { { { N_("/Automatic"), NULL, - file_open_by_extension_cmd_callback, 0 }, + file_type_cmd_callback, 0 }, NULL, GIMP_HELP_FILE_OPEN_BY_EXTENSION, NULL }, @@ -55,21 +55,21 @@ gint n_file_open_menu_entries = G_N_ELEMENTS (file_open_menu_entries); void -file_open_menu_setup (GimpItemFactory *factory) +file_open_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { GSList *list; for (list = factory->gimp->load_procs; list; list = g_slist_next (list)) { - PlugInProcDef *file_proc; - GimpItemFactoryEntry entry; + PlugInProcDef *file_proc = list->data; const gchar *locale_domain = NULL; const gchar *item_type = NULL; const gchar *stock_id = NULL; gchar *help_id; + GimpItemFactoryEntry entry; gboolean is_xcf; - - file_proc = (PlugInProcDef *) list->data; + GtkWidget *menu_item; if (! file_proc->menu_path) continue; @@ -97,7 +97,7 @@ file_open_menu_setup (GimpItemFactory *factory) entry.entry.path = strstr (file_proc->menu_path, "/"); entry.entry.accelerator = NULL; - entry.entry.callback = file_open_type_cmd_callback; + entry.entry.callback = file_type_cmd_callback; entry.entry.callback_action = 0; entry.entry.item_type = (gchar *) item_type; entry.entry.extra_data = stock_id; @@ -108,16 +108,16 @@ file_open_menu_setup (GimpItemFactory *factory) gimp_item_factory_create_item (factory, &entry, locale_domain, - file_proc, 2, FALSE); + callback_data, 2, FALSE); - if (is_xcf) + menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), + entry.entry.path); + + if (menu_item) { - GtkWidget *menu_item; + g_object_set_data (G_OBJECT (menu_item), "file-proc", file_proc); - menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), - entry.entry.path); - - if (menu_item) + if (is_xcf) gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, 1); } diff --git a/app/menus/file-open-menu.h b/app/menus/file-open-menu.h index 7b3fa8060d..8a31ae889c 100644 --- a/app/menus/file-open-menu.h +++ b/app/menus/file-open-menu.h @@ -24,7 +24,8 @@ extern GimpItemFactoryEntry file_open_menu_entries[]; extern gint n_file_open_menu_entries; -void file_open_menu_setup (GimpItemFactory *factory); +void file_open_menu_setup (GimpItemFactory *factory, + gpointer callback_data); #endif /* __FILE_OPEN_MENU_H__ */ diff --git a/app/menus/file-save-menu.c b/app/menus/file-save-menu.c index 9bd105f72f..a53573190e 100644 --- a/app/menus/file-save-menu.c +++ b/app/menus/file-save-menu.c @@ -45,7 +45,7 @@ GimpItemFactoryEntry file_save_menu_entries[] = { { { N_("/By Extension"), NULL, - file_save_by_extension_cmd_callback, 0 }, + file_type_cmd_callback, 0 }, NULL, GIMP_HELP_FILE_SAVE_BY_EXTENSION, NULL }, @@ -56,21 +56,21 @@ gint n_file_save_menu_entries = G_N_ELEMENTS (file_save_menu_entries); void -file_save_menu_setup (GimpItemFactory *factory) +file_save_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { GSList *list; for (list = factory->gimp->save_procs; list; list = g_slist_next (list)) { - PlugInProcDef *file_proc; - GimpItemFactoryEntry entry; + PlugInProcDef *file_proc = list->data; const gchar *locale_domain = NULL; const gchar *item_type = NULL; const gchar *stock_id = NULL; gchar *help_id; + GimpItemFactoryEntry entry; gboolean is_xcf; - - file_proc = (PlugInProcDef *) list->data; + GtkWidget *menu_item; if (! file_proc->menu_path) continue; @@ -98,7 +98,7 @@ file_save_menu_setup (GimpItemFactory *factory) entry.entry.path = strstr (file_proc->menu_path, "/"); entry.entry.accelerator = NULL; - entry.entry.callback = file_save_type_cmd_callback; + entry.entry.callback = file_type_cmd_callback; entry.entry.callback_action = 0; entry.entry.item_type = (gchar *) item_type; entry.entry.extra_data = stock_id; @@ -109,16 +109,16 @@ file_save_menu_setup (GimpItemFactory *factory) gimp_item_factory_create_item (factory, &entry, locale_domain, - file_proc, 2, FALSE); + callback_data, 2, FALSE); - if (is_xcf) + menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), + entry.entry.path); + + if (menu_item) { - GtkWidget *menu_item; + g_object_set_data (G_OBJECT (menu_item), "file-proc", file_proc); - menu_item = gtk_item_factory_get_widget (GTK_ITEM_FACTORY (factory), - entry.entry.path); - - if (menu_item) + if (is_xcf) gtk_menu_reorder_child (GTK_MENU (menu_item->parent), menu_item, 1); } diff --git a/app/menus/file-save-menu.h b/app/menus/file-save-menu.h index a025e2f0c5..5559e2ed18 100644 --- a/app/menus/file-save-menu.h +++ b/app/menus/file-save-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry file_save_menu_entries[]; extern gint n_file_save_menu_entries; -void file_save_menu_setup (GimpItemFactory *factory); +void file_save_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void file_save_menu_update (GtkItemFactory *item_factory, - gpointer data); + gpointer update_data); #endif /* __FILE_SAVE_MENU_H__ */ diff --git a/app/menus/image-menu.c b/app/menus/image-menu.c index 7bf509b5c5..b2fe372f27 100644 --- a/app/menus/image-menu.c +++ b/app/menus/image-menu.c @@ -1130,7 +1130,8 @@ gint n_image_menu_entries = G_N_ELEMENTS (image_menu_entries); void -image_menu_setup (GimpItemFactory *factory) +image_menu_setup (GimpItemFactory *factory, + gpointer setup_data) { if (GTK_IS_MENU_BAR (GTK_ITEM_FACTORY (factory)->widget)) { diff --git a/app/menus/image-menu.h b/app/menus/image-menu.h index 1718685181..1d7be09410 100644 --- a/app/menus/image-menu.h +++ b/app/menus/image-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry image_menu_entries[]; extern gint n_image_menu_entries; -void image_menu_setup (GimpItemFactory *factory); +void image_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void image_menu_update (GtkItemFactory *factory, - gpointer data); + gpointer update_data); #endif /* __IMAGE_MENU_H__ */ diff --git a/app/menus/tool-options-menu.c b/app/menus/tool-options-menu.c index 62ac04216d..a01fcd6af4 100644 --- a/app/menus/tool-options-menu.c +++ b/app/menus/tool-options-menu.c @@ -104,7 +104,8 @@ gint n_tool_options_menu_entries = G_N_ELEMENTS (tool_options_menu_entries); /* public functions */ void -tool_options_menu_setup (GimpItemFactory *factory) +tool_options_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { gimp_item_factory_set_sensitive (GTK_ITEM_FACTORY (factory), "/Restore Options from/(None)", FALSE); diff --git a/app/menus/tool-options-menu.h b/app/menus/tool-options-menu.h index 5dbbd146e9..d7a0ffa9cd 100644 --- a/app/menus/tool-options-menu.h +++ b/app/menus/tool-options-menu.h @@ -24,9 +24,10 @@ extern GimpItemFactoryEntry tool_options_menu_entries[]; extern gint n_tool_options_menu_entries; -void tool_options_menu_setup (GimpItemFactory *factory); +void tool_options_menu_setup (GimpItemFactory *factory, + gpointer callback_data); void tool_options_menu_update (GtkItemFactory *factory, - gpointer data); + gpointer update_data); #endif /* __TOOL_OPTIONS_MENU_H__ */ diff --git a/app/menus/toolbox-menu.c b/app/menus/toolbox-menu.c index edfdae2066..66ba4f1234 100644 --- a/app/menus/toolbox-menu.c +++ b/app/menus/toolbox-menu.c @@ -285,7 +285,8 @@ gint n_toolbox_menu_entries = G_N_ELEMENTS (toolbox_menu_entries); void -toolbox_menu_setup (GimpItemFactory *factory) +toolbox_menu_setup (GimpItemFactory *factory, + gpointer callback_data) { static gchar *reorder_subsubmenus[] = { "/Xtns" }; diff --git a/app/menus/toolbox-menu.h b/app/menus/toolbox-menu.h index 886ed6a4d1..419471cbfe 100644 --- a/app/menus/toolbox-menu.h +++ b/app/menus/toolbox-menu.h @@ -24,7 +24,8 @@ extern GimpItemFactoryEntry toolbox_menu_entries[]; extern gint n_toolbox_menu_entries; -void toolbox_menu_setup (GimpItemFactory *factory); +void toolbox_menu_setup (GimpItemFactory *factory, + gpointer callback_data); #endif /* __TOOLBOX_MENU_H__ */ diff --git a/app/widgets/Makefile.am b/app/widgets/Makefile.am index 246a7ede84..bf32355bcc 100644 --- a/app/widgets/Makefile.am +++ b/app/widgets/Makefile.am @@ -99,6 +99,8 @@ libappwidgets_a_sources = \ gimpenummenu.h \ gimperrorconsole.c \ gimperrorconsole.h \ + gimpfiledialog.c \ + gimpfiledialog.h \ gimpfontview.c \ gimpfontview.h \ gimpgradienteditor.c \ diff --git a/app/widgets/gimpfiledialog.c b/app/widgets/gimpfiledialog.c new file mode 100644 index 0000000000..bf50324d16 --- /dev/null +++ b/app/widgets/gimpfiledialog.c @@ -0,0 +1,224 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpfiledialog.c + * Copyright (C) 2004 Michael Natterer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include "libgimpwidgets/gimpwidgets.h" + +#include "widgets-types.h" + +#include "core/gimp.h" +#include "core/gimpimage.h" + +#include "plug-in/plug-in-proc.h" + +#include "gimpfiledialog.h" +#include "gimpmenufactory.h" + +#include "gimp-intl.h" + + +static void gimp_file_dialog_class_init (GimpFileDialogClass *klass); +static void gimp_file_dialog_init (GimpFileDialog *dialog); + +static void gimp_file_dialog_destroy (GtkObject *object); + +static gboolean gimp_file_dialog_delete_event (GtkWidget *widget, + GdkEventAny *event); + + +static GtkFileSelectionClass *parent_class = NULL; + + +GType +gimp_file_dialog_get_type (void) +{ + static GType dialog_type = 0; + + if (! dialog_type) + { + static const GTypeInfo dialog_info = + { + sizeof (GimpFileDialogClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) gimp_file_dialog_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GimpFileDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) gimp_file_dialog_init, + }; + + dialog_type = g_type_register_static (GTK_TYPE_FILE_SELECTION, + "GimpFileDialog", + &dialog_info, 0); + } + + return dialog_type; +} + +static void +gimp_file_dialog_class_init (GimpFileDialogClass *klass) +{ + GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + parent_class = g_type_class_peek_parent (klass); + + object_class->destroy = gimp_file_dialog_destroy; + + widget_class->delete_event = gimp_file_dialog_delete_event; +} + +static void +gimp_file_dialog_init (GimpFileDialog *dialog) +{ + GtkFileSelection *fs = GTK_FILE_SELECTION (dialog); + + gtk_container_set_border_width (GTK_CONTAINER (fs), 6); + gtk_container_set_border_width (GTK_CONTAINER (fs->button_area), 4); +} + +static void +gimp_file_dialog_destroy (GtkObject *object) +{ + GimpFileDialog *dialog = GIMP_FILE_DIALOG (object); + + if (dialog->item_factory) + { + g_object_unref (dialog->item_factory); + dialog->item_factory = NULL; + } + + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +static gboolean +gimp_file_dialog_delete_event (GtkWidget *widget, + GdkEventAny *event) +{ + return TRUE; +} + + +/* public functions */ + +GtkWidget * +gimp_file_dialog_new (Gimp *gimp, + GimpMenuFactory *menu_factory, + const gchar *menu_identifier, + const gchar *title, + const gchar *role, + const gchar *stock_id, + const gchar *help_id) +{ + GimpFileDialog *dialog; + GtkWidget *hbox; + GtkWidget *option_menu; + GtkWidget *label; + + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); + g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL); + g_return_val_if_fail (menu_identifier != NULL, NULL); + g_return_val_if_fail (title != NULL, NULL); + g_return_val_if_fail (role != NULL, NULL); + g_return_val_if_fail (stock_id != NULL, NULL); + g_return_val_if_fail (help_id != NULL, NULL); + + dialog = g_object_new (GIMP_TYPE_FILE_DIALOG, + "title", title, + NULL); + + gtk_window_set_role (GTK_WINDOW (dialog), role); + + gimp_help_connect (GTK_WIDGET (dialog), gimp_standard_help_func, + help_id, NULL); + + dialog->gimp = gimp; + dialog->item_factory = gimp_menu_factory_menu_new (menu_factory, + menu_identifier, + GTK_TYPE_MENU, + dialog, + FALSE); + + hbox = gtk_hbox_new (FALSE, 4); + gtk_box_pack_end (GTK_BOX (GTK_FILE_SELECTION (dialog)->main_vbox), hbox, + FALSE, FALSE, 0); + gtk_widget_show (hbox); + + option_menu = gtk_option_menu_new (); + gtk_box_pack_end (GTK_BOX (hbox), option_menu, FALSE, FALSE, 0); + gtk_widget_show (option_menu); + + gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), + GTK_ITEM_FACTORY (dialog->item_factory)->widget); + + label = gtk_label_new_with_mnemonic (_("Determine File _Type:")); + gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0); + gtk_widget_show (label); + + gtk_label_set_mnemonic_widget (GTK_LABEL (label), option_menu); + + return GTK_WIDGET (dialog); +} + +void +gimp_file_dialog_set_file_proc (GimpFileDialog *dialog, + PlugInProcDef *file_proc) +{ + g_return_if_fail (GIMP_IS_FILE_DIALOG (dialog)); + + if (file_proc == dialog->file_proc) + return; + + dialog->file_proc = file_proc; + + if (file_proc && file_proc->extensions_list && dialog->gimage) + { + GtkFileSelection *fs = GTK_FILE_SELECTION (dialog); + const gchar *text; + gchar *last_dot; + GString *s; + + text = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); + last_dot = strrchr (text, '.'); + + if (last_dot == text || !text[0]) + return; + + s = g_string_new (text); + + if (last_dot) + g_string_truncate (s, last_dot-text); + + g_string_append (s, "."); + g_string_append (s, (gchar *) file_proc->extensions_list->data); + + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), s->str); + + g_string_free (s, TRUE); + } +} diff --git a/app/widgets/gimpfiledialog.h b/app/widgets/gimpfiledialog.h new file mode 100644 index 0000000000..7736e0e415 --- /dev/null +++ b/app/widgets/gimpfiledialog.h @@ -0,0 +1,75 @@ +/* The GIMP -- an image manipulation program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpfiledialog.h + * Copyright (C) 2004 Michael Natterer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GIMP_FILE_DIALOG_H__ +#define __GIMP_FILE_DIALOG_H__ + +G_BEGIN_DECLS + + +#define GIMP_TYPE_FILE_DIALOG (gimp_file_dialog_get_type ()) +#define GIMP_FILE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_FILE_DIALOG, GimpFileDialog)) +#define GIMP_FILE_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_FILE_DIALOG, GimpFileDialogClass)) +#define GIMP_IS_FILE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_FILE_DIALOG)) +#define GIMP_IS_FILE_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_FILE_DIALOG)) +#define GIMP_FILE_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_FILE_DIALOG, GimpFileDialogClass)) + + +typedef struct _GimpFileDialogClass GimpFileDialogClass; + +struct _GimpFileDialog +{ + GtkFileSelection parent_instance; + + Gimp *gimp; + GimpItemFactory *item_factory; + PlugInProcDef *file_proc; + + GimpImage *gimage; + gboolean set_uri_and_proc; + gboolean set_image_clean; + + GtkWidget *thumb_box; +}; + +struct _GimpFileDialogClass +{ + GtkFileSelectionClass parent_class; +}; + + +GType gimp_file_dialog_get_type (void) G_GNUC_CONST; + +GtkWidget * gimp_file_dialog_new (Gimp *gimp, + GimpMenuFactory *menu_factory, + const gchar *menu_identifier, + const gchar *title, + const gchar *role, + const gchar *stock_id, + const gchar *help_id); + +void gimp_file_dialog_set_file_proc (GimpFileDialog *dialog, + PlugInProcDef *file_proc); + + +G_END_DECLS + +#endif /* __GIMP_FILE_DIALOG_H__ */ diff --git a/app/widgets/gimpmenufactory.c b/app/widgets/gimpmenufactory.c index 8b0d5ce4aa..8598507bb0 100644 --- a/app/widgets/gimpmenufactory.c +++ b/app/widgets/gimpmenufactory.c @@ -198,7 +198,7 @@ gimp_menu_factory_menu_new (GimpMenuFactory *factory, create_tearoff); if (entry->setup_func) - entry->setup_func (item_factory); + entry->setup_func (item_factory, callback_data); return item_factory; } diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h index a1f10ab1cf..a4c291f5ad 100644 --- a/app/widgets/widgets-types.h +++ b/app/widgets/widgets-types.h @@ -106,6 +106,7 @@ typedef struct _GimpDockedInterface GimpDockedInterface; typedef struct _GimpContainerPopup GimpContainerPopup; typedef struct _GimpViewableButton GimpViewableButton; typedef struct _GimpViewableDialog GimpViewableDialog; +typedef struct _GimpFileDialog GimpFileDialog; typedef struct _GimpHistogramView GimpHistogramView; typedef struct _GimpHistogramBox GimpHistogramBox; @@ -130,9 +131,10 @@ typedef struct _GimpSessionInfoAux GimpSessionInfoAux; /* function types */ -typedef void (* GimpItemFactorySetupFunc) (GimpItemFactory *factory); +typedef void (* GimpItemFactorySetupFunc) (GimpItemFactory *factory, + gpointer callback_data); typedef void (* GimpItemFactoryUpdateFunc) (GtkItemFactory *factory, - gpointer data); + gpointer update_data); typedef void (* GimpMenuPositionFunc) (GtkMenu *menu, gint *x,