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:
Diffstat (limited to 'source/blender/editors/object/object_edit.c')
-rw-r--r--source/blender/editors/object/object_edit.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 85d62c0401f..a05b7111846 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -96,6 +96,7 @@
#include "ED_mball.h"
#include "ED_lattice.h"
#include "ED_object.h"
+#include "ED_outliner.h"
#include "ED_screen.h"
#include "ED_undo.h"
#include "ED_image.h"
@@ -1537,6 +1538,16 @@ bool ED_object_editmode_calc_active_center(Object *obedit, const bool select_onl
#define COLLECTION_INVALID_INDEX -1
+static int move_to_collection_poll(bContext *C)
+{
+ if (CTX_wm_space_outliner(C) != NULL) {
+ return ED_outliner_collections_editor_poll(C);
+ }
+ else {
+ return ED_operator_object_active_editable(C);
+ }
+}
+
static int move_to_collection_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
@@ -1545,6 +1556,7 @@ static int move_to_collection_exec(bContext *C, wmOperator *op)
const bool is_link = STREQ(op->idname, "OBJECT_OT_link_to_collection");
const bool is_new = RNA_boolean_get(op->ptr, "is_new");
Collection *collection;
+ ListBase objects = {NULL};
if (!RNA_property_is_set(op->ptr, prop)) {
BKE_report(op->reports, RPT_ERROR, "No collection selected");
@@ -1558,18 +1570,16 @@ static int move_to_collection_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- Object *single_object = NULL;
- CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
- {
- if (single_object != NULL) {
- single_object = NULL;
- break;
- }
- else {
- single_object = ob;
+ if (CTX_wm_space_outliner(C) != NULL) {
+ ED_outliner_selected_objects_get(C, &objects);
+ }
+ else {
+ CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
+ {
+ BLI_addtail(&objects, BLI_genericNodeN(ob));
}
+ CTX_DATA_END;
}
- CTX_DATA_END;
if (is_new) {
char new_collection_name[MAX_NAME];
@@ -1577,16 +1587,21 @@ static int move_to_collection_exec(bContext *C, wmOperator *op)
collection = BKE_collection_add(bmain, collection, new_collection_name);
}
+ Object *single_object = BLI_listbase_is_single(&objects) ?
+ ((LinkData *)objects.first)->data : NULL;
+
if ((single_object != NULL) &&
is_link &&
BLI_findptr(&collection->gobject, single_object, offsetof(CollectionObject, ob)))
{
BKE_reportf(op->reports, RPT_ERROR, "%s already in %s", single_object->id.name + 2, collection->id.name + 2);
+ BLI_freelistN(&objects);
return OPERATOR_CANCELLED;
}
- CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
- {
+ for (LinkData *link = objects.first; link; link = link->next) {
+ Object *ob = link->data;
+
if (!is_link) {
BKE_collection_object_move(bmain, scene, collection, NULL, ob);
}
@@ -1594,7 +1609,7 @@ static int move_to_collection_exec(bContext *C, wmOperator *op)
BKE_collection_object_add(bmain, collection, ob);
}
}
- CTX_DATA_END;
+ BLI_freelistN(&objects);
BKE_reportf(op->reports,
RPT_INFO,
@@ -1801,7 +1816,7 @@ void OBJECT_OT_move_to_collection(wmOperatorType *ot)
/* api callbacks */
ot->exec = move_to_collection_exec;
ot->invoke = move_to_collection_invoke;
- ot->poll = ED_operator_object_active_editable;
+ ot->poll = move_to_collection_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1828,7 +1843,7 @@ void OBJECT_OT_link_to_collection(wmOperatorType *ot)
/* api callbacks */
ot->exec = move_to_collection_exec;
ot->invoke = move_to_collection_invoke;
- ot->poll = ED_operator_object_active_editable;
+ ot->poll = move_to_collection_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;