mirror of https://github.com/GNOME/gimp.git
Make "Merge down" work on trees and start fixing the rest of the merge code
* make internal merge functions aware of the container to merge and its parent layer. * git rid of some cruft in gimp_image_merge_down(). * merge down works within one container (naturally) and needs: - the uppper layer not to be a group - the lower layer to be writable * fix action sensitivity accordingly.
This commit is contained in:
parent
7a373152f9
commit
d91a89e157
|
@ -545,7 +545,13 @@ layers_actions_update (GimpActionGroup *group,
|
|||
next_visible = g_list_next (next_visible))
|
||||
{
|
||||
if (gimp_item_get_visible (next_visible->data))
|
||||
break;
|
||||
{
|
||||
/* next_visible is actually next_visible_and_writable */
|
||||
if (gimp_item_get_lock_content (next_visible->data))
|
||||
next_visible = NULL;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -581,7 +587,8 @@ layers_actions_update (GimpActionGroup *group,
|
|||
SET_SENSITIVE ("layers-lower-to-bottom", layer && !fs && !ac && next);
|
||||
|
||||
SET_SENSITIVE ("layers-anchor", layer && fs && !ac);
|
||||
SET_SENSITIVE ("layers-merge-down", layer && !fs && !ac && next_visible);
|
||||
SET_SENSITIVE ("layers-merge-down", layer && !fs && !ac &&
|
||||
!children && next_visible);
|
||||
SET_SENSITIVE ("layers-merge-layers", layer && !fs && !ac);
|
||||
SET_SENSITIVE ("layers-flatten-image", layer && !fs && !ac);
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#include "gimp-intl.h"
|
||||
|
||||
static GimpLayer * gimp_image_merge_layers (GimpImage *image,
|
||||
GimpContainer *container,
|
||||
GSList *merge_list,
|
||||
GimpContext *context,
|
||||
GimpMergeType merge_type,
|
||||
|
@ -106,7 +107,9 @@ gimp_image_merge_visible_layers (GimpImage *image,
|
|||
undo_desc);
|
||||
}
|
||||
|
||||
layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
|
||||
layer = gimp_image_merge_layers (image,
|
||||
gimp_image_get_layers (image),
|
||||
merge_list, context, merge_type,
|
||||
_("Merge Visible Layers"));
|
||||
g_slist_free (merge_list);
|
||||
|
||||
|
@ -157,7 +160,9 @@ gimp_image_flatten (GimpImage *image,
|
|||
merge_list = g_slist_append (merge_list, layer);
|
||||
}
|
||||
|
||||
layer = gimp_image_merge_layers (image, merge_list, context,
|
||||
layer = gimp_image_merge_layers (image,
|
||||
gimp_image_get_layers (image),
|
||||
merge_list, context,
|
||||
GIMP_FLATTEN_IMAGE, _("Flatten Image"));
|
||||
g_slist_free (merge_list);
|
||||
|
||||
|
@ -176,14 +181,18 @@ gimp_image_merge_down (GimpImage *image,
|
|||
{
|
||||
GimpLayer *layer;
|
||||
GList *list;
|
||||
GList *layer_list;
|
||||
GSList *merge_list;
|
||||
GList *layer_list = NULL;
|
||||
GSList *merge_list = NULL;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
||||
g_return_val_if_fail (GIMP_IS_LAYER (current_layer), NULL);
|
||||
g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (current_layer)), NULL);
|
||||
g_return_val_if_fail (gimp_viewable_get_children (GIMP_VIEWABLE (current_layer)) == NULL,
|
||||
NULL);
|
||||
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
|
||||
|
||||
for (list = gimp_image_get_layer_iter (image), layer_list = NULL;
|
||||
list && !layer_list;
|
||||
for (list = gimp_item_get_container_iter (GIMP_ITEM (current_layer));
|
||||
list;
|
||||
list = g_list_next (list))
|
||||
{
|
||||
layer = list->data;
|
||||
|
@ -192,21 +201,29 @@ gimp_image_merge_down (GimpImage *image,
|
|||
break;
|
||||
}
|
||||
|
||||
for (layer_list = g_list_next (list), merge_list = NULL;
|
||||
layer_list && !merge_list;
|
||||
for (layer_list = g_list_next (list);
|
||||
layer_list;
|
||||
layer_list = g_list_next (layer_list))
|
||||
{
|
||||
layer = layer_list->data;
|
||||
|
||||
if (gimp_item_get_visible (GIMP_ITEM (layer)))
|
||||
merge_list = g_slist_append (NULL, layer);
|
||||
{
|
||||
g_return_val_if_fail (! gimp_item_get_lock_content (GIMP_ITEM (layer)),
|
||||
NULL);
|
||||
|
||||
merge_list = g_slist_append (NULL, layer);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
merge_list = g_slist_prepend (merge_list, current_layer);
|
||||
|
||||
gimp_set_busy (image->gimp);
|
||||
|
||||
layer = gimp_image_merge_layers (image, merge_list, context, merge_type,
|
||||
layer = gimp_image_merge_layers (image,
|
||||
gimp_item_get_container (GIMP_ITEM (current_layer)),
|
||||
merge_list, context, merge_type,
|
||||
_("Merge Down"));
|
||||
g_slist_free (merge_list);
|
||||
|
||||
|
@ -304,6 +321,7 @@ gimp_image_merge_layers_get_operation (GimpLayer *dest,
|
|||
|
||||
static GimpLayer *
|
||||
gimp_image_merge_layers (GimpImage *image,
|
||||
GimpContainer *container,
|
||||
GSList *merge_list,
|
||||
GimpContext *context,
|
||||
GimpMergeType merge_type,
|
||||
|
@ -325,6 +343,7 @@ gimp_image_merge_layers (GimpImage *image,
|
|||
gboolean active[MAX_CHANNELS] = { TRUE, TRUE, TRUE, TRUE };
|
||||
gint off_x, off_y;
|
||||
gchar *name;
|
||||
GimpLayer *parent;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
|
||||
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
|
||||
|
@ -335,6 +354,8 @@ gimp_image_merge_layers (GimpImage *image,
|
|||
x2 = y2 = 0;
|
||||
bottom_layer = NULL;
|
||||
|
||||
parent = GIMP_LAYER (gimp_viewable_get_parent (merge_list->data));
|
||||
|
||||
/* Get the layer extents */
|
||||
count = 0;
|
||||
while (merge_list)
|
||||
|
@ -480,8 +501,8 @@ gimp_image_merge_layers (GimpImage *image,
|
|||
*/
|
||||
layer = reverse_list->data;
|
||||
position =
|
||||
gimp_container_get_n_children (image->layers) -
|
||||
gimp_container_get_child_index (image->layers, GIMP_OBJECT (layer));
|
||||
gimp_container_get_n_children (container) -
|
||||
gimp_container_get_child_index (container, GIMP_OBJECT (layer));
|
||||
}
|
||||
|
||||
bottom_layer = layer;
|
||||
|
@ -588,18 +609,17 @@ gimp_image_merge_layers (GimpImage *image,
|
|||
gimp_image_remove_layer (image, layer, TRUE, NULL);
|
||||
}
|
||||
|
||||
/* FIXME tree */
|
||||
gimp_image_add_layer (image, merge_layer, NULL, position, TRUE);
|
||||
gimp_image_add_layer (image, merge_layer, parent,
|
||||
position, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Add the layer to the image */
|
||||
|
||||
/* FIXME tree */
|
||||
gimp_image_add_layer
|
||||
(image, merge_layer,
|
||||
NULL, gimp_container_get_n_children (image->layers) - position + 1,
|
||||
TRUE);
|
||||
gimp_image_add_layer (image, merge_layer, parent,
|
||||
gimp_container_get_n_children (container) -
|
||||
position + 1,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
/* set the name after the original layers have been removed so we
|
||||
|
|
Loading…
Reference in New Issue