[gimp] Add gimp_item_tree_reorder_item()
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] Add gimp_item_tree_reorder_item()
- Date: Sat, 6 Feb 2010 15:01:29 +0000 (UTC)
commit 25d39f2daa279598c5a7a7102d0f7e04216611f7
Author: Michael Natterer <mitch gimp org>
Date: Sat Feb 6 16:00:06 2010 +0100
Add gimp_item_tree_reorder_item()
and remove the code duplication in gimp_image_reorder_layer(),
_channel() and _vectors(), which now consist of a single call to
gimp_item_tree_reorder_item().
app/core/gimpimage.c | 217 +++++++---------------------------------------
app/core/gimpitemtree.c | 76 ++++++++++++++++
app/core/gimpitemtree.h | 22 ++++-
3 files changed, 127 insertions(+), 188 deletions(-)
---
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index c561f99..2c017a1 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -3276,33 +3276,6 @@ gimp_image_get_insert_pos (GimpItem *parent,
return parent;
}
-static GimpContainer *
-gimp_image_get_reorder_pos (GimpItem *item,
- GimpItem *new_parent,
- gint *new_index,
- GimpContainer *toplevel_container)
-{
- GimpContainer *container;
- GimpContainer *new_container;
- gint num_items;
-
- container = gimp_item_get_container (item);
-
- if (new_parent)
- new_container = gimp_viewable_get_children (GIMP_VIEWABLE (new_parent));
- else
- new_container = toplevel_container;
-
- num_items = gimp_container_get_n_children (new_container);
-
- if (new_container == container)
- num_items--;
-
- *new_index = CLAMP (*new_index, 0, num_items);
-
- return new_container;
-}
-
gboolean
gimp_image_add_layer (GimpImage *image,
GimpLayer *layer,
@@ -3718,59 +3691,19 @@ gimp_image_reorder_layer (GimpImage *image,
gboolean push_undo,
const gchar *undo_desc)
{
- GimpImagePrivate *private;
- GimpContainer *container;
- GimpContainer *new_container;
-
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
- g_return_val_if_fail (GIMP_IS_LAYER (layer), FALSE);
- g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)), FALSE);
- g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (layer)) == image, FALSE);
- g_return_val_if_fail (new_parent == NULL || GIMP_IS_LAYER (new_parent), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
- FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
- FALSE);
-
- private = GIMP_IMAGE_GET_PRIVATE (image);
-
- container = gimp_item_get_container (GIMP_ITEM (layer));
-
- new_container = gimp_image_get_reorder_pos (GIMP_ITEM (layer),
- GIMP_ITEM (new_parent),
- &new_index,
- private->layers->container);
-
- if (new_container != container ||
- new_index != gimp_item_get_index (GIMP_ITEM (layer)))
- {
- if (push_undo)
- gimp_image_undo_push_layer_reorder (image, undo_desc, layer);
- if (new_container != container)
- {
- g_object_ref (layer);
-
- gimp_container_remove (container, GIMP_OBJECT (layer));
-
- gimp_viewable_set_parent (GIMP_VIEWABLE (layer),
- GIMP_VIEWABLE (new_parent));
-
- gimp_container_insert (new_container, GIMP_OBJECT (layer), new_index);
-
- g_object_unref (layer);
- }
- else
- {
- gimp_container_reorder (container, GIMP_OBJECT (layer), new_index);
- }
- }
-
- return TRUE;
+ /* item and new_parent are type-checked in GimpItemTree
+ */
+ return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->layers,
+ (GimpItem *) layer,
+ (GimpItem *) new_parent,
+ new_index,
+ (GimpItemReorderUndoFunc)
+ (push_undo ?
+ gimp_image_undo_push_layer_reorder :
+ NULL),
+ undo_desc);
}
gboolean
@@ -4032,61 +3965,19 @@ gimp_image_reorder_channel (GimpImage *image,
gboolean push_undo,
const gchar *undo_desc)
{
- GimpImagePrivate *private;
- GimpContainer *container;
- GimpContainer *new_container;
-
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
- g_return_val_if_fail (GIMP_IS_CHANNEL (channel), FALSE);
- g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)), FALSE);
- g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (channel)) == image,
- FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- GIMP_IS_CHANNEL (new_parent), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
- FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
- FALSE);
-
- private = GIMP_IMAGE_GET_PRIVATE (image);
- container = gimp_item_get_container (GIMP_ITEM (channel));
-
- new_container = gimp_image_get_reorder_pos (GIMP_ITEM (channel),
- GIMP_ITEM (new_parent),
- &new_index,
- private->channels->container);
-
- if (new_container != container ||
- new_index != gimp_item_get_index (GIMP_ITEM (channel)))
- {
- if (push_undo)
- gimp_image_undo_push_channel_reorder (image, undo_desc, channel);
-
- if (new_container != container)
- {
- g_object_ref (channel);
-
- gimp_container_remove (container, GIMP_OBJECT (channel));
-
- gimp_viewable_set_parent (GIMP_VIEWABLE (channel),
- GIMP_VIEWABLE (new_parent));
-
- gimp_container_insert (new_container, GIMP_OBJECT (channel), new_index);
-
- g_object_unref (channel);
- }
- else
- {
- gimp_container_reorder (container, GIMP_OBJECT (channel), new_index);
- }
- }
-
- return TRUE;
+ /* item and new_parent are type-checked in GimpItemTree
+ */
+ return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->channels,
+ (GimpItem *) channel,
+ (GimpItem *) new_parent,
+ new_index,
+ (GimpItemReorderUndoFunc)
+ (push_undo ?
+ gimp_image_undo_push_channel_reorder :
+ NULL),
+ undo_desc);
}
gboolean
@@ -4322,61 +4213,19 @@ gimp_image_reorder_vectors (GimpImage *image,
gboolean push_undo,
const gchar *undo_desc)
{
- GimpImagePrivate *private;
- GimpContainer *container;
- GimpContainer *new_container;
-
g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
- g_return_val_if_fail (GIMP_IS_VECTORS (vectors), FALSE);
- g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (vectors)), FALSE);
- g_return_val_if_fail (gimp_item_get_image (GIMP_ITEM (vectors)) == image,
- FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- GIMP_IS_VECTORS (new_parent), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_is_attached (GIMP_ITEM (new_parent)), FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_item_get_image (GIMP_ITEM (new_parent)) == image,
- FALSE);
- g_return_val_if_fail (new_parent == NULL ||
- gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
- FALSE);
-
- private = GIMP_IMAGE_GET_PRIVATE (image);
-
- container = gimp_item_get_container (GIMP_ITEM (vectors));
-
- new_container = gimp_image_get_reorder_pos (GIMP_ITEM (vectors),
- GIMP_ITEM (new_parent),
- &new_index,
- private->vectors->container);
-
- if (new_container != container ||
- new_index != gimp_item_get_index (GIMP_ITEM (vectors)))
- {
- if (push_undo)
- gimp_image_undo_push_vectors_reorder (image, undo_desc, vectors);
-
- if (new_container != container)
- {
- g_object_ref (vectors);
- gimp_container_remove (container, GIMP_OBJECT (vectors));
-
- gimp_viewable_set_parent (GIMP_VIEWABLE (vectors),
- GIMP_VIEWABLE (new_parent));
-
- gimp_container_insert (new_container, GIMP_OBJECT (vectors), new_index);
-
- g_object_unref (vectors);
- }
- else
- {
- gimp_container_reorder (container, GIMP_OBJECT (vectors), new_index);
- }
- }
-
- return TRUE;
+ /* item and new_parent are type-checked in GimpItemTree
+ */
+ return gimp_item_tree_reorder_item (GIMP_IMAGE_GET_PRIVATE (image)->vectors,
+ (GimpItem *) vectors,
+ (GimpItem *) new_parent,
+ new_index,
+ (GimpItemReorderUndoFunc)
+ (push_undo ?
+ gimp_image_undo_push_vectors_reorder :
+ NULL),
+ undo_desc);
}
GimpLayer *
diff --git a/app/core/gimpitemtree.c b/app/core/gimpitemtree.c
index 1083597..3f09d05 100644
--- a/app/core/gimpitemtree.c
+++ b/app/core/gimpitemtree.c
@@ -248,3 +248,79 @@ gimp_item_tree_new (GimpImage *image,
"item-type", item_type,
NULL);
}
+
+gboolean
+gimp_item_tree_reorder_item (GimpItemTree *tree,
+ GimpItem *item,
+ GimpItem *new_parent,
+ gint new_index,
+ GimpItemReorderUndoFunc undo_func,
+ const gchar *undo_desc)
+{
+ GimpItemTreePrivate *private;
+ GimpContainer *container;
+ GimpContainer *new_container;
+ gint n_items;
+
+ g_return_val_if_fail (GIMP_IS_ITEM_TREE (tree), FALSE);
+
+ private = GIMP_ITEM_TREE_GET_PRIVATE (tree);
+
+ g_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (item, private->item_type),
+ FALSE);
+ g_return_val_if_fail (gimp_item_is_attached (item), FALSE);
+ g_return_val_if_fail (gimp_item_get_image (item) == private->image, FALSE);
+ g_return_val_if_fail (new_parent == NULL ||
+ G_TYPE_CHECK_INSTANCE_TYPE (new_parent,
+ private->item_type),
+ FALSE);
+ g_return_val_if_fail (new_parent == NULL ||
+ gimp_item_is_attached (new_parent), FALSE);
+ g_return_val_if_fail (new_parent == NULL ||
+ gimp_item_get_image (new_parent) == private->image,
+ FALSE);
+ g_return_val_if_fail (new_parent == NULL ||
+ gimp_viewable_get_children (GIMP_VIEWABLE (new_parent)),
+ FALSE);
+
+ container = gimp_item_get_container (item);
+
+ if (new_parent)
+ new_container = gimp_viewable_get_children (GIMP_VIEWABLE (new_parent));
+ else
+ new_container = tree->container;
+
+ n_items = gimp_container_get_n_children (new_container);
+
+ if (new_container == container)
+ n_items--;
+
+ new_index = CLAMP (new_index, 0, n_items);
+
+ if (new_container != container ||
+ new_index != gimp_item_get_index (item))
+ {
+ if (undo_func)
+ undo_func (private->image, undo_desc, item);
+
+ if (new_container != container)
+ {
+ g_object_ref (item);
+
+ gimp_container_remove (container, GIMP_OBJECT (item));
+
+ gimp_viewable_set_parent (GIMP_VIEWABLE (item),
+ GIMP_VIEWABLE (new_parent));
+
+ gimp_container_insert (new_container, GIMP_OBJECT (item), new_index);
+
+ g_object_unref (item);
+ }
+ else
+ {
+ gimp_container_reorder (container, GIMP_OBJECT (item), new_index);
+ }
+ }
+
+ return TRUE;
+}
diff --git a/app/core/gimpitemtree.h b/app/core/gimpitemtree.h
index ae5f849..fbcff18 100644
--- a/app/core/gimpitemtree.h
+++ b/app/core/gimpitemtree.h
@@ -25,6 +25,14 @@
#include "gimpobject.h"
+/* this is temporary, reorder undo will operate generically on the
+ * item tree too
+ */
+typedef GimpUndo * (* GimpItemReorderUndoFunc) (GimpImage *image,
+ const gchar *undo_desc,
+ GimpItem *item);
+
+
#define GIMP_TYPE_ITEM_TREE (gimp_item_tree_get_type ())
#define GIMP_ITEM_TREE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_ITEM_TREE, GimpItemTree))
#define GIMP_ITEM_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_ITEM_TREE, GimpItemTreeClass))
@@ -47,10 +55,16 @@ struct _GimpItemTreeClass
};
-GType gimp_item_tree_get_type (void) G_GNUC_CONST;
-GimpItemTree * gimp_item_tree_new (GimpImage *image,
- GType container_type,
- GType item_type);
+GType gimp_item_tree_get_type (void) G_GNUC_CONST;
+GimpItemTree * gimp_item_tree_new (GimpImage *image,
+ GType container_type,
+ GType item_type);
+gboolean gimp_item_tree_reorder_item (GimpItemTree *tree,
+ GimpItem *item,
+ GimpItem *new_parent,
+ gint new_index,
+ GimpItemReorderUndoFunc undo_func,
+ const gchar *undo_desc);
#endif /* __GIMP_ITEM_TREE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]