[gimp] Make "Merge down" work on trees and start fixing the rest of the merge code
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Make "Merge down" work on trees and start fixing the rest of the merge code
- Date: Tue, 25 Aug 2009 19:31:56 +0000 (UTC)
commit d91a89e1571e07f29de05dcd28b56edf1fffa702
Author: Michael Natterer <mitch gimp org>
Date: Tue Aug 25 21:26:14 2009 +0200
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.
app/actions/layers-actions.c | 11 ++++++-
app/core/gimpimage-merge.c | 58 ++++++++++++++++++++++++++++-------------
2 files changed, 48 insertions(+), 21 deletions(-)
---
diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c
index 8e44ef3..e37e384 100644
--- a/app/actions/layers-actions.c
+++ b/app/actions/layers-actions.c
@@ -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);
diff --git a/app/core/gimpimage-merge.c b/app/core/gimpimage-merge.c
index 93758e9..e293b25 100644
--- a/app/core/gimpimage-merge.c
+++ b/app/core/gimpimage-merge.c
@@ -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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]