[Bf-blender-cvs] [5d14463e1ae] blender-v2.83-release: Fix: Selection syncing for outliner operators

Nathan Craddock noreply at git.blender.org
Sat Apr 25 04:52:05 CEST 2020


Commit: 5d14463e1aee44a99d37f6d94804c9e8407ee4fd
Author: Nathan Craddock
Date:   Fri Apr 24 20:18:39 2020 -0600
Branches: blender-v2.83-release
https://developer.blender.org/rB5d14463e1aee44a99d37f6d94804c9e8407ee4fd

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

===================================================================

M	source/blender/editors/space_outliner/outliner_collections.c
M	source/blender/editors/space_outliner/outliner_dragdrop.c
M	source/blender/editors/space_outliner/outliner_edit.c
M	source/blender/editors/space_outliner/outliner_tools.c

===================================================================

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;



More information about the Bf-blender-cvs mailing list