[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55213] trunk/blender/source/blender/ editors/space_outliner: Ouliner: Added recursive setting of (visibility/ selectability) for bones (Edit- and Object-mode)

Gaia Clary gaia.clary at machinimatrix.org
Tue Mar 12 14:03:59 CET 2013


Revision: 55213
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55213
Author:   gaiaclary
Date:     2013-03-12 13:03:58 +0000 (Tue, 12 Mar 2013)
Log Message:
-----------
Ouliner: Added recursive setting of (visibility/selectability) for bones (Edit- and Object-mode)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
    trunk/blender/source/blender/editors/space_outliner/outliner_select.c

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2013-03-12 12:47:57 UTC (rev 55212)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_draw.c	2013-03-12 13:03:58 UTC (rev 55213)
@@ -132,6 +132,45 @@
 
 /* ****************************************************** */
 
+static void restrictbutton_recursive_ebone(bContext *C, EditBone *ebone_parent, int flag, bool set_flag)
+{
+	Object *obedit = CTX_data_edit_object(C);
+	bArmature *arm = obedit->data;
+	EditBone *ebone;
+	
+	for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+		if (ED_armature_ebone_is_child_recursive(ebone_parent, ebone)) {
+			if (set_flag) {
+				ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+				ebone->flag |= flag;
+			}
+			else {
+				if (arm->layer & ebone->layer) {
+					ebone->flag &= ~flag;
+				}
+			}
+		}
+	}
+}
+
+static void restrictbutton_recursive_bone(bContext *C, bArmature *arm, Bone *bone_parent, int flag, bool set_flag)
+{
+	Bone *bone;
+	for (bone = bone_parent->childbase.first; bone; bone = bone->next) {
+		if (set_flag) {
+			bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+			bone->flag |= flag;
+		}
+		else {
+			if (arm->layer & bone->layer) {
+				bone->flag &= ~flag;
+			}
+		}
+		restrictbutton_recursive_bone(C, arm, bone, flag, set_flag);
+	}
+
+}
+
 static void restrictbutton_recursive_child(bContext *C, Scene *scene, Object *ob_parent, char flag,
                                            bool state, bool deselect)
 {
@@ -224,23 +263,63 @@
 	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
 }
 
-static void restrictbutton_bone_cb(bContext *C, void *UNUSED(poin), void *poin2)
+static void restrictbutton_bone_visibility_cb(bContext *C, void *poin, void *poin2)
 {
+	bArmature *arm = (bArmature *)poin;
 	Bone *bone = (Bone *)poin2;
 	if (bone && (bone->flag & BONE_HIDDEN_P))
 		bone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+
+	if (CTX_wm_window(C)->eventstate->ctrl) {
+		restrictbutton_recursive_bone(C, arm, bone, BONE_HIDDEN_P, (bone->flag & BONE_HIDDEN_P) != 0);
+	}
+
 	WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL);
 }
 
-static void restrictbutton_ebone_cb(bContext *C, void *UNUSED(poin), void *poin2)
+static void restrictbutton_bone_select_cb(bContext *C, void *poin, void *poin2)
 {
+	bArmature *arm = (bArmature *)poin;
+	Bone *bone = (Bone *)poin2;
+	if (bone && (bone->flag & BONE_UNSELECTABLE))
+		bone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+
+	if (CTX_wm_window(C)->eventstate->ctrl) {
+		restrictbutton_recursive_bone(C, arm, bone, BONE_UNSELECTABLE, (bone->flag & BONE_UNSELECTABLE) != 0);
+	}
+
+	WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL);
+}
+
+static void restrictbutton_ebone_select_cb(bContext *C, void *poin, void *poin2)
+{
 	EditBone *ebone = (EditBone *)poin2;
-	if (ebone && (ebone->flag & BONE_HIDDEN_A))
+
+	if (ebone->flag & BONE_UNSELECTABLE) {
 		ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+	}
 
+	if (CTX_wm_window(C)->eventstate->ctrl) {
+		restrictbutton_recursive_ebone(C, ebone, BONE_UNSELECTABLE, (ebone->flag & BONE_UNSELECTABLE) != 0);
+	}
+
 	WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL);
 }
 
+static void restrictbutton_ebone_visibility_cb(bContext *C, void *poin, void *poin2)
+{
+	EditBone *ebone = (EditBone *)poin2;
+	if (ebone->flag & BONE_HIDDEN_A) {
+			ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+	}
+
+	if (CTX_wm_window(C)->eventstate->ctrl) {
+		restrictbutton_recursive_ebone(C, ebone, BONE_HIDDEN_A, (ebone->flag & BONE_HIDDEN_A) != 0);
+	}
+
+	WM_event_add_notifier(C, NC_OBJECT | ND_POSE, NULL);
+}
+
 static int group_restrict_flag(Group *gr, int flag)
 {
 	GroupObject *gob;
@@ -564,19 +643,20 @@
 			else if (tselem->type == TSE_POSE_CHANNEL) {
 				bPoseChannel *pchan = (bPoseChannel *)te->directdata;
 				Bone *bone = pchan->bone;
+				ob = (Object *)tselem->id;
 				
 				uiBlockSetEmboss(block, UI_EMBOSSN);
 				bt = uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_P, 0, ICON_RESTRICT_VIEW_OFF,
 				                      (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), (int)te->ys, UI_UNIT_X,
 				                      UI_UNIT_Y, &(bone->flag), 0, 0, 0, 0,
 				                      TIP_("Restrict/Allow visibility in the 3D View"));
-				uiButSetFunc(bt, restrictbutton_bone_cb, NULL, bone);
+				uiButSetFunc(bt, restrictbutton_bone_visibility_cb, ob->data, bone);
 				
 				bt = uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
 				                      (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_SELECTX), (int)te->ys, UI_UNIT_X,
 				                      UI_UNIT_Y, &(bone->flag), 0, 0, 0, 0,
 				                      TIP_("Restrict/Allow selection in the 3D View"));
