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:
Michael Natterer 2009-08-25 21:26:14 +02:00
parent 7a373152f9
commit d91a89e157
2 changed files with 48 additions and 21 deletions

View File

@ -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);

View File

@ -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