[gimp/gimp-2-10] app: add option to keep canvas padding in "show all" mode



commit c8df81692c89f09cfb5328714cdfc3e669dac28b
Author: Ell <ell_se yahoo com>
Date:   Sun Sep 15 16:12:17 2019 +0300

    app: add option to keep canvas padding in "show all" mode
    
    Add an option to keep the normal canvas padding in "show all" mode,
    instead of extending the checkerboard pattern indefinitely.  This
    is useful when wanting to show the image content beyond the canvas,
    while still keeping the focus on the canvas; further commits will
    extend this mode to behave in more view-related cases as if "show
    all" wasn't enabled.
    
    Add a new 'View -> Padding Color -> Keep Padding in "Show All"
    Mode" toggle, which controls this behavior, with a corresponding
    default-value option in the preferences, under "Image Windows ->
    Appearance".

 app/actions/view-actions.c                |  18 ++++
 app/actions/view-commands.c               |  19 +++++
 app/actions/view-commands.h               |   3 +
 app/config/gimpdisplayoptions.c           |  23 +++++-
 app/config/gimpdisplayoptions.h           |   1 +
 app/config/gimprc-blurbs.h                |   4 +
 app/dialogs/preferences-dialog.c          |   4 +
 app/display/gimpdisplayshell-appearance.c |  82 ++++++++++++------
 app/display/gimpdisplayshell-appearance.h | 133 +++++++++++++++---------------
 app/display/gimpdisplayshell-callbacks.c  |  19 +++++
 menus/image-menu.xml.in                   |   2 +
 11 files changed, 218 insertions(+), 90 deletions(-)
---
diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c
index 786a0e423c..bbf272cc62 100644
--- a/app/actions/view-actions.c
+++ b/app/actions/view-actions.c
@@ -628,6 +628,17 @@ static const GimpEnumActionEntry view_padding_color_actions[] =
     GIMP_HELP_VIEW_PADDING_COLOR }
 };
 
+static const GimpToggleActionEntry view_padding_color_toggle_actions[] =
+{
+  { "view-padding-color-in-show-all", NULL,
+    NC_("view-padding-color", "Keep Padding in \"Show _All\" Mode"), NULL,
+    NC_("view-padding-color",
+        "Keep canvas padding when \"View -> Show All\" is enabled"),
+    view_padding_color_in_show_all_cmd_callback,
+    FALSE,
+    GIMP_HELP_VIEW_PADDING_COLOR }
+};
+
 static const GimpEnumActionEntry view_scroll_horizontal_actions[] =
 {
   { "view-scroll-horizontal", NULL,
@@ -763,6 +774,10 @@ view_actions_setup (GimpActionGroup *group)
                                       G_N_ELEMENTS (view_padding_color_actions),
                                       view_padding_color_cmd_callback);
 
+  gimp_action_group_add_toggle_actions (group, "view-padding-color",
+                                        view_padding_color_toggle_actions,
+                                        G_N_ELEMENTS (view_padding_color_toggle_actions));
+
   gimp_action_group_add_enum_actions (group, "view-action",
                                       view_scroll_horizontal_actions,
                                       G_N_ELEMENTS (view_scroll_horizontal_actions),
@@ -1057,6 +1072,9 @@ view_actions_update (GimpActionGroup *group,
         }
     }
 
+  SET_SENSITIVE ("view-padding-color-in-show-all", image);
+  SET_ACTIVE    ("view-padding-color-in-show-all", display && options->padding_in_show_all);
+
   SET_SENSITIVE ("view-show-menubar",    image);
   SET_ACTIVE    ("view-show-menubar",    display && options->show_menubar);
   SET_SENSITIVE ("view-show-rulers",     image);
diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c
index 634bfc1410..2c2629ceb3 100644
--- a/app/actions/view-commands.c
+++ b/app/actions/view-commands.c
@@ -1155,11 +1155,30 @@ view_padding_color_cmd_callback (GimpAction *action,
         gimp_display_shell_set_padding (shell,
                                         default_options->padding_mode,
                                         &default_options->padding_color);
+        gimp_display_shell_set_padding_in_show_all (shell,
+                                                    default_options->padding_in_show_all);
       }
       break;
     }
 }
 
