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:
@ -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);
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user