Outliner collection operators, all but collection link

Note: It may be missing a notifier to prevent Outliner from crashing
when deleting collections.
This commit is contained in:
Dalai Felinto 2017-02-16 10:54:09 +01:00
parent 3d63b9a88f
commit 011c8c730f
4 changed files with 148 additions and 119 deletions

View File

@ -63,11 +63,11 @@ class OUTLINER_HT_header(Header):
elif space.display_mode == 'COLLECTIONS':
row = layout.row(align=True)
row.operator("outliner.collections_new", text="", icon='NEW')
row.operator("outliner.collections_override_new", text="", icon='LINK_AREA')
row.operator("outliner.collections_link", text="", icon='LINKED')
row.operator("outliner.collections_unlink", text="", icon='UNLINKED')
row.operator("outliner.collections_delete", text="", icon='X')
row.operator("outliner.collection_new", text="", icon='NEW')
row.operator("outliner.collection_override_new", text="", icon='LINK_AREA')
row.operator("outliner.collection_link", text="", icon='LINKED')
row.operator("outliner.collection_unlink", text="", icon='UNLINKED')
row.operator("outliner.collection_delete", text="", icon='X')
class OUTLINER_MT_editor_menus(Menu):

View File

@ -25,9 +25,12 @@
*/
#include "BKE_context.h"
#include "BKE_collection.h"
#include "BKE_layer.h"
#include "BKE_report.h"
#include "BLI_listbase.h"
#include "ED_screen.h"
#include "WM_api.h"
@ -39,41 +42,20 @@
#include "outliner_intern.h" /* own include */
/* -------------------------------------------------------------------- */
/* polls */
static SceneCollection *collection_manager_collection_active(bContext *C)
static LayerCollection *outliner_collection_active(bContext *C)
{
TODO_LAYER_OPERATORS;
/* consider that we may have overrides active
/* consider that we may have overrides or objects active
* leading to no active collections */
return CTX_data_scene_collection(C);
return CTX_data_layer_collection(C);
}
static int operator_not_master_collection_active(bContext *C)
static CollectionOverride *outliner_override_active(bContext *UNUSED(C))
{
SceneCollection *sc = collection_manager_collection_active(C);
if (sc == NULL) {
return 1;
}
return (sc == BKE_collection_master(CTX_data_scene(C))) ? 0 : 1;
}
static int operator_top_collection_active(bContext *C)
{
SceneCollection *sc = collection_manager_collection_active(C);
if (sc == NULL) {
return 0;
}
TODO_LAYER_OPERATORS;
/* see if it's a top collection */
return 1;
}
static int operator_collection_active(bContext *C)
{
return collection_manager_collection_active(C) ? 1 : 0;
TODO_LAYER_OVERRIDE;
return NULL;
}
/* -------------------------------------------------------------------- */
@ -86,11 +68,11 @@ static int collection_link_invoke(bContext *UNUSED(C), wmOperator *op, const wmE
return OPERATOR_CANCELLED;
}
void OUTLINER_OT_collections_link(wmOperatorType *ot)
void OUTLINER_OT_collection_link(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Collection";
ot->idname = "OUTLINER_OT_collections_link";
ot->idname = "OUTLINER_OT_collection_link";
ot->description = "Link a new collection to the active layer";
/* api callbacks */
@ -100,23 +82,48 @@ void OUTLINER_OT_collections_link(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int collection_unlink_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
/**
* Returns true if selected element is a collection directly
* linked to the active SceneLayer (not a nested collection)
*/
static int collection_unlink_poll(bContext *C)
{
TODO_LAYER_OPERATORS;
BKE_report(op->reports, RPT_ERROR, "OUTLINER_OT_collections_unlink not implemented yet");
return OPERATOR_CANCELLED;
LayerCollection *lc = outliner_collection_active(C);
if (lc == NULL) {
return 0;
}
SceneLayer *sl = CTX_data_scene_layer(C);
return BLI_findindex(&sl->layer_collections, lc) != -1 ? 1 : 0;
}
void OUTLINER_OT_collections_unlink(wmOperatorType *ot)
static int collection_unlink_exec(bContext *C, wmOperator *op)
{
LayerCollection *lc = outliner_collection_active(C);
if (lc == NULL) {
BKE_report(op->reports, RPT_ERROR, "Active element is not a collection");
return OPERATOR_CANCELLED;
}
SceneLayer *sl = CTX_data_scene_layer(C);
BKE_collection_unlink(sl, lc);
WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
return OPERATOR_FINISHED;
}
void OUTLINER_OT_collection_unlink(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Collection";
ot->idname = "OUTLINER_OT_collections_unlink";
ot->description = "Link a new collection to the active layer";
ot->idname = "OUTLINER_OT_collection_unlink";
ot->description = "Unlink collection from the active layer";
/* api callbacks */
ot->invoke = collection_unlink_invoke;
ot->poll = operator_top_collection_active;
ot->exec = collection_unlink_exec;
ot->poll = collection_unlink_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@ -134,11 +141,11 @@ static int collection_new_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
void OUTLINER_OT_collections_new(wmOperatorType *ot)
void OUTLINER_OT_collection_new(wmOperatorType *ot)
{
/* identifiers */
ot->name = "New Collection";
ot->idname = "OUTLINER_OT_collections_new";
ot->idname = "OUTLINER_OT_collection_new";
ot->description = "Add a new collection to the scene, and link it to the active layer";
/* api callbacks */
@ -148,7 +155,21 @@ void OUTLINER_OT_collections_new(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int override_new_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
/**
* Returns true is selected element is a collection
*/
static int collection_override_new_poll(bContext *(C))
{
#ifdef TODO_LAYER_OVERRIDE
/* disable for now, since it's not implemented */
(void) C;
return 0;
#else
return outliner_collection_active(C) ? 1 : 0;
#endif
}
static int collection_override_new_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
{
TODO_LAYER_OPERATORS;
TODO_LAYER_OVERRIDE;
@ -156,44 +177,77 @@ static int override_new_invoke(bContext *UNUSED(C), wmOperator *op, const wmEven
return OPERATOR_CANCELLED;
}
void OUTLINER_OT_collections_override_new(wmOperatorType *ot)
/* in the middle of renames remove s */
void OUTLINER_OT_collection_override_new(wmOperatorType *ot)
{
/* identifiers */
ot->name = "New Override";
ot->idname = "OUTLINER_OT_collections_override_new";
ot->idname = "OUTLINER_OT_collection_override_new";
ot->description = "Add a new override to the active collection";
/* api callbacks */
ot->invoke = override_new_invoke;
ot->poll = operator_collection_active;
ot->invoke = collection_override_new_invoke;
ot->poll = collection_override_new_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int delete_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
/**
* Returns true if selected element is a collection
* or an override, but not a master collection
*/
static int collection_delete_poll(bContext *C)
{
TODO_LAYER_OPERATORS;
BKE_report(op->reports, RPT_ERROR, "OUTLINER_OT_collections_delete not implemented yet");
return OPERATOR_CANCELLED;
LayerCollection *lc = outliner_collection_active(C);
if (lc == NULL) {
/* try override */
return outliner_override_active(C) ? 1 : 0;
}
return (lc->scene_collection == BKE_collection_master(CTX_data_scene(C))) ? 0 : 1;
}
void OUTLINER_OT_collections_delete(wmOperatorType *ot)
static int collection_delete_exec(bContext *C, wmOperator *op)
{
Scene *scene = CTX_data_scene(C);
LayerCollection *lc = outliner_collection_active(C);
TODO_LAYER_OVERRIDE; /* handle operators */
if (lc == NULL) {
BKE_report(op->reports, RPT_ERROR, "Active element is not a collection");
return OPERATOR_CANCELLED;
}
if (lc->scene_collection == BKE_collection_master(scene)) {
BKE_report(op->reports, RPT_ERROR, "You cannot delete the master collection, try unliking it instead");
return OPERATOR_CANCELLED;
}
BKE_collection_remove(scene, lc->scene_collection);
WM_main_add_notifier(NC_SCENE | ND_LAYER, NULL);
return OPERATOR_FINISHED;
}
void OUTLINER_OT_collection_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Delete";
ot->idname = "OUTLINER_OT_collections_delete";
ot->description = "Delete active override or collection";
ot->idname = "OUTLINER_OT_collection_delete";
ot->description = "Delete active override or collection";
/* api callbacks */
ot->invoke = delete_invoke;
ot->poll = operator_not_master_collection_active;
ot->exec = collection_delete_exec;
ot->poll = collection_delete_poll;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
static int select_exec(bContext *C, wmOperator *op)
static int collection_select_exec(bContext *C, wmOperator *op)
{
SceneLayer *sl = CTX_data_scene_layer(C);
const int collection_index = RNA_int_get(op->ptr, "collection_index");
@ -202,15 +256,15 @@ static int select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
void OUTLINER_OT_collections_select(wmOperatorType *ot)
void OUTLINER_OT_collection_select(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Select";
ot->idname = "OUTLINER_OT_collections_select";
ot->idname = "OUTLINER_OT_collection_select";
ot->description = "Change active collection or override";
/* api callbacks */
ot->exec = select_exec;
ot->exec = collection_select_exec;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@ -219,28 +273,6 @@ void OUTLINER_OT_collections_select(wmOperatorType *ot)
"Index of collection to select", 0, INT_MAX);
}
static int rename_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
{
TODO_LAYER_OPERATORS;
BKE_report(op->reports, RPT_ERROR, "COLLECTIONS_rename not implemented yet");
return OPERATOR_CANCELLED;
}
void OUTLINER_OT_collections_rename(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Rename";
ot->idname = "OUTLINER_OT_collections_rename";
ot->description = "Rename active collection or override";
/* api callbacks */
ot->invoke = rename_invoke;
ot->poll = operator_not_master_collection_active;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/* -------------------------------------------------------------------- */
static int stubs_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
@ -250,11 +282,11 @@ static int stubs_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUS
return OPERATOR_CANCELLED;
}
void OUTLINER_OT_collections_objects_add(wmOperatorType *ot)
void OUTLINER_OT_collection_objects_add(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Objects";
ot->idname = "OUTLINER_OT_collections_objects_add";
ot->idname = "OUTLINER_OT_collection_objects_add";
ot->description = "Add selected objects to collection";
/* api callbacks */
@ -264,12 +296,12 @@ void OUTLINER_OT_collections_objects_add(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
void OUTLINER_OT_collections_objects_remove(wmOperatorType *ot)
void OUTLINER_OT_collection_objects_remove(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Remove Object";
ot->idname = "OUTLINER_OT_collections_objects_remove";
ot->description = "Remove object from collection";
ot->idname = "OUTLINER_OT_collection_objects_remove";
ot->description = "Remove objects from collection";
/* api callbacks */
ot->invoke = stubs_invoke;
@ -278,12 +310,12 @@ void OUTLINER_OT_collections_objects_remove(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
void OUTLINER_OT_collections_objects_select(wmOperatorType *ot)
void OUTLINER_OT_collection_objects_select(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Select Objects";
ot->idname = "OUTLINER_OT_collections_objects_select";
ot->description = "Selected collection objects";
ot->idname = "OUTLINER_OT_collection_objects_select";
ot->description = "Select collection objects";
/* api callbacks */
ot->invoke = stubs_invoke;
@ -292,12 +324,12 @@ void OUTLINER_OT_collections_objects_select(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
void OUTLINER_OT_collections_objects_deselect(wmOperatorType *ot)
void OUTLINER_OT_collection_objects_deselect(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Deselect Objects";
ot->idname = "OUTLINER_OT_collections_objects_deselect";
ot->description = "Deselected collection objects";
ot->idname = "OUTLINER_OT_collection_objects_deselect";
ot->description = "Deselect collection objects";
/* api callbacks */
ot->invoke = stubs_invoke;
@ -305,4 +337,3 @@ void OUTLINER_OT_collections_objects_deselect(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}

View File

@ -276,17 +276,16 @@ void outliner_keymap(struct wmKeyConfig *keyconf);
/* outliner_collections.c */
void OUTLINER_OT_collections_delete(struct wmOperatorType *ot);
void OUTLINER_OT_collections_select(struct wmOperatorType *ot);
void OUTLINER_OT_collections_rename(struct wmOperatorType *ot);
void OUTLINER_OT_collections_link(struct wmOperatorType *ot);
void OUTLINER_OT_collections_unlink(struct wmOperatorType *ot);
void OUTLINER_OT_collections_new(struct wmOperatorType *ot);
void OUTLINER_OT_collections_override_new(struct wmOperatorType *ot);
void OUTLINER_OT_collections_objects_add(struct wmOperatorType *ot);
void OUTLINER_OT_collections_objects_remove(struct wmOperatorType *ot);
void OUTLINER_OT_collections_objects_select(struct wmOperatorType *ot);
void OUTLINER_OT_collections_objects_deselect(struct wmOperatorType *ot);
void OUTLINER_OT_collection_delete(struct wmOperatorType *ot);
void OUTLINER_OT_collection_select(struct wmOperatorType *ot);
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_override_new(struct wmOperatorType *ot);
void OUTLINER_OT_collection_objects_add(struct wmOperatorType *ot);
void OUTLINER_OT_collection_objects_remove(struct wmOperatorType *ot);
void OUTLINER_OT_collection_objects_select(struct wmOperatorType *ot);
void OUTLINER_OT_collection_objects_deselect(struct wmOperatorType *ot);
#endif /* __OUTLINER_INTERN_H__ */

View File

@ -86,17 +86,16 @@ void outliner_operatortypes(void)
WM_operatortype_append(OUTLINER_OT_group_link);
/* collections */
WM_operatortype_append(OUTLINER_OT_collections_delete);
WM_operatortype_append(OUTLINER_OT_collections_select);
WM_operatortype_append(OUTLINER_OT_collections_rename);
WM_operatortype_append(OUTLINER_OT_collections_link);
WM_operatortype_append(OUTLINER_OT_collections_unlink);
WM_operatortype_append(OUTLINER_OT_collections_new);
WM_operatortype_append(OUTLINER_OT_collections_override_new);
WM_operatortype_append(OUTLINER_OT_collections_objects_add);
WM_operatortype_append(OUTLINER_OT_collections_objects_remove);
WM_operatortype_append(OUTLINER_OT_collections_objects_select);
WM_operatortype_append(OUTLINER_OT_collections_objects_deselect);
WM_operatortype_append(OUTLINER_OT_collection_delete);
WM_operatortype_append(OUTLINER_OT_collection_select);
WM_operatortype_append(OUTLINER_OT_collection_link);
WM_operatortype_append(OUTLINER_OT_collection_unlink);
WM_operatortype_append(OUTLINER_OT_collection_new);
WM_operatortype_append(OUTLINER_OT_collection_override_new);
WM_operatortype_append(OUTLINER_OT_collection_objects_add);
WM_operatortype_append(OUTLINER_OT_collection_objects_remove);
WM_operatortype_append(OUTLINER_OT_collection_objects_select);
WM_operatortype_append(OUTLINER_OT_collection_objects_deselect);
}
void outliner_keymap(wmKeyConfig *keyconf)