[Bf-blender-cvs] [28e703b0a10] blender-v2.91-release: Fix Outliner editbone selection with 'Sync Selection'

Philipp Oeser noreply at git.blender.org
Fri Nov 6 10:44:47 CET 2020


Commit: 28e703b0a104f8c8c64dee835d9fd3e657ac86cf
Author: Philipp Oeser
Date:   Thu Nov 5 14:11:01 2020 +0100
Branches: blender-v2.91-release
https://developer.blender.org/rB28e703b0a104f8c8c64dee835d9fd3e657ac86cf

Fix Outliner editbone selection with 'Sync Selection'

When editbones were selected from the Outliner (and they were connected
to a parent) with the 'Sync Selection' option turned ON, they could not
get duplicated.

For duplication to work, the (connected) parent bone's tip also has to
be selected [which was not the case when selection is done from the
Outliner under above circumstances]. The reason being that
armature_duplicate_selected_exec ->
ED_armature_edit_sync_selection clears the BONE_ROOTSEL flag if the
parent bone's BONE_TIPSEL is not set.

Caused by rB71eb65328078 btw.

The correct "parent-tip-selection" would actually happen in activation
- `tree_element_active_ebone`
-- `tree_element_active_ebone__sel`
but for 'Sync Selection' this happens [also] in
- `outliner_sync_selection_from_outliner`
-- `outliner_select_sync_to_edit_bone`
which did not do the "flushing" to the parent bone's tip

Now use existing dedicated function for this.

ref. T82347

Reviewers: Zachman

Differential Revision: https://developer.blender.org/D9470

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

M	source/blender/editors/space_outliner/outliner_select.c
M	source/blender/editors/space_outliner/outliner_sync.c

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

diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index c6b5f2e2d2b..688f6d646ff 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -714,20 +714,9 @@ static eOLDrawState tree_element_active_bone(bContext *C,
 static void tree_element_active_ebone__sel(bContext *C, bArmature *arm, EditBone *ebone, short sel)
 {
   if (sel) {
-    ebone->flag |= BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL;
     arm->act_edbone = ebone;
-    /* Flush to parent? */
-    if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
-      ebone->parent->flag |= BONE_TIPSEL;
-    }
-  }
-  else {
-    ebone->flag &= ~(BONE_SELECTED | BONE_ROOTSEL | BONE_TIPSEL);
-    /* Flush to parent? */
-    if (ebone->parent && (ebone->flag & BONE_CONNECTED)) {
-      ebone->parent->flag &= ~BONE_TIPSEL;
-    }
   }
+  ED_armature_ebone_select_set(ebone, sel);
   WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, CTX_data_edit_object(C));
 }
 static eOLDrawState tree_element_active_ebone(bContext *C,
diff --git a/source/blender/editors/space_outliner/outliner_sync.c b/source/blender/editors/space_outliner/outliner_sync.c
index 3055d15725b..24fa72fdabf 100644
--- a/source/blender/editors/space_outliner/outliner_sync.c
+++ b/source/blender/editors/space_outliner/outliner_sync.c
@@ -252,11 +252,13 @@ static void outliner_select_sync_to_edit_bone(ViewLayer *view_layer,
 
   if (EBONE_SELECTABLE(arm, ebone)) {
     if (tselem->flag & TSE_SELECTED) {
-      ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
-
+      ED_armature_ebone_select_set(ebone, true);
       add_selected_item(selected_ebones, ebone);
     }
     else if (!is_edit_bone_selected(selected_ebones, ebone)) {
+      /* Dont flush to parent bone tip, synced selection is iterating the whole tree so deselecting
+       * potential children with 'ED_armature_ebone_select_set(ebone, false)' would leave own tip
+       * deselected. */
       ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
     }
   }



More information about the Bf-blender-cvs mailing list