+void
+view_padding_color_in_show_all_cmd_callback (GimpAction *action,
+                                             GVariant   *value,
+                                             gpointer    data)
+{
+  GimpDisplayShell *shell;
+  gboolean          active;
+  return_if_no_shell (shell, data);
+
+  active = g_variant_get_boolean (value);
+
+  if (active != gimp_display_shell_get_padding_in_show_all (shell))
+    {
+      gimp_display_shell_set_padding_in_show_all (shell, active);
+    }
+}
+
 void
 view_shrink_wrap_cmd_callback (GimpAction *action,
                                GVariant   *value,
diff --git a/app/actions/view-commands.h b/app/actions/view-commands.h
index 8afbba7527..17b15b2ece 100644
--- a/app/actions/view-commands.h
+++ b/app/actions/view-commands.h
@@ -166,6 +166,9 @@ void   view_snap_to_vectors_cmd_callback            (GimpAction *action,
 void   view_padding_color_cmd_callback              (GimpAction *action,
                                                      GVariant   *value,
                                                      gpointer    data);
+void   view_padding_color_in_show_all_cmd_callback  (GimpAction *action,
+                                                     GVariant   *value,
+                                                     gpointer    data);
 
 void   view_shrink_wrap_cmd_callback                (GimpAction *action,
                                                      GVariant   *value,
diff --git a/app/config/gimpdisplayoptions.c b/app/config/gimpdisplayoptions.c
index 201ff0bf0c..b51a653cbc 100644
--- a/app/config/gimpdisplayoptions.c
+++ b/app/config/gimpdisplayoptions.c
@@ -56,7 +56,8 @@ enum
   PROP_SNAP_TO_CANVAS,
   PROP_SNAP_TO_PATH,
   PROP_PADDING_MODE,
-  PROP_PADDING_COLOR
+  PROP_PADDING_COLOR,
+  PROP_PADDING_IN_SHOW_ALL
 };
 
 
@@ -219,6 +220,13 @@ gimp_display_options_class_init (GimpDisplayOptionsClass *klass)
                         CANVAS_PADDING_COLOR_BLURB,
                         FALSE, &white,
                         GIMP_PARAM_STATIC_STRINGS);
+
+  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_PADDING_IN_SHOW_ALL,
+                            "padding-in-show-all",
+                            "Keep padding in \"Show All\" mode",
+                            CANVAS_PADDING_IN_SHOW_ALL_BLURB,
+                            FALSE,
+                            GIMP_PARAM_STATIC_STRINGS);
 }
 
 static void
@@ -344,6 +352,13 @@ gimp_display_options_fullscreen_class_init (GimpDisplayOptionsFullscreenClass *k
                         CANVAS_PADDING_COLOR_BLURB,
                         FALSE, &black,
                         GIMP_PARAM_STATIC_STRINGS);
+
+  GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_PADDING_IN_SHOW_ALL,
+                            "padding-in-show-all",
+                            "Keep padding in \"Show All\" mode",
+                            CANVAS_PADDING_IN_SHOW_ALL_BLURB,
+                            FALSE,
+                            GIMP_PARAM_STATIC_STRINGS);
 }
 
 static void
