[gimp] Bug 320447 - fast switching between "color managed display" and "softproof"



commit beb3279bf2ea69d957af7dbc81faa502769b63e9
Author: Michael Natterer <mitch gimp org>
Date:   Fri Sep 30 20:54:10 2016 +0200

    Bug 320447 - fast switching between "color managed display" and "softproof"
    
    Add a SELECT_SOFTPROOF_PROFILE mode to the color profile dialog and
    use it to select a profile from a newly added "Soft-Proofing Profile..."
    menu item in view -> color management.

 app/actions/view-actions.c              |    7 +++
 app/actions/view-commands.c             |   83 +++++++++++++++++++++++++++--
 app/actions/view-commands.h             |    2 +
 app/dialogs/color-profile-dialog.c      |   91 ++++++++++++++++++++-----------
 app/dialogs/color-profile-dialog.h      |    3 +-
 app/display/gimpdisplayshell-handlers.c |    1 +
 app/display/gimpdisplayshell-profile.c  |    2 +
 app/widgets/gimppropwidgets.c           |    7 ++-
 app/widgets/gimpwidgets-constructors.c  |   24 +++++++--
 menus/image-menu.xml.in                 |    1 +
 10 files changed, 176 insertions(+), 45 deletions(-)
---
diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c
index 5323fdf..9f5b333 100644
--- a/app/actions/view-actions.c
+++ b/app/actions/view-actions.c
@@ -146,6 +146,12 @@ static const GimpActionEntry view_actions[] =
     G_CALLBACK (view_color_management_reset_cmd_callback),
     GIMP_HELP_VIEW_COLOR_MANAGEMENT },
 
