From cd154da9732962870339952898499ed1b1c32d93 Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Sun, 29 Nov 2009 22:16:29 +0000 Subject: 1. Extend option for 3d view border select now does something (default True to keep same behavior) 2. Add action parameter to Select_All_Toggle operators, rename to Select_All. Options are Toggle (default), Select, Deselect, Invert (same as select swap). This makes it possible to map separate hotkeys for select all and deselect all. NOTE for Aligorith: I didn't change animation operators for select_all which already had an Invert operator. These should be fixed eventually. --- source/blender/editors/armature/armature_intern.h | 4 +- source/blender/editors/armature/armature_ops.c | 8 +-- source/blender/editors/armature/editarmature.c | 70 ++++++++++++++++------- 3 files changed, 56 insertions(+), 26 deletions(-) (limited to 'source/blender/editors/armature') diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index f53b70120d5..c65d4637dcf 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -45,7 +45,7 @@ void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot); void ARMATURE_OT_parent_set(struct wmOperatorType *ot); void ARMATURE_OT_parent_clear(struct wmOperatorType *ot); -void ARMATURE_OT_select_all_toggle(struct wmOperatorType *ot); +void ARMATURE_OT_select_all(struct wmOperatorType *ot); void ARMATURE_OT_select_inverse(struct wmOperatorType *ot); void ARMATURE_OT_select_hierarchy(struct wmOperatorType *ot); void ARMATURE_OT_select_linked(struct wmOperatorType *ot); @@ -80,7 +80,7 @@ void POSE_OT_scale_clear(struct wmOperatorType *ot); void POSE_OT_copy(struct wmOperatorType *ot); void POSE_OT_paste(struct wmOperatorType *ot); -void POSE_OT_select_all_toggle(struct wmOperatorType *ot); +void POSE_OT_select_all(struct wmOperatorType *ot); void POSE_OT_select_inverse(struct wmOperatorType *ot); void POSE_OT_select_parent(struct wmOperatorType *ot); void POSE_OT_select_hierarchy(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index e3c823283d1..d1c50439c01 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -77,7 +77,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(ARMATURE_OT_parent_set); WM_operatortype_append(ARMATURE_OT_parent_clear); - WM_operatortype_append(ARMATURE_OT_select_all_toggle); + WM_operatortype_append(ARMATURE_OT_select_all); WM_operatortype_append(ARMATURE_OT_select_inverse); WM_operatortype_append(ARMATURE_OT_select_hierarchy); WM_operatortype_append(ARMATURE_OT_select_linked); @@ -120,7 +120,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_copy); WM_operatortype_append(POSE_OT_paste); - WM_operatortype_append(POSE_OT_select_all_toggle); + WM_operatortype_append(POSE_OT_select_all); WM_operatortype_append(POSE_OT_select_inverse); WM_operatortype_append(POSE_OT_select_parent); @@ -219,7 +219,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ARMATURE_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "ARMATURE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ARMATURE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ARMATURE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0); @@ -295,7 +295,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf) kmi= WM_keymap_add_item(keymap, "POSE_OT_paste", VKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "flipped", 1); - WM_keymap_add_item(keymap, "POSE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "POSE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "POSE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "POSE_OT_select_parent", PKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 95b743a7b27..38daa22bbc7 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3993,25 +3993,38 @@ void ARMATURE_OT_select_inverse(wmOperatorType *ot) } static int armature_de_select_all_exec(bContext *C, wmOperator *op) { - int sel=1; + int action = RNA_enum_get(op->ptr, "action"); - /* Determine if there are any selected bones - And therefore whether we are selecting or deselecting */ - if (CTX_DATA_COUNT(C, selected_bones) > 0) sel=0; + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + /* Determine if there are any selected bones + And therefore whether we are selecting or deselecting */ + if (CTX_DATA_COUNT(C, selected_bones) > 0) + action = SEL_DESELECT; + } /* Set the flags */ CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) { /* ignore bone if selection can't change */ if ((ebone->flag & BONE_UNSELECTABLE) == 0) { - if (sel==1) { - /* select bone */ + switch (action) { + case SEL_SELECT: ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); if(ebone->parent) ebone->parent->flag |= (BONE_TIPSEL); - } - else { - /* deselect bone */ + break; + case SEL_DESELECT: ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + break; + case SEL_INVERT: + if (ebone->flag & BONE_SELECTED) { + ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + } else { + ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + if(ebone->parent) + ebone->parent->flag |= (BONE_TIPSEL); + } + break; } } } @@ -4022,12 +4035,12 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void ARMATURE_OT_select_all_toggle(wmOperatorType *ot) +void ARMATURE_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "deselect all editbone"; - ot->idname= "ARMATURE_OT_select_all_toggle"; + ot->idname= "ARMATURE_OT_select_all"; /* api callbacks */ ot->exec= armature_de_select_all_exec; @@ -4036,6 +4049,7 @@ void ARMATURE_OT_select_all_toggle(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + WM_operator_properties_select_all(ot); } /* ********************* select hierarchy operator ************** */ @@ -5077,20 +5091,35 @@ void POSE_OT_select_inverse(wmOperatorType *ot) } static int pose_de_select_all_exec(bContext *C, wmOperator *op) { - int sel=1; + int action = RNA_enum_get(op->ptr, "action"); - /* Determine if there are any selected bones and therefore whether we are selecting or deselecting */ - // NOTE: we have to check for > 1 not > 0, since there is almost always an active bone that can't be cleared... - if (CTX_DATA_COUNT(C, selected_pose_bones) > 1) sel=0; + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + /* Determine if there are any selected bones and therefore whether we are selecting or deselecting */ + // NOTE: we have to check for > 1 not > 0, since there is almost always an active bone that can't be cleared... + if (CTX_DATA_COUNT(C, selected_pose_bones) > 1) + action = SEL_DESELECT; + } /* Set the flags */ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) { /* select pchan only if selectable, but deselect works always */ - if (sel==0) { + switch (action) { + case SEL_SELECT: + if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) + pchan->bone->flag |= BONE_SELECTED; + break; + case SEL_DESELECT: pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL); + break; + case SEL_INVERT: + if (pchan->bone->flag & BONE_SELECTED) { + pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL); + } else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) { + pchan->bone->flag |= BONE_SELECTED; + } + break; } - else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) - pchan->bone->flag |= BONE_SELECTED; } CTX_DATA_END; @@ -5099,12 +5128,12 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void POSE_OT_select_all_toggle(wmOperatorType *ot) +void POSE_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "deselect all bones"; - ot->idname= "POSE_OT_select_all_toggle"; + ot->idname= "POSE_OT_select_all"; /* api callbacks */ ot->exec= pose_de_select_all_exec; @@ -5113,6 +5142,7 @@ void POSE_OT_select_all_toggle(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + WM_operator_properties_select_all(ot); } static int pose_select_parent_exec(bContext *C, wmOperator *op) -- cgit v1.2.3