@@ -503,6 +518,9 @@ gimp_display_options_set_property (GObject      *object,
     case PROP_PADDING_COLOR:
       options->padding_color = *(GimpRGB *) g_value_get_boxed (value);
       break;
+    case PROP_PADDING_IN_SHOW_ALL:
+      options->padding_in_show_all = g_value_get_boolean (value);
+      break;
 
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -568,6 +586,9 @@ gimp_display_options_get_property (GObject    *object,
     case PROP_PADDING_COLOR:
       g_value_set_boxed (value, &options->padding_color);
       break;
+    case PROP_PADDING_IN_SHOW_ALL:
+      g_value_set_boolean (value, options->padding_in_show_all);
+      break;
 
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
diff --git a/app/config/gimpdisplayoptions.h b/app/config/gimpdisplayoptions.h
index 5d666f7891..8da5e7a810 100644
--- a/app/config/gimpdisplayoptions.h
+++ b/app/config/gimpdisplayoptions.h
@@ -61,6 +61,7 @@ struct _GimpDisplayOptions
   GimpCanvasPaddingMode  padding_mode;
   GimpRGB                padding_color;
   gboolean               padding_mode_set;
+  gboolean               padding_in_show_all;
 };
 
 struct _GimpDisplayOptionsClass
diff --git a/app/config/gimprc-blurbs.h b/app/config/gimprc-blurbs.h
index 2b3adf7a2e..402d69b641 100644
--- a/app/config/gimprc-blurbs.h
+++ b/app/config/gimprc-blurbs.h
@@ -33,6 +33,10 @@ _("Sets the dynamics search path.")
 _("Sets the canvas padding color used if the padding mode is set to " \
   "custom color.")
 
+#define CANVAS_PADDING_IN_SHOW_ALL_BLURB \
+_("Specifies whether to keep the canvas padding when \"View -> Show All\" " \
+  "is enabled.")
+
 #define CANVAS_PADDING_MODE_BLURB \
 _("Specifies how the area around the image should be drawn.")
 
diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c
index 8f063a545f..fd25a955c0 100644
--- a/app/dialogs/preferences-dialog.c
+++ b/app/dialogs/preferences-dialog.c
@@ -1011,6 +1011,10 @@ prefs_display_options_frame_add (Gimp         *gimp,
   g_signal_connect (button, "color-changed",
                     G_CALLBACK (prefs_canvas_padding_color_changed),
                     combo);
+
+  prefs_check_button_add (object, "padding-in-show-all",
+                          _("_Keep canvas padding in \"Show All\" mode"),
+                          GTK_BOX (vbox));
 }
 
 static void
diff --git a/app/display/gimpdisplayshell-appearance.c b/app/display/gimpdisplayshell-appearance.c
index f81b506916..fbb4e0de1a 100644
--- a/app/display/gimpdisplayshell-appearance.c
+++ b/app/display/gimpdisplayshell-appearance.c
@@ -36,6 +36,7 @@
 #include "gimpdisplayshell.h"
 #include "gimpdisplayshell-actions.h"
 #include "gimpdisplayshell-appearance.h"
+#include "gimpdisplayshell-expose.h"
 #include "gimpdisplayshell-selection.h"
 #include "gimpimagewindow.h"
 #include "gimpstatusbar.h"
@@ -82,30 +83,32 @@ gimp_display_shell_appearance_update (GimpDisplayShell *shell)
                                          has_grip);
     }
 
-  gimp_display_shell_set_show_menubar       (shell,
-                                             options->show_menubar);
-  gimp_display_shell_set_show_statusbar     (shell,
-                                             options->show_statusbar);
-
-  gimp_display_shell_set_show_rulers        (shell,
-                                             options->show_rulers);
-  gimp_display_shell_set_show_scrollbars    (shell,
-                                             options->show_scrollbars);
-  gimp_display_shell_set_show_selection     (shell,
-                                             options->show_selection);
-  gimp_display_shell_set_show_layer         (shell,
-                                             options->show_layer_boundary);
-  gimp_display_shell_set_show_canvas        (shell,
-                                             options->show_canvas_boundary);
-  gimp_display_shell_set_show_guides        (shell,
-                                             options->show_guides);
-  gimp_display_shell_set_show_grid          (shell,
-                                             options->show_grid);
-  gimp_display_shell_set_show_sample_points (shell,
-                                             options->show_sample_points);
-  gimp_display_shell_set_padding            (shell,
-                                             options->padding_mode,
-                                             &options->padding_color);
+  gimp_display_shell_set_show_menubar        (shell,
+                                              options->show_menubar);
+  gimp_display_shell_set_show_statusbar      (shell,
+                                              options->show_statusbar);
+
+  gimp_display_shell_set_show_rulers         (shell,
+                                              options->show_rulers);
+  gimp_display_shell_set_show_scrollbars     (shell,
+                                              options->show_scrollbars);
+  gimp_display_shell_set_show_selection      (shell,
+                                              options->show_selection);
+  gimp_display_shell_set_show_layer          (shell,
+                                              options->show_layer_boundary);
+  gimp_display_shell_set_show_canvas         (shell,
+                                              options->show_canvas_boundary);
+  gimp_display_shell_set_show_guides         (shell,
+                                              options->show_guides);
+  gimp_display_shell_set_show_grid           (shell,
+                                              options->show_grid);
+  gimp_display_shell_set_show_sample_points  (shell,
+                                              options->show_sample_points);
+  gimp_display_shell_set_padding             (shell,
+                                              options->padding_mode,
+                                              &options->padding_color);
+  gimp_display_shell_set_padding_in_show_all (shell,
+                                              options->padding_in_show_all);
 }
 
 void
