diff options
author | Nathan Craddock <nzcraddock@gmail.com> | 2020-04-25 05:18:39 +0300 |
---|---|---|
committer | Nathan Craddock <nzcraddock@gmail.com> | 2020-04-25 05:18:39 +0300 |
commit | 5d14463e1aee44a99d37f6d94804c9e8407ee4fd (patch) | |
tree | fb50bf63683289477a3204d131725eeb2872647a /source | |
parent | a8441fc90086bf21dc50dc9dcd6085e0a0674921 (diff) |
Fix: Selection syncing for outliner operators
A few outliner operators that modify selection were not tagging for a
selection sync which led to selection inconsistencies. This adds syncing
for the following operators:
* Duplicating and deleting collections
* Selecting/deselecting collection contents
* Drag and drop
* Object select, deselect, delete, and delete hierarchy
Diffstat (limited to 'source')
4 files changed, 19 insertions, 8 deletions
diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c index 4b6241d45ee..c77ee67b859 100644 --- a/source/blender/editors/space_outliner/outliner_collections.c +++ b/source/blender/editors/space_outliner/outliner_collections.c @@ -377,6 +377,8 @@ static int collection_delete_exec(bContext *C, wmOperator *op) WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active); } + ED_outliner_select_sync_from_object_tag(C); + return OPERATOR_FINISHED; } @@ -458,6 +460,7 @@ static int collection_objects_select_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene); + ED_outliner_select_sync_from_object_tag(C); return OPERATOR_FINISHED; } @@ -580,6 +583,7 @@ static int collection_duplicate_exec(bContext *C, wmOperator *op) DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_SCENE | ND_LAYER, CTX_data_scene(C)); + ED_outliner_select_sync_from_object_tag(C); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.c b/source/blender/editors/space_outliner/outliner_dragdrop.c index b6f5ac25c3c..44e5347dcad 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.c +++ b/source/blender/editors/space_outliner/outliner_dragdrop.c @@ -982,6 +982,8 @@ static int outliner_item_drag_drop_invoke(bContext *C, WM_drag_add_ID(drag, data.drag_id, data.drag_parent); } + ED_outliner_select_sync_from_all_tag(C); + return (OPERATOR_FINISHED | OPERATOR_PASS_THROUGH); } diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c index 3ae100b6209..862418be151 100644 --- a/source/blender/editors/space_outliner/outliner_edit.c +++ b/source/blender/editors/space_outliner/outliner_edit.c @@ -817,6 +817,7 @@ static int outliner_id_paste_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_WINDOW, NULL); BKE_reportf(op->reports, RPT_INFO, "%d data-block(s) pasted", num_pasted); + return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index a6c1594678b..e09e1149e7c 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -1354,6 +1354,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) SpaceOutliner *soops = CTX_wm_space_outliner(C); int event; const char *str = NULL; + bool selection_changed = false; /* check for invalid states */ if (soops == NULL) { @@ -1370,8 +1371,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) } str = "Select Objects"; - DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); - WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); + selection_changed = true; } else if (event == OL_OP_SELECT_HIERARCHY) { Scene *sce = scene; // to be able to delete, scenes are set... @@ -1381,16 +1381,12 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) WM_window_set_active_scene(bmain, C, win, sce); } str = "Select Object Hierarchy"; - DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); - WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); - ED_outliner_select_sync_from_object_tag(C); + selection_changed = true; } else if (event == OL_OP_DESELECT) { outliner_do_object_operation(C, op->reports, scene, soops, &soops->tree, object_deselect_cb); str = "Deselect Objects"; - DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); - WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); - ED_outliner_select_sync_from_object_tag(C); + selection_changed = true; } else if (event == OL_OP_DELETE) { ViewLayer *view_layer = CTX_data_view_layer(C); @@ -1413,6 +1409,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active); } + selection_changed = true; } else if (event == OL_OP_DELETE_HIERARCHY) { ViewLayer *view_layer = CTX_data_view_layer(C); @@ -1449,6 +1446,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active); } + selection_changed = true; } else if (event == OL_OP_REMAP) { outliner_do_libdata_operation(C, op->reports, scene, soops, &soops->tree, id_remap_cb, NULL); @@ -1477,6 +1475,12 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } + if (selection_changed) { + DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); + WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); + ED_outliner_select_sync_from_object_tag(C); + } + ED_undo_push(C, str); return OPERATOR_FINISHED; |