Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2018-01-03 22:58:01 +0300
committerDalai Felinto <dfelinto@gmail.com>2018-01-03 23:27:06 +0300
commiteaf559d52aa56faf4f1d76781ac4fc75ca31119e (patch)
tree8d09ee0b87be5882eca900c29fc7661527ac87d1 /source/blender/editors/space_outliner/outliner_collections.c
parentd9b4d6ee5a4cb231070a0bcb5ac1e7b8c9c7f2f7 (diff)
Outliner/Collections: Add selected objects operator
This is part of T53495.
Diffstat (limited to 'source/blender/editors/space_outliner/outliner_collections.c')
-rw-r--r--source/blender/editors/space_outliner/outliner_collections.c85
1 files changed, 71 insertions, 14 deletions
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
@@ -440,6 +440,77 @@ void OUTLINER_OT_collection_delete_selected(wmOperatorType *ot)
}
/**********************************************************************************/
+/* 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;
+}
+
+/**********************************************************************************/
/**
* Returns true is selected element is a collection
@@ -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 */