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/animation/anim_markers.c | 51 +++++++------- source/blender/editors/armature/armature_intern.h | 4 +- source/blender/editors/armature/armature_ops.c | 8 +-- source/blender/editors/armature/editarmature.c | 70 ++++++++++++------ source/blender/editors/curve/curve_intern.h | 2 +- source/blender/editors/curve/curve_ops.c | 4 +- source/blender/editors/curve/editcurve.c | 82 +++++++++++++++++++--- source/blender/editors/include/ED_curve.h | 4 ++ source/blender/editors/include/ED_mesh.h | 5 +- source/blender/editors/include/ED_object.h | 4 ++ source/blender/editors/include/ED_particle.h | 2 +- source/blender/editors/mesh/editface.c | 50 ++++++++----- source/blender/editors/mesh/editmesh_mods.c | 33 +++++++-- source/blender/editors/mesh/mesh_intern.h | 2 +- source/blender/editors/mesh/mesh_ops.c | 4 +- source/blender/editors/metaball/mball_edit.c | 46 +++++++----- source/blender/editors/metaball/mball_intern.h | 2 +- source/blender/editors/metaball/mball_ops.c | 4 +- source/blender/editors/object/object_intern.h | 4 +- source/blender/editors/object/object_lattice.c | 70 ++++++++++++------ source/blender/editors/object/object_ops.c | 8 +-- source/blender/editors/object/object_select.c | 55 +++++++++------ source/blender/editors/physics/particle_edit.c | 69 +++++++++++++----- source/blender/editors/physics/physics_intern.h | 2 +- source/blender/editors/physics/physics_ops.c | 4 +- source/blender/editors/sculpt_paint/paint_intern.h | 2 +- source/blender/editors/sculpt_paint/paint_ops.c | 4 +- source/blender/editors/sculpt_paint/paint_utils.c | 16 +++-- .../blender/editors/space_view3d/view3d_select.c | 70 +++++++++++++++--- source/blender/editors/uvedit/uvedit_ops.c | 77 ++++++++++++++------ source/blender/windowmanager/WM_api.h | 7 ++ source/blender/windowmanager/intern/wm_operators.c | 14 +++- 32 files changed, 558 insertions(+), 221 deletions(-) (limited to 'source') diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index 463518a32ff..721fa928e44 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -878,27 +878,37 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); TimeMarker *marker; - int select= RNA_int_get(op->ptr, "select_type"); + int action = RNA_enum_get(op->ptr, "action"); if(markers == NULL) return OPERATOR_CANCELLED; - - if(RNA_boolean_get(op->ptr, "select_swap")) { + + if (action == SEL_TOGGLE) { + action = SEL_SELECT; for(marker= markers->first; marker; marker= marker->next) { - if(marker->flag & SELECT) + if(marker->flag & SELECT) { + action = SEL_DESELECT; break; + } } - if(marker) - select= 0; - else - select= 1; } for(marker= markers->first; marker; marker= marker->next) { - if(select) + switch (action) { + case SEL_SELECT: marker->flag |= SELECT; - else + break; + case SEL_DESELECT: marker->flag &= ~SELECT; + break; + case SEL_INVERT: + if (marker->flag & SELECT) { + marker->flag &= ~SELECT; + } else { + marker->flag |= SELECT; + } + break; + } } WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); @@ -906,31 +916,22 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static int ed_marker_select_all_invoke(bContext *C, wmOperator *op, wmEvent *evt) -{ - RNA_boolean_set(op->ptr, "select_swap", 1); - - return ed_marker_select_all_exec(C, op); -} - -static void MARKER_OT_select_all_toggle(wmOperatorType *ot) +static void MARKER_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "(De)select all markers"; - ot->description= "(de)select all time markers."; - ot->idname= "MARKER_OT_select_all_toggle"; + ot->description= "Change selection of all time markers."; + ot->idname= "MARKER_OT_select_all"; /* api callbacks */ ot->exec= ed_marker_select_all_exec; - ot->invoke= ed_marker_select_all_invoke; ot->poll= ED_operator_areaactive; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - RNA_def_boolean(ot->srna, "select_swap", 0, "Select Swap", ""); - RNA_def_int(ot->srna, "select_type", 0, INT_MIN, INT_MAX, "Select Type", "", INT_MIN, INT_MAX); + WM_operator_properties_select_all(ot); } /* ******************************* remove marker ***************** */ @@ -987,7 +988,7 @@ void ED_operatortypes_marker(void) WM_operatortype_append(MARKER_OT_duplicate); WM_operatortype_append(MARKER_OT_select); WM_operatortype_append(MARKER_OT_select_border); - WM_operatortype_append(MARKER_OT_select_all_toggle); + WM_operatortype_append(MARKER_OT_select_all); WM_operatortype_append(MARKER_OT_delete); } @@ -1002,7 +1003,7 @@ void ED_marker_keymap(wmKeyConfig *keyconf) WM_keymap_verify_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); WM_keymap_verify_item(keymap, "MARKER_OT_select_border", BKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "MARKER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0); 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) diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index ad3e9427861..6c477bd011a 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -84,7 +84,7 @@ void CURVE_OT_smooth_radius(struct wmOperatorType *ot); void CURVE_OT_de_select_first(struct wmOperatorType *ot); void CURVE_OT_de_select_last(struct wmOperatorType *ot); -void CURVE_OT_select_all_toggle(struct wmOperatorType *ot); +void CURVE_OT_select_all(struct wmOperatorType *ot); void CURVE_OT_select_inverse(struct wmOperatorType *ot); void CURVE_OT_select_linked(struct wmOperatorType *ot); void CURVE_OT_select_row(struct wmOperatorType *ot); diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 15ff971b9cf..c54739902d0 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -139,7 +139,7 @@ void ED_operatortypes_curve(void) WM_operatortype_append(CURVE_OT_de_select_first); WM_operatortype_append(CURVE_OT_de_select_last); - WM_operatortype_append(CURVE_OT_select_all_toggle); + WM_operatortype_append(CURVE_OT_select_all); WM_operatortype_append(CURVE_OT_select_inverse); WM_operatortype_append(CURVE_OT_select_linked); WM_operatortype_append(CURVE_OT_select_row); @@ -222,7 +222,7 @@ void ED_keymap_curve(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OBJECT_OT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", LEFTMOUSE, KM_CLICK, KM_CTRL, 0); - WM_keymap_add_item(keymap, "CURVE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_row", RKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index e53b419c6ea..a65e1164a27 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -83,6 +83,9 @@ #include "RNA_access.h" #include "RNA_define.h" +void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus); +static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short selstatus); + /* still need to eradicate a few :( */ #define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name) @@ -363,6 +366,26 @@ void free_editNurb(Object *obedit) } } +void CU_deselect_all(Object *obedit) +{ + ListBase *editnurb= curve_get_editcurve(obedit); + + if (editnurb) { + selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */ + select_adjacent_cp(editnurb, 1, 1, DESELECT); /* cascade selection */ + } +} + +void CU_select_all(Object *obedit) +{ + ListBase *editnurb= curve_get_editcurve(obedit); + + if (editnurb) { + selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */ + select_adjacent_cp(editnurb, 1, 1, DESELECT); /* cascade selection */ + } +} + /******************** separate operator ***********************/ static int separate_exec(bContext *C, wmOperator *op) @@ -1580,26 +1603,67 @@ static int de_select_all_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); ListBase *editnurb= curve_get_editcurve(obedit); + int action = RNA_enum_get(op->ptr, "action"); - if(nurb_has_selected_cps(editnurb)) { /* deselect all */ - selectend_nurb(obedit, FIRST, 0, DESELECT); /* set first control points as unselected */ - select_adjacent_cp(editnurb, 1, 1, DESELECT); /* cascade selection */ + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + if(nurb_has_selected_cps(editnurb)) + action = SEL_DESELECT; + } + + switch (action) { + case SEL_SELECT: + CU_select_all(obedit); + break; + case SEL_DESELECT: + CU_deselect_all(obedit); + break; + case SEL_INVERT: + { + Curve *cu= obedit->data; + Nurb *nu; + BPoint *bp; + BezTriple *bezt; + int a; + + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->type == CU_BEZIER) { + bezt= nu->bezt; + a= nu->pntsu; + while(a--) { + if(bezt->hide==0) { + bezt->f2 ^= SELECT; /* always do the center point */ + if((cu->drawflag & CU_HIDE_HANDLES)==0) { + bezt->f1 ^= SELECT; + bezt->f3 ^= SELECT; + } + } + bezt++; + } + } + else { + bp= nu->bp; + a= nu->pntsu*nu->pntsv; + while(a--) { + swap_selection_bpoint(bp); + bp++; + } + } + } + break; + } } - else { /* select all */ - selectend_nurb(obedit, FIRST, 0, SELECT); /* set first control points as selected */ - select_adjacent_cp(editnurb, 1, 1, SELECT); /* cascade selection */ - } WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); return OPERATOR_FINISHED; } -void CURVE_OT_select_all_toggle(wmOperatorType *ot) +void CURVE_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select or Deselect All"; - ot->idname= "CURVE_OT_select_all_toggle"; + ot->idname= "CURVE_OT_select_all"; /* api callbacks */ ot->exec= de_select_all_exec; diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index 66a481ca5ac..3166f77815c 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -43,6 +43,10 @@ void ED_operatortypes_curve(void); void ED_keymap_curve (struct wmKeyConfig *keyconf); /* editcurve.c */ +void CU_deselect_all(struct Object *obedit); +void CU_select_all(struct Object *obedit); + + void undo_push_curve (struct bContext *C, char *name); ListBase *curve_get_editcurve(struct Object *ob); diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index ba26104a555..58f4a566ff7 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -126,6 +126,7 @@ void EM_select_face_fgon(struct EditMesh *em, struct EditFace *efa, int val); void EM_select_swap(struct EditMesh *em); void EM_toggle_select_all(struct EditMesh *em); void EM_select_all(struct EditMesh *em); +void EM_deselect_all(struct EditMesh *em); void EM_selectmode_flush(struct EditMesh *em); void EM_deselect_flush(struct EditMesh *em); void EM_selectmode_set(struct EditMesh *em); @@ -168,8 +169,8 @@ void EM_automerge(struct Scene *scene, struct Object *obedit, int update); /* editface.c */ struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy); int face_select(struct bContext *C, struct Object *ob, short mval[2], int extend); -void face_borderselect(struct bContext *C, struct Object *ob, struct rcti *rect, int select); -void deselectall_tface(struct Object *ob); +void face_borderselect(struct bContext *C, struct Object *ob, struct rcti *rect, int select, int extend); +void selectall_tface(struct Object *ob, int action); void select_linked_tfaces(struct bContext *C, struct Object *ob, short mval[2], int mode); /* object_vgroup.c */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 69b478c6dfa..1b77d298e3a 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -115,6 +115,10 @@ void latt_to_key(struct Lattice *lt, struct KeyBlock *kb); void key_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb); void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb); +/* object_lattice.c */ + +void ED_setflagsLatt(struct Object *obedit, int flag); + /* object_modifier.c */ enum { MODIFIER_APPLY_DATA=1, diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h index fcdaf8cb59d..6dd54fd9b1a 100644 --- a/source/blender/editors/include/ED_particle.h +++ b/source/blender/editors/include/ED_particle.h @@ -57,7 +57,7 @@ void PE_update_object(struct Scene *scene, struct Object *ob, int useflag); /* selection tools */ int PE_mouse_particles(struct bContext *C, short *mval, int extend); -int PE_border_select(struct bContext *C, struct rcti *rect, int select); +int PE_border_select(struct bContext *C, struct rcti *rect, int select, int extend); int PE_circle_select(struct bContext *C, int selecting, short *mval, float rad); int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short select); diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 5d94fb32438..d034fe4a783 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -378,34 +378,44 @@ void select_linked_tfaces(bContext *C, Object *ob, short mval[2], int mode) object_facesel_flush_dm(ob); } -void deselectall_tface(Object *ob) +void selectall_tface(Object *ob, int action) { Mesh *me; MFace *mface; - int a, sel; + int a; me= get_mesh(ob); if(me==0) return; - mface= me->mface; - a= me->totface; - sel= 0; - while(a--) { - if(mface->flag & ME_HIDE); - else if(mface->flag & ME_FACE_SEL) { - sel= 1; - break; + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + + mface= me->mface; + a= me->totface; + while(a--) { + if((mface->flag & ME_HIDE) == 0 && mface->flag & ME_FACE_SEL) { + action = SEL_DESELECT; + break; + } + mface++; } - mface++; } mface= me->mface; a= me->totface; while(a--) { - if(mface->flag & ME_HIDE); - else { - if(sel) mface->flag &= ~ME_FACE_SEL; - else mface->flag |= ME_FACE_SEL; + if((mface->flag & ME_HIDE) == 0) { + switch (action) { + case SEL_SELECT: + mface->flag |= ME_FACE_SEL; + break; + case SEL_DESELECT: + mface->flag &= ~ME_FACE_SEL; + break; + case SEL_INVERT: + mface->flag ^= ME_FACE_SEL; + break; + } } mface++; } @@ -815,7 +825,7 @@ int face_select(struct bContext *C, Object *ob, short mval[2], int extend) return 1; } -void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select) +void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, int extend) { Mesh *me; MFace *mface; @@ -837,6 +847,14 @@ void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select) sy= (rect->ymax-rect->ymin+1); if(sx*sy<=0) return; + if (extend == 0 && select) { + mface= me->mface; + for(a=1; a<=me->totface; a++, mface++) { + if((mface->flag & ME_HIDE) == 0) + mface->flag &= ~ME_FACE_SEL; + } + } + view3d_validate_backbuf(&vc); ibuf = IMB_allocImBuf(sx,sy,32,IB_rect,0); diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 8501b7fba92..c79ef342150 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -3372,12 +3372,31 @@ void EM_select_all(EditMesh *em) EM_set_flag_all(em, SELECT); } -static int toggle_select_all_exec(bContext *C, wmOperator *op) +void EM_deselect_all(EditMesh *em) +{ + EM_clear_flag_all(em, SELECT); +} + +static int select_all_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); + int action = RNA_enum_get(op->ptr, "action"); - EM_toggle_select_all(em); + switch (action) { + case SEL_TOGGLE: + EM_toggle_select_all(em); + break; + case SEL_SELECT: + EM_select_all(em); + break; + case SEL_DESELECT: + EM_deselect_all(em); + break; + case SEL_INVERT: + EM_select_swap(em); + break; + } WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); BKE_mesh_end_editmesh(obedit->data, em); @@ -3385,19 +3404,21 @@ static int toggle_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void MESH_OT_select_all_toggle(wmOperatorType *ot) +void MESH_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select/Deselect All"; - ot->description= "(de)select all vertices, edges or faces."; - ot->idname= "MESH_OT_select_all_toggle"; + ot->description= "Change selection of all vertices, edges or faces."; + ot->idname= "MESH_OT_select_all"; /* api callbacks */ - ot->exec= toggle_select_all_exec; + ot->exec= select_all_exec; ot->poll= ED_operator_editmesh; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } /* ******************** **************** */ diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 3f79b9b4370..4ce9afaf237 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -141,7 +141,7 @@ void MESH_OT_knife_cut(struct wmOperatorType *ot); /* ******************* editmesh_mods.c */ void MESH_OT_loop_select(struct wmOperatorType *ot); -void MESH_OT_select_all_toggle(struct wmOperatorType *ot); +void MESH_OT_select_all(struct wmOperatorType *ot); void MESH_OT_select_more(struct wmOperatorType *ot); void MESH_OT_select_less(struct wmOperatorType *ot); void MESH_OT_select_inverse(struct wmOperatorType *ot); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 1363d8b2102..866638d2f20 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -68,7 +68,7 @@ void ED_operatortypes_mesh(void) { - WM_operatortype_append(MESH_OT_select_all_toggle); + WM_operatortype_append(MESH_OT_select_all); WM_operatortype_append(MESH_OT_select_more); WM_operatortype_append(MESH_OT_select_less); WM_operatortype_append(MESH_OT_select_inverse); @@ -222,7 +222,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MESH_OT_select_shortest_path", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "MESH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MESH_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index 09200514c0f..d4ad833d11e 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -189,49 +189,63 @@ MetaElem *add_metaball_primitive(bContext *C, int type, int newname) /***************************** Select/Deselect operator *****************************/ /* Select or deselect all MetaElements */ -static int select_deselect_all_metaelems_exec(bContext *C, wmOperator *op) +static int select_all_exec(bContext *C, wmOperator *op) { //Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); MetaBall *mb = (MetaBall*)obedit->data; MetaElem *ml; - int any_sel= 0; - - /* Is any metaelem selected? */ + int action = RNA_enum_get(op->ptr, "action"); + ml= mb->editelems->first; if(ml) { - while(ml) { - if(ml->flag & SELECT) break; - ml= ml->next; + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + while(ml) { + if(ml->flag & SELECT) { + action = SEL_DESELECT; + break; + } + ml= ml->next; + } } - if(ml) any_sel= 1; ml= mb->editelems->first; while(ml) { - if(any_sel) ml->flag &= ~SELECT; - else ml->flag |= SELECT; + switch (action) { + case SEL_SELECT: + ml->flag |= SELECT; + break; + case SEL_DESELECT: + ml->flag &= ~SELECT; + break; + case SEL_INVERT: + ml->flag ^= SELECT; + break; + } ml= ml->next; } WM_event_add_notifier(C, NC_GEOM|ND_SELECT, mb); - //DAG_id_flush_update(obedit->data, OB_RECALC_DATA); } return OPERATOR_FINISHED; } -void MBALL_OT_select_deselect_all_metaelems(wmOperatorType *ot) +void MBALL_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select/Deselect All"; - ot->description= "(de)select all metaelements."; - ot->idname= "MBALL_OT_select_deselect_all_metaelems"; + ot->description= "Change selection of all meta elements."; + ot->idname= "MBALL_OT_select_all"; /* callback functions */ - ot->exec= select_deselect_all_metaelems_exec; + ot->exec= select_all_exec; ot->poll= ED_operator_editmball; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } /***************************** Select inverse operator *****************************/ diff --git a/source/blender/editors/metaball/mball_intern.h b/source/blender/editors/metaball/mball_intern.h index 8cf749733dd..fca9fc7e650 100644 --- a/source/blender/editors/metaball/mball_intern.h +++ b/source/blender/editors/metaball/mball_intern.h @@ -39,7 +39,7 @@ void MBALL_OT_reveal_metaelems(struct wmOperatorType *ot); void MBALL_OT_delete_metaelems(struct wmOperatorType *ot); void MBALL_OT_duplicate_metaelems(struct wmOperatorType *ot); -void MBALL_OT_select_deselect_all_metaelems(struct wmOperatorType *ot); +void MBALL_OT_select_all(struct wmOperatorType *ot); void MBALL_OT_select_inverse_metaelems(struct wmOperatorType *ot); void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot); diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 01da90212a0..b638eaecbc2 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -46,7 +46,7 @@ void ED_operatortypes_metaball(void) WM_operatortype_append(MBALL_OT_hide_metaelems); WM_operatortype_append(MBALL_OT_reveal_metaelems); - WM_operatortype_append(MBALL_OT_select_deselect_all_metaelems); + WM_operatortype_append(MBALL_OT_select_all); WM_operatortype_append(MBALL_OT_select_inverse_metaelems); WM_operatortype_append(MBALL_OT_select_random_metaelems); } @@ -68,7 +68,7 @@ void ED_keymap_metaball(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MBALL_OT_duplicate_metaelems", DKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "MBALL_OT_select_deselect_all_metaelems", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "MBALL_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MBALL_OT_select_inverse_metaelems", IKEY, KM_PRESS, KM_CTRL, 0); } diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 9230dca7ba2..ebd8261f207 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -81,7 +81,7 @@ void OBJECT_OT_shade_smooth(struct wmOperatorType *ot); void OBJECT_OT_shade_flat(struct wmOperatorType *ot); /* object_select.c */ -void OBJECT_OT_select_all_toggle(struct wmOperatorType *ot); +void OBJECT_OT_select_all(struct wmOperatorType *ot); void OBJECT_OT_select_inverse(struct wmOperatorType *ot); void OBJECT_OT_select_random(struct wmOperatorType *ot); void OBJECT_OT_select_by_type(struct wmOperatorType *ot); @@ -124,7 +124,7 @@ void make_editLatt(Object *obedit); void load_editLatt(Object *obedit); void remake_editLatt(Object *obedit); -void LATTICE_OT_select_all_toggle(struct wmOperatorType *ot); +void LATTICE_OT_select_all(struct wmOperatorType *ot); void LATTICE_OT_make_regular(struct wmOperatorType *ot); /* object_group.c */ diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 3f27ea407a2..1cda843845a 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -38,6 +38,8 @@ #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "RNA_access.h" + #include "BKE_context.h" #include "BKE_depsgraph.h" #include "BKE_key.h" @@ -154,7 +156,7 @@ void load_editLatt(Object *obedit) /************************** Operators *************************/ -static void setflagsLatt(Object *obedit, int flag) +void ED_setflagsLatt(Object *obedit, int flag) { Lattice *lt= obedit->data; BPoint *bp; @@ -172,49 +174,71 @@ static void setflagsLatt(Object *obedit, int flag) } } -int de_select_all_exec(bContext *C, wmOperator *op) +int select_all_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); Lattice *lt= obedit->data; BPoint *bp; - int a, deselect= 0; - - bp= lt->editlatt->def; - a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw; - - while(a--) { - if(bp->hide==0) { - if(bp->f1) { - deselect= 1; - break; + int a; + int action = RNA_enum_get(op->ptr, "action"); + + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + + bp= lt->editlatt->def; + a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw; + + while(a--) { + if(bp->hide==0) { + if(bp->f1) { + action = SEL_DESELECT; + break; + } } + bp++; } - bp++; } - if(deselect) - setflagsLatt(obedit, 0); - else - setflagsLatt(obedit, 1); - + switch (action) { + case SEL_SELECT: + ED_setflagsLatt(obedit, 1); + break; + case SEL_DESELECT: + ED_setflagsLatt(obedit, 0); + break; + case SEL_INVERT: + bp= lt->editlatt->def; + a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw; + + while(a--) { + if(bp->hide==0) { + bp->f1 ^= 1; + } + bp++; + } + break; + } + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); return OPERATOR_FINISHED; } -void LATTICE_OT_select_all_toggle(wmOperatorType *ot) +void LATTICE_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select or Deselect All"; - ot->description= "Toggle (de)select all UVW control points."; - ot->idname= "LATTICE_OT_select_all_toggle"; + ot->description= "Change selection of all UVW control points."; + ot->idname= "LATTICE_OT_select_all"; /* api callbacks */ - ot->exec= de_select_all_exec; + ot->exec= select_all_exec; ot->poll= ED_operator_editlattice; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } int make_regular_poll(bContext *C) @@ -308,7 +332,7 @@ int mouse_lattice(bContext *C, short mval[2], int extend) if(bp) { if(extend==0) { - setflagsLatt(vc.obedit, 0); + ED_setflagsLatt(vc.obedit, 0); bp->f1 |= SELECT; } else diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 4dcecc92880..8d407b0e571 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -98,7 +98,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_select_inverse); WM_operatortype_append(OBJECT_OT_select_random); - WM_operatortype_append(OBJECT_OT_select_all_toggle); + WM_operatortype_append(OBJECT_OT_select_all); WM_operatortype_append(OBJECT_OT_select_by_type); WM_operatortype_append(OBJECT_OT_select_by_layer); WM_operatortype_append(OBJECT_OT_select_linked); @@ -180,7 +180,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_shape_key_mirror); WM_operatortype_append(OBJECT_OT_shape_key_move); - WM_operatortype_append(LATTICE_OT_select_all_toggle); + WM_operatortype_append(LATTICE_OT_select_all); WM_operatortype_append(LATTICE_OT_make_regular); WM_operatortype_append(OBJECT_OT_group_add); @@ -261,7 +261,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) /* object mode supports PET now */ ED_object_generic_keymap(keyconf, keymap, TRUE); - WM_keymap_add_item(keymap, "OBJECT_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "OBJECT_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "OBJECT_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0); @@ -329,7 +329,7 @@ void ED_keymap_object(wmKeyConfig *keyconf) keymap= WM_keymap_find(keyconf, "Lattice", 0, 0); keymap->poll= ED_operator_editlattice; - WM_keymap_add_item(keymap, "LATTICE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "LATTICE_OT_select_all", AKEY, KM_PRESS, 0, 0); /* menus */ WM_keymap_add_menu(keymap, "VIEW3D_MT_hook", HKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 20f3ea3df9e..5366446c8ae 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -707,49 +707,64 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot) /**************************** (De)select All ****************************/ -static int object_select_de_select_all_exec(bContext *C, wmOperator *op) +static int object_select_all_exec(bContext *C, wmOperator *op) { + int action = RNA_enum_get(op->ptr, "action"); - int a=0, ok=0; - - CTX_DATA_BEGIN(C, Base*, base, visible_bases) { - if (base->flag & SELECT) { - ok= a= 1; - break; + /* passthrough if no objects are visible */ + if (CTX_DATA_COUNT(C, visible_bases) == 0) return OPERATOR_PASS_THROUGH; + + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + CTX_DATA_BEGIN(C, Base*, base, visible_bases) { + if (base->flag & SELECT) { + action = SEL_DESELECT; + break; + } } - else ok=1; + CTX_DATA_END; } - CTX_DATA_END; - - if (!ok) return OPERATOR_PASS_THROUGH; - + CTX_DATA_BEGIN(C, Base*, base, visible_bases) { - if (a) ED_base_object_select(base, BA_DESELECT); - else ED_base_object_select(base, BA_SELECT); + switch (action) { + case SEL_SELECT: + ED_base_object_select(base, BA_SELECT); + break; + case SEL_DESELECT: + ED_base_object_select(base, BA_DESELECT); + break; + case SEL_INVERT: + if (base->flag & SELECT) { + ED_base_object_select(base, BA_DESELECT); + } else { + ED_base_object_select(base, BA_SELECT); + } + break; + } } CTX_DATA_END; - /* undo? */ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C)); return OPERATOR_FINISHED; } -void OBJECT_OT_select_all_toggle(wmOperatorType *ot) +void OBJECT_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "deselect all"; - ot->description = "(de)select all visible objects in scene."; - ot->idname= "OBJECT_OT_select_all_toggle"; + ot->description = "Change selection of all visible objects in scene."; + ot->idname= "OBJECT_OT_select_all"; /* api callbacks */ - ot->exec= object_select_de_select_all_exec; + ot->exec= object_select_all_exec; ot->poll= ED_operator_scene_editable; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - + + WM_operator_properties_select_all(ot); } /**************************** Select Mirror ****************************/ diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index b5007ff72ce..68e673c31b1 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -1261,29 +1261,51 @@ static void toggle_key_select(PEData *data, int point_index, int key_index) /************************ de select all operator ************************/ -static int de_select_all_exec(bContext *C, wmOperator *op) +static int select_all_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); PTCacheEdit *edit= PE_get_current(scene, ob); POINT_P; KEY_K; - int sel= 0; - - LOOP_VISIBLE_POINTS { - LOOP_SELECTED_KEYS { - sel= 1; - key->flag &= ~PEK_SELECT; - point->flag |= PEP_EDIT_RECALC; + int action = RNA_enum_get(op->ptr, "action"); + + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + LOOP_VISIBLE_POINTS { + LOOP_SELECTED_KEYS { + action = SEL_DESELECT; + break; + } + + if (action == SEL_DESELECT) + break; } } - if(sel==0) { - LOOP_VISIBLE_POINTS { - LOOP_KEYS { - if(!(key->flag & PEK_SELECT)) { + LOOP_VISIBLE_POINTS { + LOOP_VISIBLE_KEYS { + switch (action) { + case SEL_SELECT: + if ((key->flag & PEK_SELECT) == 0) { key->flag |= PEK_SELECT; point->flag |= PEP_EDIT_RECALC; } + break; + case SEL_DESELECT: + if (key->flag & PEK_SELECT) { + key->flag &= ~PEK_SELECT; + point->flag |= PEP_EDIT_RECALC; + } + break; + case SEL_INVERT: + if ((key->flag & PEK_SELECT) == 0) { + key->flag |= PEK_SELECT; + point->flag |= PEP_EDIT_RECALC; + } else { + key->flag &= ~PEK_SELECT; + point->flag |= PEP_EDIT_RECALC; + } + break; } } } @@ -1294,18 +1316,20 @@ static int de_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void PARTICLE_OT_select_all_toggle(wmOperatorType *ot) +void PARTICLE_OT_select_all(wmOperatorType *ot) { /* identifiers */ - ot->name= "Select or Deselect All"; - ot->idname= "PARTICLE_OT_select_all_toggle"; + ot->name= "Selection of all particles"; + ot->idname= "PARTICLE_OT_select_all"; /* api callbacks */ - ot->exec= de_select_all_exec; + ot->exec= select_all_exec; ot->poll= PE_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } /************************ pick select operator ************************/ @@ -1472,7 +1496,7 @@ void PARTICLE_OT_select_linked(wmOperatorType *ot) /************************ border select operator ************************/ -int PE_border_select(bContext *C, rcti *rect, int select) +int PE_border_select(bContext *C, rcti *rect, int select, int extend) { Scene *scene= CTX_data_scene(C); Object *ob= CTX_data_active_object(C); @@ -1482,6 +1506,17 @@ int PE_border_select(bContext *C, rcti *rect, int select) if(!PE_start_edit(edit)) return OPERATOR_CANCELLED; + if (extend == 0 && select) { + POINT_P; KEY_K; + + LOOP_VISIBLE_POINTS { + LOOP_SELECTED_KEYS { + key->flag &= ~PEK_SELECT; + point->flag |= PEP_EDIT_RECALC; + } + } + } + PE_set_view3d_data(C, &data); data.rect= rect; data.select= select; diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h index e7543cbb83e..085332b1788 100644 --- a/source/blender/editors/physics/physics_intern.h +++ b/source/blender/editors/physics/physics_intern.h @@ -36,7 +36,7 @@ struct wmOperatorType; /* particle_edit.c */ -void PARTICLE_OT_select_all_toggle(struct wmOperatorType *ot); +void PARTICLE_OT_select_all(struct wmOperatorType *ot); void PARTICLE_OT_select_first(struct wmOperatorType *ot); void PARTICLE_OT_select_last(struct wmOperatorType *ot); void PARTICLE_OT_select_linked(struct wmOperatorType *ot); diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index b0d804da457..09b4ebec7a2 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -43,7 +43,7 @@ static void operatortypes_particle(void) { - WM_operatortype_append(PARTICLE_OT_select_all_toggle); + WM_operatortype_append(PARTICLE_OT_select_all); WM_operatortype_append(PARTICLE_OT_select_first); WM_operatortype_append(PARTICLE_OT_select_last); WM_operatortype_append(PARTICLE_OT_select_linked); @@ -94,7 +94,7 @@ static void keymap_particle(wmKeyConfig *keyconf) keymap= WM_keymap_find(keyconf, "Particle", 0, 0); keymap->poll= PE_poll; - WM_keymap_add_item(keymap, "PARTICLE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index b5748d7bc88..f86e1077ef3 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -96,7 +96,7 @@ void BRUSH_OT_curve_preset(struct wmOperatorType *ot); void PAINT_OT_face_select_linked(struct wmOperatorType *ot); void PAINT_OT_face_select_linked_pick(struct wmOperatorType *ot); -void PAINT_OT_face_deselect_all(struct wmOperatorType *ot); +void PAINT_OT_face_select_all(struct wmOperatorType *ot); int facemask_paint_poll(struct bContext *C); diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 256d114fbdc..92812c2ab08 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -137,7 +137,7 @@ void ED_operatortypes_paint(void) /* face-select */ WM_operatortype_append(PAINT_OT_face_select_linked); WM_operatortype_append(PAINT_OT_face_select_linked_pick); - WM_operatortype_append(PAINT_OT_face_deselect_all); + WM_operatortype_append(PAINT_OT_face_select_all); } static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *path) @@ -238,7 +238,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf) keymap= WM_keymap_find(keyconf, "Face Mask", 0, 0); keymap->poll= facemask_paint_poll; - WM_keymap_add_item(keymap, "PAINT_OT_face_deselect_all", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked_pick", LKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 24d9e0f4bc1..496d15d793f 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -273,22 +273,24 @@ void PAINT_OT_face_select_linked_pick(wmOperatorType *ot) } -static int face_deselect_all_exec(bContext *C, wmOperator *op) +static int face_select_all_exec(bContext *C, wmOperator *op) { - deselectall_tface(CTX_data_active_object(C)); + selectall_tface(CTX_data_active_object(C), RNA_enum_get(op->ptr, "action")); ED_region_tag_redraw(CTX_wm_region(C)); return OPERATOR_FINISHED; } -void PAINT_OT_face_deselect_all(wmOperatorType *ot) +void PAINT_OT_face_select_all(wmOperatorType *ot) { - ot->name= "Select Linked"; - ot->description= "Select linked faces under the mouse."; - ot->idname= "PAINT_OT_face_deselect_all"; + ot->name= "Face Selection"; + ot->description= "Change selection for all faces."; + ot->idname= "PAINT_OT_face_select_all"; - ot->exec= face_deselect_all_exec; + ot->exec= face_select_all_exec; ot->poll= facemask_paint_poll; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + WM_operator_properties_select_all(ot); } diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 2b45cfef6e1..54038853775 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -1262,7 +1262,7 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, } } } -static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select) +static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend) { struct { ViewContext vc; rcti *rect; int select; } data; @@ -1270,6 +1270,10 @@ static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select) data.rect = rect; data.select = select; + if (extend == 0 && select) { + CU_deselect_all(vc->obedit); + } + ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */ nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data); } @@ -1282,7 +1286,7 @@ static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, i bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT); } } -static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select) +static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend) { struct { ViewContext vc; rcti *rect; int select, pass, done; } data; @@ -1290,6 +1294,10 @@ static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select) data.rect = rect; data.select = select; + if (extend == 0 && select) { + ED_setflagsLatt(vc->obedit, 0); + } + ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */ lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data); } @@ -1327,7 +1335,7 @@ static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int EM_select_face_fgon(data->vc.em, efa, data->select); } } -static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select) +static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend) { struct { ViewContext vc; rcti *rect; short select, pass, done; } data; ToolSettings *ts= vc->scene->toolsettings; @@ -1339,6 +1347,11 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select) data.pass = 0; data.done = 0; + if (extend == 0 && select) + { + EM_deselect_all(vc->em); + } + bbsel= EM_init_backbuf_border(vc, rect->xmin, rect->ymin, rect->xmax, rect->ymax); ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */ @@ -1387,6 +1400,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) MetaElem *ml; unsigned int buffer[4*MAXPICKBUF]; int a, index; + int extend; short hits, selecting; view3d_operator_needs_opengl(C); @@ -1399,31 +1413,41 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) rect.ymin= RNA_int_get(op->ptr, "ymin"); rect.xmax= RNA_int_get(op->ptr, "xmax"); rect.ymax= RNA_int_get(op->ptr, "ymax"); + extend = RNA_boolean_get(op->ptr, "extend"); if(obedit==NULL && (paint_facesel_test(OBACT))) { - face_borderselect(C, obact, &rect, selecting); + face_borderselect(C, obact, &rect, selecting, extend); return OPERATOR_FINISHED; } else if(obedit==NULL && (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) { - return PE_border_select(C, &rect, selecting); + return PE_border_select(C, &rect, selecting, extend); } if(obedit) { if(obedit->type==OB_MESH) { Mesh *me= obedit->data; vc.em= me->edit_mesh; - do_mesh_box_select(&vc, &rect, selecting); + do_mesh_box_select(&vc, &rect, selecting, extend); // if (EM_texFaceCheck()) WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); } else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) { - do_nurbs_box_select(&vc, &rect, selecting); + do_nurbs_box_select(&vc, &rect, selecting, extend); } else if(obedit->type==OB_MBALL) { MetaBall *mb = (MetaBall*)obedit->data; hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect); + if (extend == 0 && selecting) { + ml= mb->editelems->first; + + while(ml) { + ml->flag &= ~SELECT; + ml= ml->next; + } + } + ml= mb->editelems->first; while(ml) { @@ -1452,6 +1476,17 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) for(ebone= arm->edbo->first; ebone; ebone= ebone->next) ebone->flag &= ~BONE_DONE; + if (extend==0 && selecting) { + /* Set the flags */ + CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) { + /* ignore bone if selection can't change */ + if ((ebone->flag & BONE_UNSELECTABLE) == 0) { + ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL); + } + } + CTX_DATA_END; + } + hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect); /* first we only check points inside the border */ @@ -1500,7 +1535,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) ED_armature_sync_selection(arm->edbo); } else if(obedit->type==OB_LATTICE) { - do_lattice_box_select(&vc, &rect, selecting); + do_lattice_box_select(&vc, &rect, selecting, extend); } } else { /* no editmode, unified for bones and objects */ @@ -1516,6 +1551,25 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) else bone_only= 0; + if (extend == 0 && selecting) { + base= FIRSTBASE; + + if (bone_only) { + CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) { + pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL); + } + CTX_DATA_END; + } else { + while(base) { + Base *next = base->next; + if(base->lay & v3d->lay) { + ED_base_object_select(base, BA_DESELECT); + } + base= next; + } + } + } + /* selection buffer now has bones potentially too, so we add MAXPICKBUF */ vbuffer = MEM_mallocN(4 * (totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer"); hits= view3d_opengl_select(&vc, vbuffer, 4*(totobj+MAXPICKBUF), &rect); diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 623ddaae188..fb02f5100b6 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1323,7 +1323,7 @@ void UV_OT_select_inverse(wmOperatorType *ot) /* ******************** (de)select all operator **************** */ -static int de_select_all_exec(bContext *C, wmOperator *op) +static int select_all_exec(bContext *C, wmOperator *op) { Scene *scene; ToolSettings *ts; @@ -1332,7 +1332,7 @@ static int de_select_all_exec(bContext *C, wmOperator *op) EditFace *efa; Image *ima; MTFace *tf; - int sel; + int action = RNA_enum_get(op->ptr, "action"); scene= CTX_data_scene(C); ts= CTX_data_tool_settings(C); @@ -1341,18 +1341,33 @@ static int de_select_all_exec(bContext *C, wmOperator *op) ima= CTX_data_edit_image(C); if(ts->uv_flag & UV_SYNC_SELECTION) { - EM_toggle_select_all(em); + switch (action) { + case SEL_TOGGLE: + EM_toggle_select_all(em); + break; + case SEL_SELECT: + EM_select_all(em); + break; + case SEL_DESELECT: + EM_deselect_all(em); + break; + case SEL_INVERT: + EM_select_swap(em); + break; + } } else { - sel= 0; - for(efa= em->faces.first; efa; efa= efa->next) { - tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); + if (action == SEL_TOGGLE) { + action = SEL_SELECT; + for(efa= em->faces.first; efa; efa= efa->next) { + tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); - if(uvedit_face_visible(scene, ima, efa, tf)) { - if(tf->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) { - sel= 1; - break; + if(uvedit_face_visible(scene, ima, efa, tf)) { + if(tf->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) { + action = SEL_DESELECT; + break; + } } } } @@ -1361,13 +1376,27 @@ static int de_select_all_exec(bContext *C, wmOperator *op) tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); if(uvedit_face_visible(scene, ima, efa, tf)) { - if(efa->v4) { - if(sel) tf->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4); - else tf->flag |= (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4); - } - else { - if(sel) tf->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4); - else tf->flag |= (TF_SEL1+TF_SEL2+TF_SEL3); + char select_flag; + + if(efa->v4) + select_flag = (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4); + else + select_flag = (TF_SEL1+TF_SEL2+TF_SEL3); + + switch (action) { + case SEL_SELECT: + tf->flag |= select_flag; + break; + case SEL_DESELECT: + tf->flag &= ~select_flag; + break; + case SEL_INVERT: + if ((tf->flag & select_flag) == select_flag) { + tf->flag &= ~select_flag; + } else { + tf->flag &= ~select_flag; + } + break; } } } @@ -1379,17 +1408,19 @@ static int de_select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_select_all_toggle(wmOperatorType *ot) +void UV_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select or Deselect All"; - ot->description= "(de)select all UV vertices."; - ot->idname= "UV_OT_select_all_toggle"; + ot->description= "Change selection of all UV vertices."; + ot->idname= "UV_OT_select_all"; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* api callbacks */ - ot->exec= de_select_all_exec; + ot->exec= select_all_exec; ot->poll= ED_operator_uvedit; + + WM_operator_properties_select_all(ot); } /* ******************** mouse select operator **************** */ @@ -3065,7 +3096,7 @@ void UV_OT_tile_set(wmOperatorType *ot) void ED_operatortypes_uvedit(void) { - WM_operatortype_append(UV_OT_select_all_toggle); + WM_operatortype_append(UV_OT_select_all); WM_operatortype_append(UV_OT_select_inverse); WM_operatortype_append(UV_OT_select); WM_operatortype_append(UV_OT_select_loop); @@ -3121,7 +3152,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) /* selection manipulation */ WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "UV_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index a965b484087..22820d578a5 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -197,6 +197,13 @@ void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperato void WM_operator_properties_free(struct PointerRNA *ptr); void WM_operator_properties_filesel(struct wmOperatorType *ot, int filter, short type); void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend); +void WM_operator_properties_select_all(wmOperatorType *ot); + +/* MOVE THIS SOMEWHERE ELSE */ +#define SEL_TOGGLE 0 +#define SEL_SELECT 1 +#define SEL_DESELECT 2 +#define SEL_INVERT 3 /* operator as a python command (resultuing string must be free'd) */ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args); diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 15e27f45d5e..ab4355bc524 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -668,6 +668,18 @@ void WM_operator_properties_filesel(wmOperatorType *ot, int filter, short type) RNA_def_property_flag(prop, PROP_HIDDEN); } +void WM_operator_properties_select_all(wmOperatorType *ot) { + static EnumPropertyItem select_all_actions[] = { + {SEL_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle selection for all elements"}, + {SEL_SELECT, "SELECT", 0, "Select", "Select all elements"}, + {SEL_DESELECT, "DESELECT", 0, "Deselect", "Deselect all elements"}, + {SEL_INVERT, "INVERT", 0, "Invert", "Invert selection of all elements"}, + {0, NULL, 0, NULL, NULL} + }; + + RNA_def_enum(ot->srna, "action", select_all_actions, SEL_TOGGLE, "Action", "Selection action to execute"); +} + void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend) { RNA_def_int(ot->srna, "gesture_mode", 0, INT_MIN, INT_MAX, "Gesture Mode", "", INT_MIN, INT_MAX); @@ -677,7 +689,7 @@ void WM_operator_properties_gesture_border(wmOperatorType *ot, int extend) RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX); if(extend) - RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection instead of deselecting everything first."); + RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first."); } -- cgit v1.2.3