static GList * gimp_image_item_list_remove_children (GList *list, const GimpItem *parent) { GList *l = list; while (l) { GimpItem *item = l->data; l = g_list_next (l); if (gimp_viewable_is_ancestor (GIMP_VIEWABLE (parent), GIMP_VIEWABLE (item))) { list = g_list_remove (list, item); } } return list; }
gboolean gimp_pdb_item_is_not_ancestor (GimpItem *item, GimpItem *not_descendant, GError **error) { g_return_val_if_fail (GIMP_IS_ITEM (item), FALSE); g_return_val_if_fail (GIMP_IS_ITEM (not_descendant), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); if (gimp_viewable_is_ancestor (GIMP_VIEWABLE (item), GIMP_VIEWABLE (not_descendant))) { g_set_error (error, GIMP_PDB_ERROR, GIMP_PDB_ERROR_INVALID_ARGUMENT, _("Item '%s' (%d) must not be an ancestor of " "'%s' (%d)"), gimp_object_get_name (item), gimp_item_get_ID (item), gimp_object_get_name (not_descendant), gimp_item_get_ID (not_descendant)); return FALSE; } return TRUE; }
gboolean gimp_container_tree_view_real_drop_possible (GimpContainerTreeView *tree_view, GimpDndType src_type, GimpViewable *src_viewable, GimpViewable *dest_viewable, GtkTreePath *drop_path, GtkTreeViewDropPosition drop_pos, GtkTreeViewDropPosition *return_drop_pos, GdkDragAction *return_drag_action) { GimpContainerView *view = GIMP_CONTAINER_VIEW (tree_view); GimpContainer *container = gimp_container_view_get_container (view); GimpContainer *src_container = NULL; GimpContainer *dest_container = NULL; gint src_index = -1; gint dest_index = -1; if (src_viewable) { GimpViewable *parent = gimp_viewable_get_parent (src_viewable); if (parent) src_container = gimp_viewable_get_children (parent); else if (gimp_container_have (container, GIMP_OBJECT (src_viewable))) src_container = container; if (src_container) src_index = gimp_container_get_child_index (src_container, GIMP_OBJECT (src_viewable)); } if (dest_viewable) { GimpViewable *parent; /* dropping on the lower third of a group item drops into that group */ if (drop_pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER && gimp_viewable_get_children (dest_viewable)) { parent = dest_viewable; } else { parent = gimp_viewable_get_parent (dest_viewable); } if (parent) dest_container = gimp_viewable_get_children (parent); else if (gimp_container_have (container, GIMP_OBJECT (dest_viewable))) dest_container = container; if (parent == dest_viewable) dest_index = 0; else dest_index = gimp_container_get_child_index (dest_container, GIMP_OBJECT (dest_viewable)); } if (src_viewable && g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable), gimp_container_get_children_type (container))) { if (src_viewable == dest_viewable) return FALSE; if (src_index == -1 || dest_index == -1) return FALSE; /* don't allow dropping a parent node onto one of its descendants */ if (gimp_viewable_is_ancestor (src_viewable, dest_viewable)) return FALSE; } if (src_container == dest_container) { if (drop_pos == GTK_TREE_VIEW_DROP_BEFORE) { if (dest_index == (src_index + 1)) return FALSE; } else if (drop_pos == GTK_TREE_VIEW_DROP_AFTER) { if (dest_index == (src_index - 1)) return FALSE; } } if (return_drop_pos) *return_drop_pos = drop_pos; if (return_drag_action) { if (src_viewable && g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable), gimp_container_get_children_type (container))) *return_drag_action = GDK_ACTION_MOVE; else *return_drag_action = GDK_ACTION_COPY; } return TRUE; }