From c3c4387d35dc2a44b2b712fac2e48124eb86fa40 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 7 May 2016 03:01:18 +0200 Subject: [PATCH] app: add Image -> Color Management -> Save Color Profile to File... using the stuff added in the last few commits. --- app/actions/image-actions.c | 7 +++ app/actions/image-commands.c | 91 ++++++++++++++++++++++++++++++++++++ app/actions/image-commands.h | 2 + app/widgets/gimphelp-ids.h | 1 + menus/image-menu.xml.in | 2 + 5 files changed, 103 insertions(+) diff --git a/app/actions/image-actions.c b/app/actions/image-actions.c index 7dac0210c7..27d7bba372 100644 --- a/app/actions/image-actions.c +++ b/app/actions/image-actions.c @@ -94,6 +94,12 @@ static const GimpActionEntry image_actions[] = G_CALLBACK (image_color_profile_discard_cmd_callback), GIMP_HELP_IMAGE_COLOR_PROFILE_DISCARD }, + { "image-color-profile-save", NULL, + NC_("image-action", "_Save Color Profile to File..."), NULL, + NC_("image-action", "Save the image's color profile to an ICC file"), + G_CALLBACK (image_color_profile_save_cmd_callback), + GIMP_HELP_IMAGE_COLOR_PROFILE_SAVE }, + { "image-resize", GIMP_STOCK_RESIZE, NC_("image-action", "Can_vas Size..."), NULL, NC_("image-action", "Adjust the image dimensions"), @@ -427,6 +433,7 @@ image_actions_update (GimpActionGroup *group, SET_SENSITIVE ("image-color-profile-assign", image); SET_SENSITIVE ("image-color-profile-convert", image); SET_SENSITIVE ("image-color-profile-discard", image && profile); + SET_SENSITIVE ("image-color-profile-save", image); SET_SENSITIVE ("image-flip-horizontal", image); SET_SENSITIVE ("image-flip-vertical", image); diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c index 529832da1d..a8cc837502 100644 --- a/app/actions/image-commands.c +++ b/app/actions/image-commands.c @@ -20,6 +20,7 @@ #include #include +#include "libgimpcolor/gimpcolor.h" #include "libgimpwidgets/gimpwidgets.h" #include "actions-types.h" @@ -77,6 +78,7 @@ #define IMAGE_CONVERT_TYPE_DIALOG_KEY "image-convert-type-dialog" #define IMAGE_PROFILE_CONVERT_DIALOG_KEY "image-profile-convert-dialog" #define IMAGE_PROFILE_ASSIGN_DIALOG_KEY "image-profile-assign-dialog" +#define IMAGE_PROFILE_SAVE_DIALOG_KEY "image-profile-save-dialog" typedef struct @@ -415,6 +417,95 @@ image_color_profile_discard_cmd_callback (GtkAction *action, gimp_image_flush (image); } +static void +image_profile_save_dialog_unset (GimpImage *image) +{ + g_object_set_data (G_OBJECT (image), IMAGE_PROFILE_SAVE_DIALOG_KEY, NULL); +} + +static void +image_profile_save_dialog_response (GtkWidget *dialog, + gint response_id, + GimpImage *image) +{ + if (response_id == GTK_RESPONSE_ACCEPT) + { + GimpColorProfile *profile; + GFile *file; + GError *error = NULL; + + profile = gimp_color_managed_get_color_profile (GIMP_COLOR_MANAGED (image)); + file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog)); + + if (! file) + return; + + if (! gimp_color_profile_save_to_file (profile, file, &error)) + { + gimp_message (image->gimp, NULL, + GIMP_MESSAGE_WARNING, + _("Saving color profile failed: %s"), + error->message); + g_clear_error (&error); + g_object_unref (file); + return; + } + + g_object_unref (file); + } + + gtk_widget_destroy (dialog); +} + +void +image_color_profile_save_cmd_callback (GtkAction *action, + gpointer data) +{ + GimpImage *image; + GimpDisplay *display; + GtkWidget *widget; + GtkWidget *dialog; + return_if_no_image (image, data); + return_if_no_display (display, data); + return_if_no_widget (widget, data); + + dialog = g_object_get_data (G_OBJECT (image), + IMAGE_PROFILE_SAVE_DIALOG_KEY); + + if (! dialog) + { + GtkWindow *toplevel; + GimpColorProfile *profile; + gchar *basename; + + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (widget)); + profile = gimp_color_managed_get_color_profile (GIMP_COLOR_MANAGED (image)); + + dialog = + gimp_color_profile_chooser_dialog_new (_("Save Color Profile"), + toplevel, + GTK_FILE_CHOOSER_ACTION_SAVE); + + basename = g_strconcat (gimp_color_profile_get_label (profile), + ".icc", NULL); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), basename); + g_free (basename); + + g_signal_connect (dialog, "response", + G_CALLBACK (image_profile_save_dialog_response), + image); + + g_object_set_data (G_OBJECT (image), + IMAGE_PROFILE_SAVE_DIALOG_KEY, dialog); + + g_signal_connect_object (dialog, "destroy", + G_CALLBACK (image_profile_save_dialog_unset), + image, G_CONNECT_SWAPPED); + } + + gtk_window_present (GTK_WINDOW (dialog)); +} + void image_resize_cmd_callback (GtkAction *action, gpointer data) diff --git a/app/actions/image-commands.h b/app/actions/image-commands.h index 6d66aef98b..5754e4974e 100644 --- a/app/actions/image-commands.h +++ b/app/actions/image-commands.h @@ -38,6 +38,8 @@ void image_color_profile_convert_cmd_callback (GtkAction *action, gpointer data); void image_color_profile_discard_cmd_callback (GtkAction *action, gpointer data); +void image_color_profile_save_cmd_callback (GtkAction *action, + gpointer data); void image_resize_cmd_callback (GtkAction *action, gpointer data); diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index bae40f2ec5..86687e9974 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -155,6 +155,7 @@ #define GIMP_HELP_IMAGE_COLOR_PROFILE_ASSIGN "gimp-image-color-profile-assign" #define GIMP_HELP_IMAGE_COLOR_PROFILE_CONVERT "gimp-image-color-profile-convert" #define GIMP_HELP_IMAGE_COLOR_PROFILE_DISCARD "gimp-image-color-profile-discard" +#define GIMP_HELP_IMAGE_COLOR_PROFILE_SAVE "gimp-image-color-profile-save" #define GIMP_HELP_IMAGE_COLOR_PROFILE_IMPORT "gimp-image-color-profile-import" #define GIMP_HELP_IMAGE_GRID "gimp-image-grid" #define GIMP_HELP_IMAGE_PROPERTIES "gimp-image-properties" diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in index 651afe0fcd..cdc76a193e 100644 --- a/menus/image-menu.xml.in +++ b/menus/image-menu.xml.in @@ -355,6 +355,8 @@ + +