Outliner: Operator to delete outliner selected elements from collection
Suggested by Pablo Vazquez (venomgfx).
This commit is contained in:
parent
5633bab2d0
commit
9631c1ac1a
|
@ -234,6 +234,8 @@ class OUTLINER_MT_context_object(Menu):
|
|||
layout.separator()
|
||||
layout.operator("outliner.object_operation", text="Remap Users").type='REMAP'
|
||||
layout.operator("outliner.object_operation", text="Rename").type='RENAME'
|
||||
layout.separator()
|
||||
layout.operator("outliner.collection_object_remove", text="Remove from Collection")
|
||||
|
||||
|
||||
classes = (
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "DEG_depsgraph_build.h"
|
||||
|
||||
#include "DNA_group_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
|
||||
#include "ED_screen.h"
|
||||
|
||||
|
@ -563,6 +564,80 @@ void OUTLINER_OT_collection_objects_remove(wmOperatorType *ot)
|
|||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
static int collection_object_remove_poll(bContext *C)
|
||||
{
|
||||
SpaceOops *so = CTX_wm_space_outliner(C);
|
||||
if (so == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((so->filter & (SO_FILTER_ENABLE | SO_FILTER_NO_COLLECTION)) ==
|
||||
(SO_FILTER_ENABLE | SO_FILTER_NO_COLLECTION))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ELEM(so->outlinevis, SO_VIEW_LAYER, SO_COLLECTIONS, SO_GROUPS);
|
||||
}
|
||||
|
||||
static int collection_object_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
SpaceOops *soops = CTX_wm_space_outliner(C);
|
||||
Main *bmain = CTX_data_main(C);
|
||||
|
||||
struct ObjectsSelectedData data = {
|
||||
.objects_selected_array = {NULL, NULL},
|
||||
};
|
||||
|
||||
outliner_tree_traverse(soops, &soops->tree, 0, TSE_SELECTED, outliner_find_selected_objects, &data);
|
||||
|
||||
BLI_LISTBASE_FOREACH (LinkData *, link, &data.objects_selected_array) {
|
||||
TreeElement *te = (TreeElement *)link->data;
|
||||
Object *ob = (Object *)TREESTORE(te)->id;
|
||||
SceneCollection *scene_collection = NULL;
|
||||
|
||||
TreeElement *te_parent = te;
|
||||
while ((te_parent = te_parent->parent)) {
|
||||
scene_collection = outliner_scene_collection_from_tree_element(te->parent);
|
||||
if (scene_collection != NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (scene_collection != NULL) {
|
||||
ID *owner_id = TREESTORE(te_parent)->id;
|
||||
BKE_collection_object_remove(bmain, owner_id, scene_collection, ob, true);
|
||||
DEG_id_tag_update(owner_id, DEG_TAG_BASE_FLAGS_UPDATE);
|
||||
}
|
||||
}
|
||||
|
||||
BLI_freelistN(&data.objects_selected_array);
|
||||
|
||||
outliner_cleanup_tree(soops);
|
||||
DEG_relations_tag_update(bmain);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
|
||||
WM_main_add_notifier(NC_SCENE | ND_OB_ACTIVE, NULL);
|
||||
WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, NULL);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void OUTLINER_OT_collection_object_remove(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name = "Remove Object from Collection";
|
||||
ot->idname = "OUTLINER_OT_collection_object_remove";
|
||||
ot->description = "Remove selected objects from their respective collection";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec = collection_object_remove_exec;
|
||||
ot->poll = collection_object_remove_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
struct CollectionDeleteData {
|
||||
Scene *scene;
|
||||
SpaceOops *soops;
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
/* internal exports only */
|
||||
|
||||
struct ARegion;
|
||||
struct ListBase;
|
||||
struct wmOperatorType;
|
||||
struct TreeElement;
|
||||
struct TreeStoreElem;
|
||||
|
@ -196,6 +197,12 @@ void outliner_build_tree(
|
|||
struct Scene *scene, struct ViewLayer *view_layer,
|
||||
struct SpaceOops *soops, struct ARegion *ar);
|
||||
|
||||
typedef struct ObjectsSelectedData {
|
||||
struct ListBase objects_selected_array;
|
||||
} ObjectsSelectedData;
|
||||
|
||||
TreeTraversalAction outliner_find_selected_objects(struct TreeElement *te, void *customdata);
|
||||
|
||||
/* outliner_draw.c ---------------------------------------------- */
|
||||
|
||||
void draw_outliner(const struct bContext *C);
|
||||
|
@ -347,6 +354,7 @@ void OUTLINER_OT_collection_link(struct wmOperatorType *ot);
|
|||
void OUTLINER_OT_collection_unlink(struct wmOperatorType *ot);
|
||||
void OUTLINER_OT_collection_new(struct wmOperatorType *ot);
|
||||
void OUTLINER_OT_collection_duplicate(struct wmOperatorType *ot);
|
||||
void OUTLINER_OT_collection_object_remove(struct wmOperatorType *ot);
|
||||
void OUTLINER_OT_collection_objects_remove(struct wmOperatorType *ot);
|
||||
void OUTLINER_OT_collection_objects_select(struct wmOperatorType *ot);
|
||||
|
||||
|
|
|
@ -479,6 +479,7 @@ void outliner_operatortypes(void)
|
|||
WM_operatortype_append(OUTLINER_OT_collection_nested_new);
|
||||
WM_operatortype_append(OUTLINER_OT_collection_delete_selected);
|
||||
WM_operatortype_append(OUTLINER_OT_collection_objects_add);
|
||||
WM_operatortype_append(OUTLINER_OT_collection_object_remove);
|
||||
WM_operatortype_append(OUTLINER_OT_collection_objects_remove);
|
||||
WM_operatortype_append(OUTLINER_OT_collection_objects_select);
|
||||
}
|
||||
|
|
|
@ -423,11 +423,7 @@ static void outliner_add_scene_contents(
|
|||
#endif
|
||||
}
|
||||
|
||||
struct ObjectsSelectedData {
|
||||
ListBase objects_selected_array;
|
||||
};
|
||||
|
||||
static TreeTraversalAction outliner_find_selected_objects(TreeElement *te, void *customdata)
|
||||
TreeTraversalAction outliner_find_selected_objects(TreeElement *te, void *customdata)
|
||||
{
|
||||
struct ObjectsSelectedData *data = customdata;
|
||||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
|
|
Loading…
Reference in New Issue