From eaf559d52aa56faf4f1d76781ac4fc75ca31119e Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 3 Jan 2018 17:58:01 -0200 Subject: Outliner/Collections: Add selected objects operator This is part of T53495. --- .../editors/space_outliner/outliner_collections.c | 85 ++++++++++++++++++---- 1 file changed, 71 insertions(+), 14 deletions(-) (limited to 'source/blender/editors/space_outliner/outliner_collections.c') diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index 7689131bad4..aef12971518 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -439,6 +439,77 @@ void OUTLINER_OT_collection_delete_selected(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } +/**********************************************************************************/ +/* Add new selected objects. */ + +struct SceneCollectionSelectedData { + ListBase scene_collections_array; +}; + +static TreeTraversalAction collection_find_selected_scene_collections(TreeElement *te, void *customdata) +{ + struct SceneCollectionSelectedData *data = customdata; + SceneCollection *scene_collection = outliner_scene_collection_from_tree_element(te); + + if (!scene_collection) { + return TRAVERSE_SKIP_CHILDS; + } + + BLI_addtail(&data->scene_collections_array, BLI_genericNodeN(scene_collection)); + return TRAVERSE_CONTINUE; +} + +static int collection_objects_add_exec(bContext *C, wmOperator *op) +{ + SpaceOops *soops = CTX_wm_space_outliner(C); + Main *bmain = CTX_data_main(C); + Scene *scene = CTX_data_scene(C); + + struct SceneCollectionSelectedData data = { + .scene_collections_array = {NULL, NULL}, + }; + + outliner_tree_traverse(soops, &soops->tree, 0, TSE_SELECTED, collection_find_selected_scene_collections, &data); + + if (BLI_listbase_is_empty(&data.scene_collections_array)) { + BKE_report(op->reports, RPT_ERROR, "No collection is selected"); + return OPERATOR_CANCELLED; + } + + CTX_DATA_BEGIN (C, struct Object *, ob, selected_objects) + { + LINKLIST_FOREACH(LinkData *, link, &data.scene_collections_array) { + SceneCollection *scene_collection = link->data; + BKE_collection_object_add( + &scene->id, + scene_collection, + ob); + } + } + CTX_DATA_END; + BLI_freelistN(&data.scene_collections_array); + + outliner_cleanup_tree(soops); + DEG_relations_tag_update(bmain); + WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL); + return OPERATOR_FINISHED; +} + +void OUTLINER_OT_collection_objects_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Objects"; + ot->idname = "OUTLINER_OT_collection_objects_add"; + ot->description = "Add selected objects to collection"; + + /* api callbacks */ + ot->exec = collection_objects_add_exec; + ot->poll = collections_editor_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + /**********************************************************************************/ /** @@ -673,20 +744,6 @@ static int stubs_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUS return OPERATOR_CANCELLED; } -void OUTLINER_OT_collection_objects_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Add Objects"; - ot->idname = "OUTLINER_OT_collection_objects_add"; - ot->description = "Add selected objects to collection"; - - /* api callbacks */ - ot->invoke = stubs_invoke; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; -} - void OUTLINER_OT_collection_objects_remove(wmOperatorType *ot) { /* identifiers */ -- cgit v1.2.3