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-appearance.h"
#include "gimpdisplayshell-expose.h" #include "gimpdisplayshell-expose.h"
#include "gimpdisplayshell-selection.h" #include "gimpdisplayshell-selection.h"
#include "gimpdisplayshell-scroll.h"
#include "gimpdisplayshell-scrollbars.h"
#include "gimpimagewindow.h" #include "gimpimagewindow.h"
#include "gimpstatusbar.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); g_object_set (options, "padding-in-show-all", keep, NULL);
if (shell->display) if (shell->display)
{
gimp_display_shell_scroll_clamp_and_update (shell);
gimp_display_shell_scrollbars_update (shell);
gimp_display_shell_expose_full (shell); gimp_display_shell_expose_full (shell);
}
gimp_display_shell_set_action_active (shell, gimp_display_shell_set_action_active (shell,
"view-padding-color-in-show-all", "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_horizontally = sw <= shell->disp_width;
center_vertically = sh <= shell->disp_height; 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, gimp_display_shell_scroll_center_image (shell,
center_horizontally, 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_x + scaled_previous_origin_x,
shell->offset_y + scaled_previous_origin_y); 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, gimp_display_shell_scroll_center_image (shell,
horizontally, vertically); horizontally, vertically);

View File

@ -275,6 +275,36 @@ gimp_display_shell_scale_get_image_bounds (GimpDisplayShell *shell,
if (h) *h = y2 - y1; 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: * gimp_display_shell_scale_get_image_bounding_box:
* @shell: * @shell:
@ -406,7 +436,7 @@ gimp_display_shell_scale_image_is_within_viewport (GimpDisplayShell *shell,
if (! horizontally) horizontally = &horizontally_dummy; if (! horizontally) horizontally = &horizontally_dummy;
if (! vertically) vertically = &vertically_dummy; if (! vertically) vertically = &vertically_dummy;
if (! shell->show_all) if (! gimp_display_shell_get_infinite_canvas (shell))
{ {
gint sx, sy; gint sx, sy;
gint sw, sh; gint sw, sh;
@ -1130,7 +1160,19 @@ gimp_display_shell_scale_fit_or_fill (GimpDisplayShell *shell,
gdouble current_scale; gdouble current_scale;
gdouble zoom_factor; gdouble zoom_factor;
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); bounding_box = gimp_display_shell_get_bounding_box (shell);
}
gimp_display_shell_transform_bounds (shell, gimp_display_shell_transform_bounds (shell,
bounding_box.x, bounding_box.x,
@ -1180,7 +1222,8 @@ gimp_display_shell_scale_image_starts_to_fit (GimpDisplayShell *shell,
if (! horizontally) horizontally = &horizontally_dummy; if (! horizontally) horizontally = &horizontally_dummy;
/* The image can only start to fit if we zoom out */ /* 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; *vertically = FALSE;
*horizontally = 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_x = shell->disp_width / 2;
gint center_y = shell->disp_height / 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 && local_horizontally = (x > center_x - ALMOST_CENTERED_THRESHOLD &&
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 *y,
gint *w, gint *w,
gint *h); 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 void gimp_display_shell_scale_get_image_bounding_box
(GimpDisplayShell *shell, (GimpDisplayShell *shell,
gint *x, gint *x,

View File

@ -480,11 +480,22 @@ gimp_display_shell_scroll_center_content (GimpDisplayShell *shell,
(! vertically && ! horizontally)) (! vertically && ! horizontally))
return; return;
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, gimp_display_shell_scale_get_image_bounding_box (shell,
&content_x, &content_x,
&content_y, &content_y,
&content_width, &content_width,
&content_height); &content_height);
}
if (shell->disp_width > content_width) if (shell->disp_width > content_width)
{ {

View File

@ -110,9 +110,18 @@ gimp_display_shell_scrollbars_setup_horizontal (GimpDisplayShell *shell,
&bounds_x, NULL, &bounds_x, NULL,
&bounds_width, NULL); &bounds_width, NULL);
gimp_display_shell_scale_get_image_bounding_box (shell, 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_x, NULL,
&bounding_box_width, NULL); &bounding_box_width, NULL);
}
x1 = bounding_box_x; x1 = bounding_box_x;
x2 = bounding_box_x + bounding_box_width; x2 = bounding_box_x + bounding_box_width;
@ -162,9 +171,18 @@ gimp_display_shell_scrollbars_setup_vertical (GimpDisplayShell *shell,
NULL, &bounds_y, NULL, &bounds_y,
NULL, &bounds_height); NULL, &bounds_height);
gimp_display_shell_scale_get_image_bounding_box (shell, 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_y,
NULL, &bounding_box_height); NULL, &bounding_box_height);
}
y1 = bounding_box_y; y1 = bounding_box_y;
y2 = bounding_box_y + bounding_box_height; y2 = bounding_box_y + bounding_box_height;

View File

@ -1846,6 +1846,15 @@ gimp_display_shell_get_bounding_box (GimpDisplayShell *shell)
return bounding_box; 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 void
gimp_display_shell_update_priority_rect (GimpDisplayShell *shell) 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); GimpPickable * gimp_display_shell_get_pickable (GimpDisplayShell *shell);
GeglRectangle gimp_display_shell_get_bounding_box GeglRectangle gimp_display_shell_get_bounding_box
(GimpDisplayShell *shell); (GimpDisplayShell *shell);
gboolean gimp_display_shell_get_infinite_canvas
(GimpDisplayShell *shell);
void gimp_display_shell_update_priority_rect void gimp_display_shell_update_priority_rect
(GimpDisplayShell *shell); (GimpDisplayShell *shell);

View File

@ -1472,9 +1472,17 @@ gimp_image_window_shrink_wrap (GimpImageWindow *window,
gdk_monitor_get_workarea (monitor, &rect); gdk_monitor_get_workarea (monitor, &rect);
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, gimp_display_shell_scale_get_image_bounding_box (active_shell,
NULL, NULL, NULL, NULL,
&width, &height); &width, &height);
}
disp_width = active_shell->disp_width; disp_width = active_shell->disp_width;
disp_height = active_shell->disp_height; disp_height = active_shell->disp_height;