[Bf-blender-cvs] [ee49ee24c33] master: Fix: unselectable objects can be selected via the NLA editor

Dalai Felinto noreply at git.blender.org
Thu Nov 9 11:37:11 CET 2017


Commit: ee49ee24c33b3bf905603322d35a60d59331a7f7
Author: Dalai Felinto
Date:   Thu Nov 9 08:27:37 2017 -0200
Branches: master
https://developer.blender.org/rBee49ee24c33b3bf905603322d35a60d59331a7f7

Fix: unselectable objects can be selected via the NLA editor

This is not reported anywhere, but it's easy to reproduce. I ran into this
while updating this code for the blender2.8 branch.

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

M	source/blender/editors/animation/anim_channels_edit.c
M	source/blender/editors/space_nla/nla_channels.c

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

diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index 75a6af3819c..25f1e206be5 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -2687,41 +2687,43 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index,
 			AnimData *adt = ob->adt;
 			
 			/* set selection status */
-			if (selectmode == SELECT_INVERT) {
-				/* swap select */
-				base->flag ^= SELECT;
-				ob->flag = base->flag;
-				
-				if (adt) adt->flag ^= ADT_UI_SELECTED;
-			}
-			else {
-				Base *b;
-				
-				/* deselect all */
-				/* TODO: should this deselect all other types of channels too? */
-				for (b = sce->base.first; b; b = b->next) {
-					b->flag &= ~SELECT;
-					b->object->flag = b->flag;
-					if (b->object->adt) b->object->adt->flag &= ~(ADT_UI_SELECTED | ADT_UI_ACTIVE);
+			if ((ob->restrictflag & OB_RESTRICT_SELECT) == 0) {
+				if (selectmode == SELECT_INVERT) {
+					/* swap select */
+					base->flag ^= SELECT;
+					ob->flag = base->flag;
+
+					if (adt) adt->flag ^= ADT_UI_SELECTED;
 				}
-				
-				/* select object now */
-				base->flag |= SELECT;
-				ob->flag |= SELECT;
-				if (adt) adt->flag |= ADT_UI_SELECTED;
+				else {
+					Base *b;
+
+					/* deselect all */
+					/* TODO: should this deselect all other types of channels too? */
+					for (b = sce->base.first; b; b = b->next) {
+						b->flag &= ~SELECT;
+						b->object->flag = b->flag;
+						if (b->object->adt) b->object->adt->flag &= ~(ADT_UI_SELECTED | ADT_UI_ACTIVE);
+					}
+
+					/* select object now */
+					base->flag |= SELECT;
+					ob->flag |= SELECT;
+					if (adt) adt->flag |= ADT_UI_SELECTED;
+				}
+
+				/* change active object - regardless of whether it is now selected [T37883] */
+				ED_base_object_activate(C, base); /* adds notifier */
+
+				if ((adt) && (adt->flag & ADT_UI_SELECTED))
+					adt->flag |= ADT_UI_ACTIVE;
+
+				/* ensure we exit editmode on whatever object was active before to avoid getting stuck there - T48747 */
+				if (ob != sce->obedit)
+					ED_object_editmode_exit(C, EM_FREEDATA | EM_FREEUNDO | EM_WAITCURSOR | EM_DO_UNDO);
+
+				notifierFlags |= (ND_ANIMCHAN | NA_SELECTED);
 			}
-			
-			/* change active object - regardless of whether it is now selected [T37883] */
-			ED_base_object_activate(C, base); /* adds notifier */
-			
-			if ((adt) && (adt->flag & ADT_UI_SELECTED))
-				adt->flag |= ADT_UI_ACTIVE;
-			
-			/* ensure we exit editmode on whatever object was active before to avoid getting stuck there - T48747 */
-			if (ob != sce->obedit)
-				ED_object_editmode_exit(C, EM_FREEDATA | EM_FREEUNDO | EM_WAITCURSOR | EM_DO_UNDO);
-			
-			notifierFlags |= (ND_ANIMCHAN | NA_SELECTED);
 			break;
 		}
 		case ANIMTYPE_FILLACTD: /* Action Expander */
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index e9c46e9d04b..c261821db16 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -129,7 +129,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe
 			Object *ob = base->object;
 			AnimData *adt = ob->adt;
 			
-			if (nlaedit_is_tweakmode_on(ac) == 0) {
+			if (nlaedit_is_tweakmode_on(ac) == 0 && (ob->restrictflag & OB_RESTRICT_SELECT) == 0) {
 				/* set selection status */
 				if (selectmode == SELECT_INVERT) {
 					/* swap select */



More information about the Bf-blender-cvs mailing list