Files
gimp/app/display/gimpdisplayshell-scrollbars.c
Ell 5bdb20c839 app: make rulers rotation aware
Place the rulers' origin at the top-left corner of the canvas
(screen space) bounding box, and set their scale to the image-
space scale along the screen-space horizontal/vertical directions
(in other words, measuring a distance using the rulers should
give the same results as the measure tool; note that rotation
comes into play here only when the horizontal and vertical
image or screen resolutions are different, since otherwise the
scale is direction invariant.)

Make scrollbar step match ruler step under the new behavior.
2016-08-09 21:31:07 +00:00

211 lines
6.5 KiB
C

/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <math.h>
#include <gegl.h>
#include <gtk/gtk.h>
#include "display-types.h"
#include "core/gimpimage.h"
#include "gimpdisplay.h"
#include "gimpdisplayshell.h"
#include "gimpdisplayshell-scale.h"
#include "gimpdisplayshell-scrollbars.h"
#define MINIMUM_STEP_AMOUNT 1.0
/**
* gimp_display_shell_scrollbars_update:
* @shell:
*
**/
void
gimp_display_shell_scrollbars_update (GimpDisplayShell *shell)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->display)
return;
/* Horizontal scrollbar */
g_object_freeze_notify (G_OBJECT (shell->hsbdata));
/* Update upper and lower value before we set the new value */
gimp_display_shell_scrollbars_setup_horizontal (shell, shell->offset_x);
g_object_set (shell->hsbdata,
"value", (gdouble) shell->offset_x,
"page-size", (gdouble) shell->disp_width,
"page-increment", (gdouble) shell->disp_width / 2,
NULL);
g_object_thaw_notify (G_OBJECT (shell->hsbdata)); /* emits "changed" */
/* Vertcal scrollbar */
g_object_freeze_notify (G_OBJECT (shell->vsbdata));
/* Update upper and lower value before we set the new value */
gimp_display_shell_scrollbars_setup_vertical (shell, shell->offset_y);
g_object_set (shell->vsbdata,
"value", (gdouble) shell->offset_y,
"page-size", (gdouble) shell->disp_height,
"page-increment", (gdouble) shell->disp_height / 2,
NULL);
g_object_thaw_notify (G_OBJECT (shell->vsbdata)); /* emits "changed" */
}
/**
* gimp_display_shell_scrollbars_setup_horizontal:
* @shell:
* @value:
*
* Setup the limits of the horizontal scrollbar
**/
void
gimp_display_shell_scrollbars_setup_horizontal (GimpDisplayShell *shell,
gdouble value)
{
gint bounds_x;
gint bounds_width;
gdouble lower;
gdouble upper;
gdouble scale_x;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->display || ! gimp_display_get_image (shell->display))
return;
gimp_display_shell_scale_get_image_bounds (shell,
&bounds_x, NULL,
&bounds_width, NULL);
if (shell->disp_width > bounds_width)
{
bounds_x -= (shell->disp_width - bounds_width) / 2;
bounds_width = shell->disp_width;
}
lower = MIN (value, bounds_x);
upper = MAX (value + shell->disp_width, bounds_x + bounds_width);
gimp_display_shell_get_rotated_scale (shell, &scale_x, NULL);
g_object_set (shell->hsbdata,
"lower", lower,
"upper", upper,
"step-increment", (gdouble) MAX (scale_x, MINIMUM_STEP_AMOUNT),
NULL);
}
/**
* gimp_display_shell_scrollbars_setup_vertical:
* @shell:
* @value:
*
* Setup the limits of the vertical scrollbar
**/
void
gimp_display_shell_scrollbars_setup_vertical (GimpDisplayShell *shell,
gdouble value)
{
gint bounds_y;
gint bounds_height;
gdouble lower;
gdouble upper;
gdouble scale_y;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! shell->display || ! gimp_display_get_image (shell->display))
return;
gimp_display_shell_scale_get_image_bounds (shell,
NULL, &bounds_y,
NULL, &bounds_height);
if (shell->disp_height > bounds_height)
{
bounds_y -= (shell->disp_height - bounds_height) / 2;
bounds_height = shell->disp_height;
}
lower = MIN (value, bounds_y);
upper = MAX (value + shell->disp_height, bounds_y + bounds_height);
gimp_display_shell_get_rotated_scale (shell, NULL, &scale_y);
g_object_set (shell->vsbdata,
"lower", lower,
"upper", upper,
"step-increment", (gdouble) MAX (scale_y, MINIMUM_STEP_AMOUNT),
NULL);
}
/**
* gimp_display_shell_scrollbars_update_steppers:
* @shell:
* @min_offset_x:
* @max_offset_x:
* @min_offset_y:
* @max_offset_y:
*
* Sets the scrollbars' stepper sensitivity which is set differently
* from its adjustment limits because we support overscrolling.
**/
void
gimp_display_shell_scrollbars_update_steppers (GimpDisplayShell *shell,
gint min_offset_x,
gint max_offset_x,
gint min_offset_y,
gint max_offset_y)
{
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
gtk_range_set_lower_stepper_sensitivity (GTK_RANGE (shell->hsb),
min_offset_x < shell->offset_x ?
GTK_SENSITIVITY_ON :
GTK_SENSITIVITY_OFF);
gtk_range_set_upper_stepper_sensitivity (GTK_RANGE (shell->hsb),
max_offset_x > shell->offset_x ?
GTK_SENSITIVITY_ON :
GTK_SENSITIVITY_OFF);
gtk_range_set_lower_stepper_sensitivity (GTK_RANGE (shell->vsb),
min_offset_y < shell->offset_y ?
GTK_SENSITIVITY_ON :
GTK_SENSITIVITY_OFF);
gtk_range_set_upper_stepper_sensitivity (GTK_RANGE (shell->vsb),
max_offset_y > shell->offset_y ?
GTK_SENSITIVITY_ON :
GTK_SENSITIVITY_OFF);
}