-				uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
+				uiButSetFunc(bt, restrictbutton_bone_select_cb, ob->data, bone);
 			}
 			else if (tselem->type == TSE_EBONE) {
 				EditBone *ebone = (EditBone *)te->directdata;
@@ -586,13 +666,13 @@
 				                      (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX), (int)te->ys, UI_UNIT_X,
 				                      UI_UNIT_Y, &(ebone->flag), 0, 0, 0, 0,
 				                      TIP_("Restrict/Allow visibility in the 3D View"));
-				uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, ebone);
+				uiButSetFunc(bt, restrictbutton_ebone_visibility_cb, NULL, ebone);
 				
 				bt = uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
 				                      (int)(ar->v2d.cur.xmax - OL_TOG_RESTRICT_SELECTX), (int)te->ys, UI_UNIT_X,
 				                      UI_UNIT_Y, &(ebone->flag), 0, 0, 0, 0,
 				                      TIP_("Restrict/Allow selection in the 3D View"));
-				uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, NULL);
+				uiButSetFunc(bt, restrictbutton_ebone_select_cb, NULL, ebone);
 			}
 		}
 		

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2013-03-12 12:47:57 UTC (rev 55212)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_select.c	2013-03-12 13:03:58 UTC (rev 55213)
@@ -164,10 +164,10 @@
 {
 	Bone *bone;
 	for (bone = bone_parent->childbase.first; bone; bone = bone->next) {
-		if (select && PBONE_VISIBLE(arm, bone))
+		if (select && PBONE_SELECTABLE(arm, bone))
 			bone->flag |= BONE_SELECTED;
 		else
-			bone->flag &= ~BONE_SELECTED;
+			bone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
 		do_outliner_bone_select_recursive(arm, bone, select);
 	}
 }
@@ -177,10 +177,10 @@
 	EditBone *ebone;
 	for (ebone = ebone_parent->next; ebone; ebone = ebone->next) {
 		if (ED_armature_ebone_is_child_recursive(ebone_parent, ebone)) {
-			if (select && EBONE_VISIBLE(arm, ebone))
-				ebone->flag |= BONE_SELECTED;
+			if (select && EBONE_SELECTABLE(arm, ebone))
+				ebone->flag |= BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL;
 			else
-				ebone->flag &= ~BONE_SELECTED;
+				ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
 		}
 	}
 }
@@ -226,7 +226,7 @@
 		}
 
 		if (recursive) {
-			/* Recursive select/deselect */
+			/* Recursive select/deselect for Object hierarchies */
 			do_outliner_object_select_recursive(scene, ob, (ob->flag & SELECT) != 0);
 		}
 
@@ -451,7 +451,7 @@
 	return 0;
 }
 
-static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set, bool recursive)
 {
 	Object *ob = (Object *)tselem->id;
 	bArmature *arm = ob->data;
@@ -470,7 +470,12 @@
 				pchan->bone->flag |= BONE_SELECTED;
 				arm->act_bone = pchan->bone;
 			}
-			
+
+			if (recursive) {
+				/* Recursive select/deselect */
+				do_outliner_bone_select_recursive(arm, pchan->bone, (pchan->bone->flag & BONE_SELECTED) != 0);
+			}
+
 			WM_event_add_notifier(C, NC_OBJECT | ND_BONE_ACTIVE, ob);
 
 		}
@@ -764,7 +769,7 @@
 		case TSE_POSE_BASE:
 			return tree_element_active_pose(C, scene, te, tselem, set);
 		case TSE_POSE_CHANNEL:
-			return tree_element_active_posechannel(C, scene, te, tselem, set);
+			return tree_element_active_posechannel(C, scene, te, tselem, set, recursive);
 		case TSE_CONSTRAINT:
 			return tree_element_active_constraint(C, te, tselem, set);
 		case TSE_R_LAYER:
@@ -817,7 +822,9 @@
 			
 			/* always makes active object */
 			if (tselem->type != TSE_SEQUENCE && tselem->type != TSE_SEQ_STRIP && tselem->type != TSE_SEQUENCE_DUP)
-				tree_element_set_active_object(C, scene, soops, te, 1 + (extend != 0 && tselem->type == 0), recursive);
+				tree_element_set_active_object(C, scene, soops, te,
+											   1 + (extend != 0 && tselem->type == 0),
+											   recursive && tselem->type == 0 );
 			
 			if (tselem->type == 0) { // the lib blocks
 				/* editmode? */




More information about the Bf-blender-cvs mailing list