@@ -543,6 +546,37 @@ gimp_display_shell_get_padding (GimpDisplayShell       *shell,
     *padding_color = options->padding_color;
 }
 
+void
+gimp_display_shell_set_padding_in_show_all (GimpDisplayShell *shell,
+                                            gboolean          keep)
+{
+  GimpDisplayOptions *options;
+
+  g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+  options = appearance_get_options (shell);
+
+  if (options->padding_in_show_all != keep)
+    {
+      g_object_set (options, "padding-in-show-all", keep, NULL);
+
+      if (shell->display)
+        gimp_display_shell_expose_full (shell);
+
+      gimp_display_shell_set_action_active (shell,
+                                            "view-padding-color-in-show-all",
+                                            keep);
+    }
+}
+
+gboolean
+gimp_display_shell_get_padding_in_show_all (GimpDisplayShell *shell)
+{
+  g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
+
+  return appearance_get_options (shell)->padding_in_show_all;
+}
+
 
 /*  private functions  */
 
diff --git a/app/display/gimpdisplayshell-appearance.h b/app/display/gimpdisplayshell-appearance.h
index 80ceb2c945..0c67649b49 100644
--- a/app/display/gimpdisplayshell-appearance.h
+++ b/app/display/gimpdisplayshell-appearance.h
@@ -19,71 +19,74 @@
 #define __GIMP_DISPLAY_SHELL_APPEARANCE_H__
 
 
