diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2019-03-06 17:09:16 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2019-03-06 17:19:29 +0300 |
commit | a77feabb51470b9cfb71be7f0ea7e774d6591799 (patch) | |
tree | d48b45fa9be178a6f3655a37dbe5148747d5fd53 /source/blender/editors | |
parent | 8462f0e85ef4752c09b2019b1e736e34e6dc8161 (diff) |
Collection duplication from Outliner: add a 'duplicate hierarchy' operation.
Point is, you may want to duplicate your set of collections, but not
duplicate all their objects.
Some notes:
* Am rather skeptical about the practice of using operator name to
define behavior of some common exec code. Imho, that should be a single
operator with an enum to refine its behavior (@cambpellbarton may also
have an opinion here?). Left it as-is for now, because this seems to be
used by other operators too in that code. :/
* @dfelinto, @pablovazquez, @billreynish am not so happy with current
names, but cannot find really good short ones either... Also, shouldn't
we move those into a dedicated `Duplicate` sub-menu?
Diffstat (limited to 'source/blender/editors')
3 files changed, 27 insertions, 9 deletions
diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index 750c78d76b9..7403525c293 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -448,7 +448,8 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); SpaceOutliner *soops = CTX_wm_space_outliner(C); TreeElement *te = outliner_active_collection(C); - bool linked = strstr(op->idname, "linked") != NULL; + const bool hierarchy = strstr(op->idname, "hierarchy") != NULL; + const bool linked = strstr(op->idname, "linked") != NULL; /* Can happen when calling from a key binding. */ if (te == NULL) { @@ -468,7 +469,7 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) case SO_SCENES: case SO_VIEW_LAYER: case SO_LIBRARIES: - BKE_collection_duplicate(bmain, parent, collection, true, !linked); + BKE_collection_duplicate(bmain, parent, collection, true, !hierarchy, !linked); break; } @@ -478,12 +479,12 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void OUTLINER_OT_collection_duplicate(wmOperatorType *ot) +void OUTLINER_OT_collection_duplicate_hierarchy(wmOperatorType *ot) { /* identifiers */ - ot->name = "Duplicate Collection"; - ot->idname = "OUTLINER_OT_collection_duplicate"; - ot->description = "Duplicate all objects and collections and make them single user"; + ot->name = "Duplicate Collection Hierarchy"; + ot->idname = "OUTLINER_OT_collection_duplicate_hierarchy"; + ot->description = "Recursively duplicate the collection and all its children, with linked objects"; /* api callbacks */ ot->exec = collection_duplicate_exec; @@ -498,7 +499,22 @@ void OUTLINER_OT_collection_duplicate_linked(wmOperatorType *ot) /* identifiers */ ot->name = "Duplicate Linked Collection"; ot->idname = "OUTLINER_OT_collection_duplicate_linked"; - ot->description = "Duplicate all objects and collections with linked object data"; + ot->description = "Recursively duplicate the collection, all its children and objects, with linked object data"; + + /* api callbacks */ + ot->exec = collection_duplicate_exec; + ot->poll = ED_outliner_collections_editor_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + +void OUTLINER_OT_collection_duplicate(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Duplicate Collection"; + ot->idname = "OUTLINER_OT_collection_duplicate"; + ot->description = "Recursively duplicate the collection, all its children, objects and object data"; /* api callbacks */ ot->exec = collection_duplicate_exec; diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h index 0851d5ce9f4..5af8e2252ef 100644 --- a/source/blender/editors/space_outliner/outliner_intern.h +++ b/source/blender/editors/space_outliner/outliner_intern.h @@ -315,8 +315,9 @@ bool outliner_is_collection_tree_element(const TreeElement *te); struct Collection *outliner_collection_from_tree_element(const TreeElement *te); void OUTLINER_OT_collection_new(struct wmOperatorType *ot); -void OUTLINER_OT_collection_duplicate(struct wmOperatorType *ot); +void OUTLINER_OT_collection_duplicate_hierarchy(struct wmOperatorType *ot); void OUTLINER_OT_collection_duplicate_linked(struct wmOperatorType *ot); +void OUTLINER_OT_collection_duplicate(struct wmOperatorType *ot); void OUTLINER_OT_collection_delete(struct wmOperatorType *ot); void OUTLINER_OT_collection_objects_select(struct wmOperatorType *ot); void OUTLINER_OT_collection_objects_deselect(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index eea06fc0b0c..af73e88aa73 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -93,8 +93,9 @@ void outliner_operatortypes(void) /* collections */ WM_operatortype_append(OUTLINER_OT_collection_new); - WM_operatortype_append(OUTLINER_OT_collection_duplicate); + WM_operatortype_append(OUTLINER_OT_collection_duplicate_hierarchy); WM_operatortype_append(OUTLINER_OT_collection_duplicate_linked); + WM_operatortype_append(OUTLINER_OT_collection_duplicate); WM_operatortype_append(OUTLINER_OT_collection_delete); WM_operatortype_append(OUTLINER_OT_collection_objects_select); WM_operatortype_append(OUTLINER_OT_collection_objects_deselect); |