mirror of
https://gitlab.gnome.org/GNOME/gimp.git
synced 2025-07-03 09:23:24 +00:00
Merge branch 'cheesequake/refactoring-edit-cut' into 'master'
app: refactor code for 'cut' operation, allow cut for layer groups See merge request GNOME/gimp!2340
This commit is contained in:
commit
4d985aefc9
2 changed files with 38 additions and 57 deletions
|
@ -282,7 +282,7 @@ edit_actions_update (GimpActionGroup *group,
|
||||||
gboolean undo_enabled = FALSE;
|
gboolean undo_enabled = FALSE;
|
||||||
|
|
||||||
gboolean have_no_groups = FALSE; /* At least 1 selected layer is not a group. */
|
gboolean have_no_groups = FALSE; /* At least 1 selected layer is not a group. */
|
||||||
gboolean have_writable = FALSE; /* At least 1 selected layer has no contents lock. */
|
gboolean have_writable = TRUE; /* At least 1 selected layer has no contents lock. */
|
||||||
|
|
||||||
if (image)
|
if (image)
|
||||||
{
|
{
|
||||||
|
@ -292,11 +292,30 @@ edit_actions_update (GimpActionGroup *group,
|
||||||
|
|
||||||
for (iter = drawables; iter; iter = iter->next)
|
for (iter = drawables; iter; iter = iter->next)
|
||||||
{
|
{
|
||||||
if (! gimp_viewable_get_children (GIMP_VIEWABLE (iter->data)))
|
GimpContainer *container = gimp_viewable_get_children (GIMP_VIEWABLE (iter->data));
|
||||||
have_no_groups = TRUE;
|
|
||||||
|
|
||||||
if (! gimp_item_is_content_locked (GIMP_ITEM (iter->data), NULL))
|
if (gimp_item_is_content_locked (GIMP_ITEM (iter->data), NULL))
|
||||||
have_writable = TRUE;
|
have_writable = FALSE;
|
||||||
|
|
||||||
|
/* If we have a layer group, check if any of its children have
|
||||||
|
* content locked.
|
||||||
|
*/
|
||||||
|
if (! container)
|
||||||
|
{
|
||||||
|
have_no_groups = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gint n_children = gimp_container_get_n_children (container);
|
||||||
|
|
||||||
|
for (gint i = 0; i < n_children; i++)
|
||||||
|
{
|
||||||
|
GimpObject *child = gimp_container_get_child_by_index (container, i);
|
||||||
|
|
||||||
|
if (gimp_item_is_content_locked (GIMP_ITEM (child), NULL))
|
||||||
|
have_writable = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (have_no_groups && have_writable)
|
if (have_no_groups && have_writable)
|
||||||
break;
|
break;
|
||||||
|
@ -351,7 +370,7 @@ edit_actions_update (GimpActionGroup *group,
|
||||||
g_free (undo_name);
|
g_free (undo_name);
|
||||||
g_free (redo_name);
|
g_free (redo_name);
|
||||||
|
|
||||||
SET_SENSITIVE ("edit-cut", have_writable && have_no_groups);
|
SET_SENSITIVE ("edit-cut", have_writable);
|
||||||
SET_SENSITIVE ("edit-copy", drawables);
|
SET_SENSITIVE ("edit-copy", drawables);
|
||||||
SET_SENSITIVE ("edit-copy-visible", image);
|
SET_SENSITIVE ("edit-copy-visible", image);
|
||||||
/* "edit-paste" is always active */
|
/* "edit-paste" is always active */
|
||||||
|
|
|
@ -93,66 +93,28 @@ gimp_edit_cut (GimpImage *image,
|
||||||
undo_label);
|
undo_label);
|
||||||
g_free (undo_label);
|
g_free (undo_label);
|
||||||
|
|
||||||
if (gimp_channel_is_empty (gimp_image_get_mask (image)))
|
/* With a layer, a 'cut' is the same as a 'copy' and
|
||||||
|
* then deleting layers/clearing selections
|
||||||
|
*/
|
||||||
|
if (gimp_edit_copy (image, drawables, context, TRUE, error))
|
||||||
{
|
{
|
||||||
GList *remove = NULL;
|
|
||||||
GimpImage *clip_image;
|
|
||||||
|
|
||||||
/* Let's work on a copy because we will edit the list to remove
|
|
||||||
* layers whose ancestor is also cut.
|
|
||||||
*/
|
|
||||||
drawables = g_list_copy (drawables);
|
|
||||||
for (iter = drawables; iter; iter = iter->next)
|
for (iter = drawables; iter; iter = iter->next)
|
||||||
{
|
{
|
||||||
GList *iter2;
|
if (! gimp_channel_is_empty (gimp_image_get_mask (image)))
|
||||||
|
|
||||||
for (iter2 = drawables; iter2; iter2 = iter2->next)
|
|
||||||
{
|
{
|
||||||
if (iter2 == iter)
|
gimp_drawable_edit_clear (GIMP_DRAWABLE (iter->data), context);
|
||||||
continue;
|
}
|
||||||
|
else
|
||||||
if (gimp_viewable_is_ancestor (iter2->data, iter->data))
|
{
|
||||||
{
|
if (! gimp_layer_is_floating_sel (iter->data))
|
||||||
/* When cutting a layer group, all its children come
|
gimp_image_remove_layer (image, GIMP_LAYER (iter->data),
|
||||||
* with anyway.
|
TRUE, NULL);
|
||||||
*/
|
|
||||||
remove = g_list_prepend (remove, iter);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (iter = remove; iter; iter = iter->next)
|
|
||||||
drawables = g_list_delete_link (drawables, iter->data);
|
|
||||||
|
|
||||||
g_list_free (remove);
|
|
||||||
|
|
||||||
/* Now copy all layers into the clipboard image. */
|
|
||||||
clip_image = gimp_image_new_from_drawables (image->gimp, drawables, FALSE, TRUE);
|
|
||||||
gimp_container_remove (image->gimp->images, GIMP_OBJECT (clip_image));
|
|
||||||
gimp_set_clipboard_image (image->gimp, clip_image);
|
|
||||||
g_object_unref (clip_image);
|
|
||||||
|
|
||||||
/* Remove layers from source image. */
|
|
||||||
for (iter = drawables; iter; iter = iter->next)
|
|
||||||
if (! gimp_layer_is_floating_sel (iter->data))
|
|
||||||
gimp_image_remove_layer (image, GIMP_LAYER (iter->data),
|
|
||||||
TRUE, NULL);
|
|
||||||
|
|
||||||
g_list_free (drawables);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* With selection, a cut is similar to a copy followed by a clear. */
|
success = FALSE;
|
||||||
if (gimp_edit_copy (image, drawables, context, TRUE, error))
|
|
||||||
{
|
|
||||||
for (iter = drawables; iter; iter = iter->next)
|
|
||||||
if (! GIMP_IS_GROUP_LAYER (iter->data))
|
|
||||||
gimp_drawable_edit_clear (GIMP_DRAWABLE (iter->data), context);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
success = FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gimp_image_undo_group_end (image);
|
gimp_image_undo_group_end (image);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue