app: add "Readjust" function to transform-grid tools

Add an optional GimpTransformGridTool::radjust() virtual function,
which subclasses can implement to radjust the transformation based
on the current state of the display, such that it's easy to
control.  This is especially useful when the image is zoomed-in,
and the transform handles, which are initially across the layer
bounds, are out of view.

When a transform tool implements radjust(), show a "Readjust"
button in the tool GUI.  While readjusting the transformation, we
modify the opposite transformation such that the overall transform
remains unchanged, as if both transform-directions were linked, so
that only the transform grid is readjusted.

(cherry picked from commit 5055dd10d5)
This commit is contained in:
Ell
2019-03-07 16:05:18 -05:00
parent 8d20b7c665
commit a8292fedf2
2 changed files with 35 additions and 9 deletions

View File

@ -56,7 +56,8 @@
#include "gimp-intl.h"
#define RESPONSE_RESET 1
#define RESPONSE_RESET 1
#define RESPONSE_READJUST 2
typedef struct
@ -210,6 +211,7 @@ gimp_transform_grid_tool_class_init (GimpTransformGridToolClass *klass)
klass->dialog = NULL;
klass->dialog_update = NULL;
klass->prepare = NULL;
klass->readjust = NULL;
klass->get_widget = NULL;
klass->update_widget = gimp_transform_grid_tool_real_update_widget;
klass->widget_changed = gimp_transform_grid_tool_real_widget_changed;
@ -1090,18 +1092,20 @@ gimp_transform_grid_tool_dialog (GimpTransformGridTool *tg_tool)
gtk_widget_get_screen (GTK_WIDGET (shell)),
gimp_widget_get_monitor (GTK_WIDGET (shell)),
TRUE,
_("_Reset"), RESPONSE_RESET,
_("_Cancel"), GTK_RESPONSE_CANCEL,
ok_button_label, GTK_RESPONSE_OK,
NULL);
gimp_tool_gui_add_button (tg_tool->gui, _("_Reset"), RESPONSE_RESET);
if (GIMP_TRANSFORM_GRID_TOOL_GET_CLASS (tg_tool)->readjust)
gimp_tool_gui_add_button (tg_tool->gui, _("_Readjust"), RESPONSE_READJUST);
gimp_tool_gui_add_button (tg_tool->gui, _("_Cancel"), GTK_RESPONSE_CANCEL);
gimp_tool_gui_add_button (tg_tool->gui, ok_button_label, GTK_RESPONSE_OK);
gimp_tool_gui_set_auto_overlay (tg_tool->gui, TRUE);
gimp_tool_gui_set_default_response (tg_tool->gui, GTK_RESPONSE_OK);
gimp_tool_gui_set_alternative_button_order (tg_tool->gui,
RESPONSE_RESET,
RESPONSE_READJUST,
GTK_RESPONSE_OK,
GTK_RESPONSE_CANCEL,
-1);
@ -1231,9 +1235,10 @@ gimp_transform_grid_tool_response (GimpToolGui *gui,
gint response_id,
GimpTransformGridTool *tg_tool)
{
GimpTool *tool = GIMP_TOOL (tg_tool);
GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tg_tool);
GimpDisplay *display = tool->display;
GimpTool *tool = GIMP_TOOL (tg_tool);
GimpTransformTool *tr_tool = GIMP_TRANSFORM_TOOL (tg_tool);
GimpTransformGridOptions *tg_options = GIMP_TRANSFORM_GRID_TOOL_GET_OPTIONS (tg_tool);
GimpDisplay *display = tool->display;
switch (response_id)
{
@ -1249,6 +1254,26 @@ gimp_transform_grid_tool_response (GimpToolGui *gui,
gimp_transform_grid_tool_push_internal_undo (tg_tool);
break;
case RESPONSE_READJUST:
{
gboolean direction_linked;
/* readjust the transformation info */
GIMP_TRANSFORM_GRID_TOOL_GET_CLASS (tg_tool)->readjust (tg_tool);
/* recalculate the tool's transformtion matrix, preserving the overall
* transformation
*/
direction_linked = tg_options->direction_linked;
tg_options->direction_linked = TRUE;
gimp_transform_tool_recalc_matrix (tr_tool, display);
tg_options->direction_linked = direction_linked;
/* push the new info to the undo stack */
gimp_transform_grid_tool_push_internal_undo (tg_tool);
}
break;
case GTK_RESPONSE_OK:
g_return_if_fail (display != NULL);
gimp_tool_control (tool, GIMP_TOOL_ACTION_COMMIT, display);

View File

@ -82,6 +82,7 @@ struct _GimpTransformGridToolClass
void (* dialog) (GimpTransformGridTool *tg_tool);
void (* dialog_update) (GimpTransformGridTool *tg_tool);
void (* prepare) (GimpTransformGridTool *tg_tool);
void (* readjust) (GimpTransformGridTool *tg_tool);
GimpToolWidget * (* get_widget) (GimpTransformGridTool *tg_tool);
void (* update_widget) (GimpTransformGridTool *tg_tool);
void (* widget_changed) (GimpTransformGridTool *tg_tool);