-void       gimp_display_shell_appearance_update      (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_menubar       (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_menubar       (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_statusbar     (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_statusbar     (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_rulers        (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_rulers        (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_scrollbars    (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_scrollbars    (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_selection     (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_selection     (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_layer         (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_layer         (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_canvas        (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_canvas        (GimpDisplayShell       *shell);
-void       gimp_display_shell_update_show_canvas     (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_grid          (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_grid          (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_guides        (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_guides        (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_snap_to_grid       (GimpDisplayShell       *shell,
-                                                      gboolean                snap);
-gboolean   gimp_display_shell_get_snap_to_grid       (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_show_sample_points (GimpDisplayShell       *shell,
-                                                      gboolean                show);
-gboolean   gimp_display_shell_get_show_sample_points (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_snap_to_guides     (GimpDisplayShell       *shell,
-                                                      gboolean                snap);
-gboolean   gimp_display_shell_get_snap_to_guides     (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_snap_to_canvas     (GimpDisplayShell       *shell,
-                                                      gboolean                snap);
-gboolean   gimp_display_shell_get_snap_to_canvas     (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_snap_to_vectors    (GimpDisplayShell       *shell,
-                                                      gboolean                snap);
-gboolean   gimp_display_shell_get_snap_to_vectors    (GimpDisplayShell       *shell);
-
-void       gimp_display_shell_set_padding            (GimpDisplayShell       *shell,
-                                                      GimpCanvasPaddingMode   mode,
-                                                      const GimpRGB          *color);
-void       gimp_display_shell_get_padding            (GimpDisplayShell       *shell,
-                                                      GimpCanvasPaddingMode  *mode,
-                                                      GimpRGB                *color);
+void       gimp_display_shell_appearance_update       (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_menubar        (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_menubar        (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_statusbar      (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_statusbar      (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_rulers         (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_rulers         (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_scrollbars     (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_scrollbars     (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_selection      (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_selection      (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_layer          (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_layer          (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_canvas         (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_canvas         (GimpDisplayShell       *shell);
+void       gimp_display_shell_update_show_canvas      (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_grid           (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_grid           (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_guides         (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_guides         (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_snap_to_grid        (GimpDisplayShell       *shell,
+                                                       gboolean                snap);
+gboolean   gimp_display_shell_get_snap_to_grid        (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_show_sample_points  (GimpDisplayShell       *shell,
+                                                       gboolean                show);
+gboolean   gimp_display_shell_get_show_sample_points  (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_snap_to_guides      (GimpDisplayShell       *shell,
+                                                       gboolean                snap);
+gboolean   gimp_display_shell_get_snap_to_guides      (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_snap_to_canvas      (GimpDisplayShell       *shell,
+                                                       gboolean                snap);
+gboolean   gimp_display_shell_get_snap_to_canvas      (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_snap_to_vectors     (GimpDisplayShell       *shell,
+                                                       gboolean                snap);
+gboolean   gimp_display_shell_get_snap_to_vectors     (GimpDisplayShell       *shell);
+
+void       gimp_display_shell_set_padding             (GimpDisplayShell       *shell,
+                                                       GimpCanvasPaddingMode   mode,
+                                                       const GimpRGB          *color);
+void       gimp_display_shell_get_padding             (GimpDisplayShell       *shell,
+                                                       GimpCanvasPaddingMode  *mode,
+                                                       GimpRGB                *color);
+void       gimp_display_shell_set_padding_in_show_all (GimpDisplayShell       *shell,
+                                                       gboolean                keep);
+gboolean   gimp_display_shell_get_padding_in_show_all (GimpDisplayShell       *shell);
 
 
 #endif /* __GIMP_DISPLAY_SHELL_APPEARANCE_H__ */
diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c
index 247a0e0672..cffb9ae51c 100644
--- a/app/display/gimpdisplayshell-callbacks.c
+++ b/app/display/gimpdisplayshell-callbacks.c
@@ -466,6 +466,7 @@ gimp_display_shell_canvas_draw_image (GimpDisplayShell *shell,
   cairo_rectangle_list_t *clip_rectangles;
   GeglRectangle           image_rect;
   GeglRectangle           rotated_image_rect;
+  GeglRectangle           canvas_rect;
   cairo_matrix_t          matrix;
   gdouble                 x1, y1;
   gdouble                 x2, y2;
@@ -477,6 +478,12 @@ gimp_display_shell_canvas_draw_image (GimpDisplayShell *shell,
     &image_rect.width,
     &image_rect.height);
 
+  gimp_display_shell_scale_get_image_unrotated_bounds (
+    shell,
+    &canvas_rect.x,
+    &canvas_rect.y,
+    &canvas_rect.width,
+    &canvas_rect.height);
 
   /*  the background has already been cleared by GdkWindow
    */
@@ -496,7 +503,19 @@ gimp_display_shell_canvas_draw_image (GimpDisplayShell *shell,
   if (shell->show_all)
     {
       cairo_save (cr);
+
+      if (gimp_display_shell_get_padding_in_show_all (shell))
+        {
+          cairo_rectangle (cr,
+                           canvas_rect.x,
+                           canvas_rect.y,
+                           canvas_rect.width,
+                           canvas_rect.height);
+          cairo_clip (cr);
+        }
+
       gimp_display_shell_draw_checkerboard (shell, cr);
+
       cairo_restore (cr);
     }
 
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 74ff410016..661ea900e8 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -348,6 +348,8 @@
         <menuitem action="view-padding-color-dark-check" />
         <menuitem action="view-padding-color-custom" />
         <separator />
+        <menuitem action="view-padding-color-in-show-all" />
+        <separator />
         <menuitem action="view-padding-color-prefs" />
       </menu>
       <menuitem action="view-show-menubar" />


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