+  { "view-softproof-profile", NULL,
+    NC_("view-action", "Soft-_Proofing Profile..."), NULL,
+    NC_("view-action", "Set the soft-proofing profile"),
+    G_CALLBACK (view_softproof_profile_cmd_callback),
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
   { "view-shrink-wrap", "zoom-fit-best",
     NC_("view-action", "Shrink _Wrap"), "<primary>J",
     NC_("view-action", "Reduce the image window to the size of the image display"),
@@ -967,6 +973,7 @@ view_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("view-display-intent-absolute-colorimetric",   cm);
   SET_SENSITIVE ("view-display-black-point-compensation",       cm);
   SET_ACTIVE    ("view-display-black-point-compensation",       d_bpc);
+  SET_SENSITIVE ("view-softproof-profile",                      sp);
   SET_SENSITIVE ("view-softproof-intent-perceptual",            sp);
   SET_SENSITIVE ("view-softproof-intent-relative-colorimetric", sp);
   SET_SENSITIVE ("view-softproof-intent-saturation",            sp);
diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c
index 0d9a10e..8ee7a98 100644
--- a/app/actions/view-commands.c
+++ b/app/actions/view-commands.c
@@ -55,6 +55,7 @@
 #include "display/gimpdisplayshell-close.h"
 #include "display/gimpimagewindow.h"
 
+#include "dialogs/color-profile-dialog.h"
 #include "dialogs/dialogs.h"
 
 #include "actions.h"
@@ -75,10 +76,17 @@
 
 /*  local function prototypes  */
 
-static void   view_padding_color_dialog_update (GimpColorDialog      *dialog,
-                                                const GimpRGB        *color,
-                                                GimpColorDialogState  state,
-                                                GimpDisplayShell     *shell);
+static void   view_softproof_profile_callback  (GtkWidget                *dialog,
+                                                GimpImage                *image,
+                                                GimpColorProfile         *new_profile,
+                                                GFile                    *new_file,
+                                                GimpColorRenderingIntent  intent,
+                                                gboolean                  bpc,
+                                                gpointer                  user_data);
+static void   view_padding_color_dialog_update (GimpColorDialog          *dialog,
+                                                const GimpRGB            *color,
+                                                GimpColorDialogState      state,
+                                                GimpDisplayShell         *shell);
 
 
 /*  public functions  */
@@ -625,6 +633,47 @@ view_display_bpc_cmd_callback (GtkAction *action,
 }
 
 void
+view_softproof_profile_cmd_callback (GtkAction *action,
+                                     gpointer   data)
+{
+  GimpImage        *image;
+  GimpDisplayShell *shell;
+  GimpColorConfig  *color_config;
+  GtkWidget        *dialog;
+  return_if_no_image (image, data);
+  return_if_no_shell (shell, data);
+
+  color_config = gimp_display_shell_get_color_config (shell);
+
+#define SOFTPROOF_PROFILE_DIALOG_KEY "gimp-softproof-profile-dialog"
+
+  dialog = dialogs_get_dialog (G_OBJECT (shell), SOFTPROOF_PROFILE_DIALOG_KEY);
+
+  if (! dialog)
+    {
+      GimpColorProfile *current_profile;
+
+      current_profile = gimp_color_config_get_simulation_color_profile (color_config,
+                                                                        NULL);
+
+      dialog = color_profile_dialog_new (COLOR_PROFILE_DIALOG_SELECT_SOFTPROOF_PROFILE,
+                                         image,
+                                         action_data_get_context (data),
+                                         GTK_WIDGET (shell),
+                                         current_profile,
+                                         NULL,
+                                         0, 0,
+                                         view_softproof_profile_callback,
+                                         shell);
+
+      dialogs_attach_dialog (G_OBJECT (shell),
+                             SOFTPROOF_PROFILE_DIALOG_KEY, dialog);
+    }
+
+  gtk_window_present (GTK_WINDOW (dialog));
+}
+
+void
 view_softproof_intent_cmd_callback (GtkAction *action,
                                     GtkAction *current,
                                     gpointer   data)
@@ -1030,6 +1079,32 @@ view_fullscreen_cmd_callback (GtkAction *action,
 /*  private functions  */
 
 static void
+view_softproof_profile_callback (GtkWidget                *dialog,
+                                 GimpImage                *image,
+                                 GimpColorProfile         *new_profile,
+                                 GFile                    *new_file,
+                                 GimpColorRenderingIntent  intent,
+                                 gboolean                  bpc,
+                                 gpointer                  user_data)
+{
+  GimpDisplayShell *shell = user_data;
+  GimpColorConfig  *color_config;
+  gchar            *path  = NULL;
+
+  color_config = gimp_display_shell_get_color_config (shell);
+
+  if (new_file)
+    path = g_file_get_path (new_file);
+
+  g_object_set (color_config,
+                "printer-profile", path,
+                NULL);
+  shell->color_config_set = TRUE;
+
+  gtk_widget_destroy (dialog);
+}
+
+static void
 view_padding_color_dialog_update (GimpColorDialog      *dialog,
                                   const GimpRGB        *color,
                                   GimpColorDialogState  state,
diff --git a/app/actions/view-commands.h b/app/actions/view-commands.h
index 34c7955..e18b72f 100644
--- a/app/actions/view-commands.h
+++ b/app/actions/view-commands.h
@@ -81,6 +81,8 @@ void   view_display_intent_cmd_callback         (GtkAction *action,
                                                  gpointer   data);
 void   view_display_bpc_cmd_callback            (GtkAction *action,
                                                  gpointer   data);
+void   view_softproof_profile_cmd_callback      (GtkAction *action,
+                                                 gpointer   data);
 void   view_softproof_intent_cmd_callback       (GtkAction *action,
                                                  GtkAction *current,
                                                  gpointer   data);
diff --git a/app/dialogs/color-profile-dialog.c b/app/dialogs/color-profile-dialog.c
index 6d951a8..e16510a 100644
--- a/app/dialogs/color-profile-dialog.c
+++ b/app/dialogs/color-profile-dialog.c
@@ -194,6 +194,24 @@ color_profile_dialog_new (ColorProfileDialogType    dialog_type,
       dest_label = _("Convert to");
       break;
 
+    case COLOR_PROFILE_DIALOG_SELECT_SOFTPROOF_PROFILE:
+      dialog =
+        gimp_viewable_dialog_new (GIMP_VIEWABLE (image), context,
+                                  _("Soft-Proof Profile"),
+                                  "gimp-select-softproof-profile",
+                                  GTK_STOCK_PRINT,
+                                  _("Select Soft-Proof Profile"),
+                                  parent,
+                                  gimp_standard_help_func,
+                                  GIMP_HELP_VIEW_COLOR_MANAGEMENT,
+
+                                  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                  _("_Select"),     GTK_RESPONSE_OK,
+
+                                  NULL);
+      dest_label = _("New Color Profile");
+      break;
+
     default:
       g_return_val_if_reached (NULL);
     }
@@ -304,49 +322,58 @@ color_profile_dialog_new (ColorProfileDialogType    dialog_type,
 static GtkWidget *
 color_profile_combo_box_new (ProfileDialog *private)
 {
-  GtkListStore      *store;
-  GtkWidget         *combo;
-  GtkWidget         *chooser;
-  gchar             *history;
-  GimpImageBaseType  base_type;
-  GimpPrecision      precision;
-  GError            *error = NULL;
+  GtkListStore *store;
+  GtkWidget    *combo;
+  GtkWidget    *chooser;
+  gchar        *history;
 
   history = gimp_personal_rc_file ("profilerc");
   store = gimp_color_profile_store_new (history);
   g_free (history);
 
-  switch (private->dialog_type)
+  if (private->default_profile)
     {
-    case COLOR_PROFILE_DIALOG_ASSIGN_PROFILE:
-    case COLOR_PROFILE_DIALOG_CONVERT_TO_PROFILE:
-      base_type = gimp_image_get_base_type (private->image);
-      break;
+      GimpImageBaseType  base_type;
+      GimpPrecision      precision;
+      GError            *error = NULL;
 
-    case COLOR_PROFILE_DIALOG_CONVERT_TO_RGB:
-      base_type = GIMP_RGB;
-      break;
+      switch (private->dialog_type)
+        {
+        case COLOR_PROFILE_DIALOG_ASSIGN_PROFILE:
+        case COLOR_PROFILE_DIALOG_CONVERT_TO_PROFILE:
+          base_type = gimp_image_get_base_type (private->image);
+          break;
 
-    case COLOR_PROFILE_DIALOG_CONVERT_TO_GRAY:
-      base_type = GIMP_GRAY;
-      break;
+        case COLOR_PROFILE_DIALOG_CONVERT_TO_RGB:
+          base_type = GIMP_RGB;
+          break;
 
-    default:
-      g_return_val_if_reached (NULL);
-    }
+        case COLOR_PROFILE_DIALOG_CONVERT_TO_GRAY:
+          base_type = GIMP_GRAY;
+          break;
 
-  precision = gimp_image_get_precision (private->image);
+        default:
+          g_return_val_if_reached (NULL);
+        }
+
+      precision = gimp_image_get_precision (private->image);
 
-  if (! gimp_color_profile_store_add_defaults (GIMP_COLOR_PROFILE_STORE (store),
-                                               private->config,
-                                               base_type,
-                                               precision,
-                                               &error))
+      if (! gimp_color_profile_store_add_defaults (GIMP_COLOR_PROFILE_STORE (store),
+                                                   private->config,
+                                                   base_type,
+                                                   precision,
+                                                   &error))
+        {
+          gimp_message (private->image->gimp, G_OBJECT (private->dialog),
+                        GIMP_MESSAGE_ERROR,
+                        "%s", error->message);
+          g_clear_error (&error);
+        }
+    }
+  else
     {
-      gimp_message (private->image->gimp, G_OBJECT (private->dialog),
-                    GIMP_MESSAGE_ERROR,
-                    "%s", error->message);
-      g_clear_error (&error);
+      gimp_color_profile_store_add_file (GIMP_COLOR_PROFILE_STORE (store),
+                                         NULL, NULL);
     }
 
   chooser =
@@ -445,7 +472,7 @@ color_profile_dest_changed (GtkWidget     *combo,
   else
     {
       gimp_color_profile_view_set_error (GIMP_COLOR_PROFILE_VIEW (private->dest_view),
-                                         _("None"));
+                                         C_("profile", "None"));
     }
 
   if (dest_profile)
diff --git a/app/dialogs/color-profile-dialog.h b/app/dialogs/color-profile-dialog.h
index 918c05e..ecf89de 100644
--- a/app/dialogs/color-profile-dialog.h
+++ b/app/dialogs/color-profile-dialog.h
@@ -27,7 +27,8 @@ typedef enum
   COLOR_PROFILE_DIALOG_ASSIGN_PROFILE,
   COLOR_PROFILE_DIALOG_CONVERT_TO_PROFILE,
   COLOR_PROFILE_DIALOG_CONVERT_TO_RGB,
-  COLOR_PROFILE_DIALOG_CONVERT_TO_GRAY
+  COLOR_PROFILE_DIALOG_CONVERT_TO_GRAY,
+  COLOR_PROFILE_DIALOG_SELECT_SOFTPROOF_PROFILE
 } ColorProfileDialogType;
 
 
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index 8fe8836..f81e8fe 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -1129,6 +1129,7 @@ gimp_display_shell_color_config_notify_handler (GObject          *config,
       if (! strcmp (param_spec->name, "mode")                                 ||
           ! strcmp (param_spec->name, "display-rendering-intent")             ||
           ! strcmp (param_spec->name, "display-use-black-point-compensation") ||
+          ! strcmp (param_spec->name, "printer-profile")                      ||
           ! strcmp (param_spec->name, "simulation-rendering-intent")          ||
           ! strcmp (param_spec->name, "simulation-use-black-point-compensation") ||
           ! strcmp (param_spec->name, "simulation-gamut-check"))
diff --git a/app/display/gimpdisplayshell-profile.c b/app/display/gimpdisplayshell-profile.c
index d096c56..dc56d34 100644
--- a/app/display/gimpdisplayshell-profile.c
+++ b/app/display/gimpdisplayshell-profile.c
@@ -272,6 +272,8 @@ gimp_display_shell_color_config_notify (GimpColorConfig  *config,
       SET_ACTIVE    ("view-display-black-point-compensation",
                      gimp_color_config_get_display_bpc (config));
 
+      SET_SENSITIVE ("view-softproof-profile", softproof);
+
       switch (gimp_color_config_get_simulation_intent (config))
         {
         case GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL:
diff --git a/app/widgets/gimppropwidgets.c b/app/widgets/gimppropwidgets.c
index 79f52df..8af6f04 100644
--- a/app/widgets/gimppropwidgets.c
+++ b/app/widgets/gimppropwidgets.c
@@ -1604,10 +1604,11 @@ gimp_prop_profile_combo_box_new (GObject      *config,
   GtkWidget  *combo;
   GFile      *file = NULL;
 
-  param_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (config),
-                                             property_name);
+  param_spec = find_param_spec (config, property_name, G_STRFUNC);
+  if (! param_spec)
+    return NULL;
 
-  if (param_spec && G_IS_PARAM_SPEC_STRING (param_spec))
+  if (G_IS_PARAM_SPEC_STRING (param_spec))
     {
       param_spec = check_param_spec_w (config, property_name,
                                        G_TYPE_PARAM_STRING, G_STRFUNC);
diff --git a/app/widgets/gimpwidgets-constructors.c b/app/widgets/gimpwidgets-constructors.c
index b2a83b5..de47f96 100644
--- a/app/widgets/gimpwidgets-constructors.c
+++ b/app/widgets/gimpwidgets-constructors.c
@@ -229,15 +229,29 @@ gimp_icon_button_new (const gchar *icon_name,
 GtkWidget *
 gimp_color_profile_label_new (GimpColorProfile *profile)
 {
-  GtkWidget *expander;
-  GtkWidget *view;
+  GtkWidget   *expander;
+  GtkWidget   *view;
+  const gchar *label;
 
-  g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (profile), NULL);
+  g_return_val_if_fail (profile == NULL ||
+                        GIMP_IS_COLOR_PROFILE (profile), NULL);
 
-  expander = gtk_expander_new (gimp_color_profile_get_label (profile));
+  if (profile)
+    label = gimp_color_profile_get_label (profile);
+  else
+    label = C_("profile", "None");
+
+  expander = gtk_expander_new (label);
 
   view = gimp_color_profile_view_new ();
-  gimp_color_profile_view_set_profile (GIMP_COLOR_PROFILE_VIEW (view), profile);
+
+  if (profile)
+    gimp_color_profile_view_set_profile (GIMP_COLOR_PROFILE_VIEW (view),
+                                         profile);
+  else
+    gimp_color_profile_view_set_error (GIMP_COLOR_PROFILE_VIEW (view),
+                                       C_("profile", "None"));
+
   gtk_container_add (GTK_CONTAINER (expander), view);
   gtk_widget_show (view);
 
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 682fbf0..101b6a0 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -313,6 +313,7 @@
        </menu>
         <menuitem action="view-display-black-point-compensation" />
         <separator />
+        <menuitem action="view-softproof-profile" />
        <menu action="view-softproof-intent-menu" name="Softproof Rendering Intent">
           <menuitem action="view-softproof-intent-perceptual" />
           <menuitem action="view-softproof-intent-relative-colorimetric" />


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]