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:
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
||||
|
@ -38,6 +38,8 @@ struct _GimpTransform3DOptions
|
||||
GimpTransformGridOptions parent_instance;
|
||||
|
||||
GimpTransform3DMode mode;
|
||||
gboolean unified;
|
||||
|
||||
gboolean constrain_axis;
|
||||
gboolean z_axis;
|
||||
gboolean local_frame;
|
||||
|
@ -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",
|
||||
|
Reference in New Issue
Block a user