mirror of https://github.com/GNOME/gimp.git
Bug 795288 - Layer is moved by arrow keys even after all locks...
...(Pixel, Position and Size, Alpha Channel) are enabled. gimp_edit_selection_tool_translate(): add checks for locks and bail out with a message if the item is NULL or locked. gimp_move_tool_button_press(): refactor NULL and lock checks to look more like the new code added above, and also check "lock-content" of channels and masks: moving them changes their pixels.
This commit is contained in:
parent
64c38edd81
commit
ce8c4cb2a0
|
@ -1016,16 +1016,18 @@ gimp_edit_selection_tool_translate (GimpTool *tool,
|
|||
GimpTransformType translate_type,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
gint inc_x = 0;
|
||||
gint inc_y = 0;
|
||||
gint inc_x = 0;
|
||||
gint inc_y = 0;
|
||||
GimpUndo *undo;
|
||||
gboolean push_undo = TRUE;
|
||||
GimpImage *image = gimp_display_get_image (display);
|
||||
GimpItem *item = NULL;
|
||||
GimpTranslateMode edit_mode = GIMP_TRANSLATE_MODE_MASK;
|
||||
GimpUndoType undo_type = GIMP_UNDO_GROUP_MASK;
|
||||
const gchar *undo_desc = NULL;
|
||||
GdkModifierType extend_mask = gimp_get_extend_selection_mask ();
|
||||
gboolean push_undo = TRUE;
|
||||
GimpImage *image = gimp_display_get_image (display);
|
||||
GimpItem *item = NULL;
|
||||
GimpTranslateMode edit_mode = GIMP_TRANSLATE_MODE_MASK;
|
||||
GimpUndoType undo_type = GIMP_UNDO_GROUP_MASK;
|
||||
const gchar *undo_desc = NULL;
|
||||
GdkModifierType extend_mask = gimp_get_extend_selection_mask ();
|
||||
const gchar *null_message = NULL;
|
||||
const gchar *locked_message = NULL;
|
||||
gint velocity;
|
||||
|
||||
/* bail out early if it is not an arrow key event */
|
||||
|
@ -1092,6 +1094,21 @@ gimp_edit_selection_tool_translate (GimpTool *tool,
|
|||
|
||||
edit_mode = GIMP_TRANSLATE_MODE_MASK;
|
||||
undo_type = GIMP_UNDO_GROUP_MASK;
|
||||
|
||||
if (! item)
|
||||
{
|
||||
/* cannot happen, don't translate this message */
|
||||
null_message = "There is no selection to move.";
|
||||
}
|
||||
else if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
/* cannot happen, don't translate this message */
|
||||
locked_message = "The selection's position is locked.";
|
||||
}
|
||||
else if (gimp_channel_is_empty (GIMP_CHANNEL (item)))
|
||||
{
|
||||
locked_message = _("The selection is empty.");
|
||||
}
|
||||
break;
|
||||
|
||||
case GIMP_TRANSFORM_TYPE_PATH:
|
||||
|
@ -1099,38 +1116,85 @@ gimp_edit_selection_tool_translate (GimpTool *tool,
|
|||
|
||||
edit_mode = GIMP_TRANSLATE_MODE_VECTORS;
|
||||
undo_type = GIMP_UNDO_GROUP_ITEM_DISPLACE;
|
||||
|
||||
if (! item)
|
||||
{
|
||||
null_message = _("There is no path to move.");
|
||||
}
|
||||
else if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
locked_message = _("The active path's position is locked.");
|
||||
}
|
||||
break;
|
||||
|
||||
case GIMP_TRANSFORM_TYPE_LAYER:
|
||||
item = GIMP_ITEM (gimp_image_get_active_drawable (image));
|
||||
|
||||
if (item)
|
||||
{
|
||||
if (GIMP_IS_LAYER_MASK (item))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_LAYER_MASK;
|
||||
}
|
||||
else if (GIMP_IS_CHANNEL (item))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_CHANNEL;
|
||||
}
|
||||
else if (gimp_layer_is_floating_sel (GIMP_LAYER (item)))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_FLOATING_SEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_LAYER;
|
||||
}
|
||||
undo_type = GIMP_UNDO_GROUP_ITEM_DISPLACE;
|
||||
|
||||
undo_type = GIMP_UNDO_GROUP_ITEM_DISPLACE;
|
||||
if (! item)
|
||||
{
|
||||
null_message = _("There is no layer to move.");
|
||||
}
|
||||
else if (GIMP_IS_LAYER_MASK (item))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_LAYER_MASK;
|
||||
|
||||
if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
}
|
||||
else if (gimp_item_is_content_locked (item))
|
||||
{
|
||||
locked_message = _("The active layer's pixels are locked.");
|
||||
}
|
||||
}
|
||||
else if (GIMP_IS_CHANNEL (item))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_CHANNEL;
|
||||
|
||||
if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
locked_message = _("The active channel's position is locked.");
|
||||
}
|
||||
else if (gimp_item_is_content_locked (item))
|
||||
{
|
||||
locked_message = _("The active channel's pixels are locked.");
|
||||
}
|
||||
}
|
||||
else if (gimp_layer_is_floating_sel (GIMP_LAYER (item)))
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_FLOATING_SEL;
|
||||
|
||||
if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_mode = GIMP_TRANSLATE_MODE_LAYER;
|
||||
|
||||
if (gimp_item_is_position_locked (item))
|
||||
{
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (! item)
|
||||
return TRUE;
|
||||
{
|
||||
gimp_tool_message_literal (tool, display, null_message);
|
||||
return TRUE;
|
||||
}
|
||||
else if (locked_message)
|
||||
{
|
||||
gimp_tool_message_literal (tool, display, locked_message);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
switch (edit_mode)
|
||||
{
|
||||
|
|
|
@ -160,13 +160,14 @@ gimp_move_tool_button_press (GimpTool *tool,
|
|||
GimpButtonPressType press_type,
|
||||
GimpDisplay *display)
|
||||
{
|
||||
GimpMoveTool *move = GIMP_MOVE_TOOL (tool);
|
||||
GimpMoveOptions *options = GIMP_MOVE_TOOL_GET_OPTIONS (tool);
|
||||
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||
GimpImage *image = gimp_display_get_image (display);
|
||||
GimpItem *active_item = NULL;
|
||||
const gchar *null_message = NULL;
|
||||
const gchar *locked_message = NULL;
|
||||
GimpMoveTool *move = GIMP_MOVE_TOOL (tool);
|
||||
GimpMoveOptions *options = GIMP_MOVE_TOOL_GET_OPTIONS (tool);
|
||||
GimpDisplayShell *shell = gimp_display_get_shell (display);
|
||||
GimpImage *image = gimp_display_get_image (display);
|
||||
GimpItem *active_item = NULL;
|
||||
GimpTranslateMode translate_mode = GIMP_TRANSLATE_MODE_MASK;
|
||||
const gchar *null_message = NULL;
|
||||
const gchar *locked_message = NULL;
|
||||
|
||||
tool->display = display;
|
||||
|
||||
|
@ -252,87 +253,75 @@ gimp_move_tool_button_press (GimpTool *tool,
|
|||
{
|
||||
case GIMP_TRANSFORM_TYPE_PATH:
|
||||
{
|
||||
active_item = GIMP_ITEM (gimp_image_get_active_vectors (image));
|
||||
null_message = _("There is no path to move.");
|
||||
locked_message = _("The active path's position is locked.");
|
||||
active_item = GIMP_ITEM (gimp_image_get_active_vectors (image));
|
||||
|
||||
if (active_item && ! gimp_item_is_position_locked (active_item))
|
||||
translate_mode = GIMP_TRANSLATE_MODE_VECTORS;
|
||||
|
||||
if (! active_item)
|
||||
{
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
GIMP_TRANSLATE_MODE_VECTORS,
|
||||
TRUE);
|
||||
return;
|
||||
null_message = _("There is no path to move.");
|
||||
}
|
||||
else if (gimp_item_is_position_locked (active_item))
|
||||
{
|
||||
locked_message = _("The active path's position is locked.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GIMP_TRANSFORM_TYPE_SELECTION:
|
||||
{
|
||||
active_item = GIMP_ITEM (gimp_image_get_mask (image));
|
||||
/* cannot happen, so don't translate these messages */
|
||||
null_message = "There is no selection to move.";
|
||||
locked_message = "The selection's position is locked.";
|
||||
active_item = GIMP_ITEM (gimp_image_get_mask (image));
|
||||
|
||||
if (active_item && ! gimp_item_is_position_locked (active_item))
|
||||
translate_mode = GIMP_TRANSLATE_MODE_MASK;
|
||||
|
||||
if (! active_item)
|
||||
{
|
||||
if (! gimp_channel_is_empty (gimp_image_get_mask (image)))
|
||||
{
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
GIMP_TRANSLATE_MODE_MASK,
|
||||
TRUE);
|
||||
return;
|
||||
}
|
||||
else
|
||||
locked_message = _("The selection is empty.");
|
||||
/* cannot happen, don't translate this message */
|
||||
null_message = "There is no selection to move.";
|
||||
}
|
||||
else if (gimp_item_is_position_locked (active_item))
|
||||
{
|
||||
locked_message = "The selection's position is locked.";
|
||||
}
|
||||
else if (gimp_channel_is_empty (GIMP_CHANNEL (active_item)))
|
||||
{
|
||||
locked_message = _("The selection is empty.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GIMP_TRANSFORM_TYPE_LAYER:
|
||||
{
|
||||
active_item = GIMP_ITEM (gimp_image_get_active_drawable (image));
|
||||
null_message = _("There is no layer to move.");
|
||||
active_item = GIMP_ITEM (gimp_image_get_active_drawable (image));
|
||||
|
||||
if (GIMP_IS_LAYER_MASK (active_item))
|
||||
if (! active_item)
|
||||
{
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
null_message = _("There is no layer to move.");
|
||||
}
|
||||
else if (GIMP_IS_LAYER_MASK (active_item))
|
||||
{
|
||||
translate_mode = GIMP_TRANSLATE_MODE_LAYER_MASK;
|
||||
|
||||
if (! gimp_item_is_position_locked (active_item))
|
||||
{
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
GIMP_TRANSLATE_MODE_LAYER_MASK,
|
||||
TRUE);
|
||||
return;
|
||||
}
|
||||
if (gimp_item_is_position_locked (active_item))
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
else if (gimp_item_is_content_locked (active_item))
|
||||
locked_message = _("The active layer's pixels are locked.");
|
||||
}
|
||||
else if (GIMP_IS_CHANNEL (active_item))
|
||||
{
|
||||
locked_message = _("The active channel's position is locked.");
|
||||
translate_mode = GIMP_TRANSLATE_MODE_CHANNEL;
|
||||
|
||||
if (! gimp_item_is_position_locked (active_item))
|
||||
{
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
GIMP_TRANSLATE_MODE_CHANNEL,
|
||||
TRUE);
|
||||
return;
|
||||
}
|
||||
if (gimp_item_is_position_locked (active_item))
|
||||
locked_message = _("The active channel's position is locked.");
|
||||
else if (gimp_item_is_content_locked (active_item))
|
||||
locked_message = _("The active channel's pixels are locked.");
|
||||
}
|
||||
else if (GIMP_IS_LAYER (active_item))
|
||||
else
|
||||
{
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
translate_mode = GIMP_TRANSLATE_MODE_LAYER;
|
||||
|
||||
if (! gimp_item_is_position_locked (active_item))
|
||||
{
|
||||
gimp_tool_control_activate (tool->control);
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
GIMP_TRANSLATE_MODE_LAYER,
|
||||
TRUE);
|
||||
return;
|
||||
}
|
||||
if (gimp_item_is_position_locked (active_item))
|
||||
locked_message = _("The active layer's position is locked.");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -342,12 +331,20 @@ gimp_move_tool_button_press (GimpTool *tool,
|
|||
{
|
||||
gimp_tool_message_literal (tool, display, null_message);
|
||||
gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, display);
|
||||
return;
|
||||
}
|
||||
else
|
||||
else if (locked_message)
|
||||
{
|
||||
gimp_tool_message_literal (tool, display, locked_message);
|
||||
gimp_tool_control (tool, GIMP_TOOL_ACTION_HALT, display);
|
||||
return;
|
||||
}
|
||||
|
||||
gimp_tool_control_activate (tool->control);
|
||||
|
||||
gimp_edit_selection_tool_start (tool, display, coords,
|
||||
translate_mode,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue