app: behave as if "show all" is disabled in scroll/zoom actions when keeping padding

This commit is contained in:
Ell 2019-09-15 16:22:06 +03:00
parent 235a20b65e
commit 2d6e80b8ed
10 changed files with 125 additions and 21 deletions

View File

@ -38,6 +38,8 @@
#include "gimpdisplayshell-appearance.h"
#include "gimpdisplayshell-expose.h"
#include "gimpdisplayshell-selection.h"
#include "gimpdisplayshell-scroll.h"
#include "gimpdisplayshell-scrollbars.h"
#include "gimpimagewindow.h"
#include "gimpstatusbar.h"
@ -541,7 +543,12 @@ gimp_display_shell_set_padding_in_show_all (GimpDisplayShell *shell,
g_object_set (options, "padding-in-show-all", keep, NULL);
if (shell->display)
gimp_display_shell_expose_full (shell);
{
gimp_display_shell_scroll_clamp_and_update (shell);
gimp_display_shell_scrollbars_update (shell);
gimp_display_shell_expose_full (shell);
}
gimp_display_shell_set_action_active (shell,
"view-padding-color-in-show-all",

View File

@ -190,7 +190,7 @@ gimp_display_shell_canvas_tick (GtkWidget *widget,
center_horizontally = sw <= shell->disp_width;
center_vertically = sh <= shell->disp_height;
if (! shell->show_all)
if (! gimp_display_shell_get_infinite_canvas (shell))
{
gimp_display_shell_scroll_center_image (shell,
center_horizontally,

View File

@ -885,7 +885,7 @@ gimp_display_shell_size_changed_detailed_handler (GimpImage *image,
shell->offset_x + scaled_previous_origin_x,
shell->offset_y + scaled_previous_origin_y);
if (! shell->show_all)
if (! gimp_display_shell_get_infinite_canvas (shell))
{
gimp_display_shell_scroll_center_image (shell,
horizontally, vertically);

View File

@ -275,6 +275,36 @@ gimp_display_shell_scale_get_image_bounds (GimpDisplayShell *shell,
if (h) *h = y2 - y1;
}
/**
* gimp_display_shell_scale_get_image_unrotated_bounds:
* @shell:
* @x:
* @y:
* @w:
* @h:
*
* Gets the screen-space boudning box of the image, after it has
* been scaled and scrolled, but before it has been rotated.
**/
void
gimp_display_shell_scale_get_image_unrotated_bounds (GimpDisplayShell *shell,
gint *x,
gint *y,
gint *w,
gint *h)
{
GimpImage *image;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
image = gimp_display_get_image (shell->display);
if (x) *x = -shell->offset_x;
if (y) *y = -shell->offset_y;
if (w) *w = floor (gimp_image_get_width (image) * shell->scale_x);
if (h) *h = floor (gimp_image_get_height (image) * shell->scale_y);
}
/**
* gimp_display_shell_scale_get_image_bounding_box:
* @shell:
@ -406,7 +436,7 @@ gimp_display_shell_scale_image_is_within_viewport (GimpDisplayShell *shell,
if (! horizontally) horizontally = &horizontally_dummy;
if (! vertically) vertically = &vertically_dummy;
if (! shell->show_all)
if (! gimp_display_shell_get_infinite_canvas (shell))
{
gint sx, sy;
gint sw, sh;
@ -1130,7 +1160,19 @@ gimp_display_shell_scale_fit_or_fill (GimpDisplayShell *shell,
gdouble current_scale;
gdouble zoom_factor;
bounding_box = gimp_display_shell_get_bounding_box (shell);
if (! gimp_display_shell_get_infinite_canvas (shell))
{
GimpImage *image = gimp_display_get_image (shell->display);
bounding_box.x = 0;
bounding_box.y = 0;
bounding_box.width = gimp_image_get_width (image);
bounding_box.height = gimp_image_get_height (image);
}
else
{
bounding_box = gimp_display_shell_get_bounding_box (shell);
}
gimp_display_shell_transform_bounds (shell,
bounding_box.x,
@ -1180,7 +1222,8 @@ gimp_display_shell_scale_image_starts_to_fit (GimpDisplayShell *shell,
if (! horizontally) horizontally = &horizontally_dummy;
/* The image can only start to fit if we zoom out */
if (new_scale > current_scale || shell->show_all)
if (new_scale > current_scale ||
gimp_display_shell_get_infinite_canvas (shell))
{
*vertically = FALSE;
*horizontally = FALSE;
@ -1246,7 +1289,7 @@ gimp_display_shell_scale_viewport_coord_almost_centered (GimpDisplayShell *shell
gint center_x = shell->disp_width / 2;
gint center_y = shell->disp_height / 2;
if (! shell->show_all)
if (! gimp_display_shell_get_infinite_canvas (shell))
{
local_horizontally = (x > center_x - ALMOST_CENTERED_THRESHOLD &&
x < center_x + ALMOST_CENTERED_THRESHOLD);

View File

@ -34,6 +34,12 @@ void gimp_display_shell_scale_get_image_bounds (GimpDisplayShell *shell,
gint *y,
gint *w,
gint *h);
void gimp_display_shell_scale_get_image_unrotated_bounds
(GimpDisplayShell *shell,
gint *x,
gint *y,
gint *w,
gint *h);
void gimp_display_shell_scale_get_image_bounding_box
(GimpDisplayShell *shell,
gint *x,

View File

@ -480,11 +480,22 @@ gimp_display_shell_scroll_center_content (GimpDisplayShell *shell,
(! vertically && ! horizontally))
return;
gimp_display_shell_scale_get_image_bounding_box (shell,
&content_x,
&content_y,
&content_width,
&content_height);
if (! gimp_display_shell_get_infinite_canvas (shell))
{
gimp_display_shell_scale_get_image_bounds (shell,
&content_x,
&content_y,
&content_width,
&content_height);
}
else
{
gimp_display_shell_scale_get_image_bounding_box (shell,
&content_x,
&content_y,
&content_width,
&content_height);
}
if (shell->disp_width > content_width)
{

View File

@ -110,9 +110,18 @@ gimp_display_shell_scrollbars_setup_horizontal (GimpDisplayShell *shell,
&bounds_x, NULL,
&bounds_width, NULL);
gimp_display_shell_scale_get_image_bounding_box (shell,
&bounding_box_x, NULL,
&bounding_box_width, NULL);
if (! gimp_display_shell_get_infinite_canvas (shell))
{
bounding_box_x = bounds_x;
bounding_box_width = bounds_width;
}
else
{
gimp_display_shell_scale_get_image_bounding_box (
shell,
&bounding_box_x, NULL,
&bounding_box_width, NULL);
}
x1 = bounding_box_x;
x2 = bounding_box_x + bounding_box_width;
@ -162,9 +171,18 @@ gimp_display_shell_scrollbars_setup_vertical (GimpDisplayShell *shell,
NULL, &bounds_y,
NULL, &bounds_height);
gimp_display_shell_scale_get_image_bounding_box (shell,
NULL, &bounding_box_y,
NULL, &bounding_box_height);
if (! gimp_display_shell_get_infinite_canvas (shell))
{
bounding_box_y = bounds_y;
bounding_box_height = bounds_height;
}
else
{
gimp_display_shell_scale_get_image_bounding_box (
shell,
NULL, &bounding_box_y,
NULL, &bounding_box_height);
}
y1 = bounding_box_y;
y2 = bounding_box_y + bounding_box_height;

View File

@ -1846,6 +1846,15 @@ gimp_display_shell_get_bounding_box (GimpDisplayShell *shell)
return bounding_box;
}
gboolean
gimp_display_shell_get_infinite_canvas (GimpDisplayShell *shell)
{
g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE);
return shell->show_all &&
! gimp_display_shell_get_padding_in_show_all (shell);
}
void
gimp_display_shell_update_priority_rect (GimpDisplayShell *shell)
{

View File

@ -319,6 +319,8 @@ void gimp_display_shell_set_show_all (GimpDisplayShell *shell,
GimpPickable * gimp_display_shell_get_pickable (GimpDisplayShell *shell);
GeglRectangle gimp_display_shell_get_bounding_box
(GimpDisplayShell *shell);
gboolean gimp_display_shell_get_infinite_canvas
(GimpDisplayShell *shell);
void gimp_display_shell_update_priority_rect
(GimpDisplayShell *shell);

View File

@ -1472,9 +1472,17 @@ gimp_image_window_shrink_wrap (GimpImageWindow *window,
gdk_monitor_get_workarea (monitor, &rect);
gimp_display_shell_scale_get_image_bounding_box (active_shell,
NULL, NULL,
&width, &height);
if (! gimp_display_shell_get_infinite_canvas (active_shell))
{
gimp_display_shell_scale_get_image_size (active_shell,
&width, &height);
}
else
{
gimp_display_shell_scale_get_image_bounding_box (active_shell,
NULL, NULL,
&width, &height);
}
disp_width = active_shell->disp_width;
disp_height = active_shell->disp_height;