app: add unified interaction mode to the 3D Transform tool

Add a "Unified interaction" option to the 3D Transform tool, and a
corresponding "unified" property to GimpToolTransform3DGrid.  When
active, all three interaction modes of the grid (camera, move, and
rotate) are available simultaneously, regardless of the active
dialog page.  In this mode, the inner and outer regions of the item
are used for moving and rotation, respectively, and the vanishing-
point is controlled through through a handle.

(cherry picked from commit 30132fc2da)
This commit is contained in:
Ell
2020-01-10 23:10:47 +02:00
parent c4d0c0bd6d
commit 87d3590054
4 changed files with 73 additions and 27 deletions

View File

@ -48,6 +48,7 @@ enum
{
PROP_0,
PROP_MODE,
PROP_UNIFIED,
PROP_CONSTRAIN_AXIS,
PROP_Z_AXIS,
PROP_LOCAL_FRAME,
@ -76,6 +77,7 @@ typedef enum
struct _GimpToolTransform3DGridPrivate
{
GimpTransform3DMode mode;
gboolean unified;
gboolean constrain_axis;
gboolean z_axis;
@ -150,8 +152,7 @@ static gboolean gimp_tool_transform_3d_grid_get_cursor (GimpToolW
GimpToolCursorType *tool_cursor,
GimpCursorModifier *modifier);
static void gimp_tool_transform_3d_grid_set_mode (GimpToolTransform3DGrid *grid,
GimpTransform3DMode mode);
static void gimp_tool_transform_3d_grid_update_mode (GimpToolTransform3DGrid *grid);
static void gimp_tool_transform_3d_grid_reset_motion (GimpToolTransform3DGrid *grid);
static gboolean gimp_tool_transform_3d_grid_constrain (GimpToolTransform3DGrid *grid,
gdouble x,
@ -202,6 +203,13 @@ gimp_tool_transform_3d_grid_class_init (GimpToolTransform3DGridClass *klass)
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_UNIFIED,
g_param_spec_boolean ("unified",
NULL, NULL,
FALSE,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class, PROP_CONSTRAIN_AXIS,
g_param_spec_boolean ("constrain-axis",
NULL, NULL,
@ -368,7 +376,13 @@ gimp_tool_transform_3d_grid_set_property (GObject *object,
switch (property_id)
{
case PROP_MODE:
gimp_tool_transform_3d_grid_set_mode (grid, g_value_get_enum (value));
priv->mode = g_value_get_enum (value);
gimp_tool_transform_3d_grid_update_mode (grid);
break;
case PROP_UNIFIED:
priv->unified = g_value_get_boolean (value);
gimp_tool_transform_3d_grid_update_mode (grid);
break;
case PROP_CONSTRAIN_AXIS:
@ -453,6 +467,9 @@ gimp_tool_transform_3d_grid_get_property (GObject *object,
case PROP_MODE:
g_value_set_enum (value, priv->mode);
break;
case PROP_UNIFIED:
g_value_set_boolean (value, priv->unified);
break;
case PROP_CONSTRAIN_AXIS:
g_value_set_boolean (value, priv->constrain_axis);
@ -659,38 +676,46 @@ gimp_tool_transform_3d_grid_get_cursor (GimpToolWidget *widget,
}
static void
gimp_tool_transform_3d_grid_set_mode (GimpToolTransform3DGrid *grid,
GimpTransform3DMode mode)
gimp_tool_transform_3d_grid_update_mode (GimpToolTransform3DGrid *grid)
{
GimpToolTransform3DGridPrivate *priv = grid->priv;
priv->mode = mode;
switch (mode)
if (priv->unified)
{
case GIMP_TRANSFORM_3D_MODE_CAMERA:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_NONE,
"outside-function", GIMP_TRANSFORM_FUNCTION_NONE,
"use-pivot-handle", TRUE,
NULL);
break;
case GIMP_TRANSFORM_3D_MODE_MOVE:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_MOVE,
"outside-function", GIMP_TRANSFORM_FUNCTION_MOVE,
"use-pivot-handle", FALSE,
NULL);
break;
case GIMP_TRANSFORM_3D_MODE_ROTATE:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_ROTATE,
"outside-function", GIMP_TRANSFORM_FUNCTION_ROTATE,
"use-pivot-handle", FALSE,
"use-pivot-handle", TRUE,
NULL);
break;
}
else
{
switch (priv->mode)
{
case GIMP_TRANSFORM_3D_MODE_CAMERA:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_NONE,
"outside-function", GIMP_TRANSFORM_FUNCTION_NONE,
"use-pivot-handle", TRUE,
NULL);
break;
case GIMP_TRANSFORM_3D_MODE_MOVE:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_MOVE,
"outside-function", GIMP_TRANSFORM_FUNCTION_MOVE,
"use-pivot-handle", FALSE,
NULL);
break;
case GIMP_TRANSFORM_3D_MODE_ROTATE:
g_object_set (grid,
"inside-function", GIMP_TRANSFORM_FUNCTION_ROTATE,
"outside-function", GIMP_TRANSFORM_FUNCTION_ROTATE,
"use-pivot-handle", FALSE,
NULL);
break;
}
}
}

View File

@ -41,6 +41,7 @@ enum
{
PROP_0,
PROP_MODE,
PROP_UNIFIED,
PROP_CONSTRAIN_AXIS,
PROP_Z_AXIS,
PROP_LOCAL_FRAME
@ -79,6 +80,13 @@ gimp_transform_3d_options_class_init (GimpTransform3DOptionsClass *klass)
GIMP_TRANSFORM_3D_MODE_CAMERA,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_UNIFIED,
"unified",
_("Unified interaction"),
_("Combine all interaction modes"),
FALSE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_CONSTRAIN_AXIS,
"constrain-axis",
NULL,
@ -119,6 +127,9 @@ gimp_transform_3d_options_set_property (GObject *object,
case PROP_MODE:
options->mode = g_value_get_enum (value);
break;
case PROP_UNIFIED:
options->unified = g_value_get_boolean (value);
break;
case PROP_CONSTRAIN_AXIS:
options->constrain_axis = g_value_get_boolean (value);
@ -149,6 +160,9 @@ gimp_transform_3d_options_get_property (GObject *object,
case PROP_MODE:
g_value_set_enum (value, options->mode);
break;
case PROP_UNIFIED:
g_value_set_boolean (value, options->unified);
break;
case PROP_CONSTRAIN_AXIS:
g_value_set_boolean (value, options->constrain_axis);
@ -176,6 +190,10 @@ gimp_transform_3d_options_gui (GimpToolOptions *tool_options)
GdkModifierType extend_mask = gimp_get_extend_selection_mask ();
GdkModifierType constrain_mask = gimp_get_constrain_behavior_mask ();
button = gimp_prop_check_button_new (config, "unified", NULL);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
label = g_strdup_printf (_("Constrain axis (%s)"),
gimp_get_mod_string (extend_mask));

View File

@ -38,6 +38,8 @@ struct _GimpTransform3DOptions
GimpTransformGridOptions parent_instance;
GimpTransform3DMode mode;
gboolean unified;
gboolean constrain_axis;
gboolean z_axis;
gboolean local_frame;

View File

@ -670,6 +670,7 @@ gimp_transform_3d_tool_get_widget (GimpTransformGridTool *tg_tool)
static const gchar *bound_properties[] =
{
"mode",
"unified",
"constrain-axis",
"z-axis",
"local-frame",