@ -1311,7 +1311,7 @@ static void deselect_all_tracks(MovieTracking *tracking)
}
/* mval is region coords */
static int mouse_select ( bContext * C , const int mval [ 2 ] , short extend , short obcenter, short enumerate )
static int mouse_select ( bContext * C , const int mval [ 2 ] , short extend , short deselect, short toggle , short obcenter, short enumerate )
{
ViewContext vc ;
ARegion * ar = CTX_wm_region ( C ) ;
@ -1438,7 +1438,7 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
}
}
}
else if ( ED_do_pose_selectbuffer ( scene , basact , buffer , hits , extend ) ) { /* then bone is found */
else if ( ED_do_pose_selectbuffer ( scene , basact , buffer , hits , extend , deselect , toggle ) ) { /* then bone is found */
/* we make the armature selected:
* not - selected active object in posemode won ' t work well for tools */
@ -1477,20 +1477,23 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
oldbasact = BASACT ;
if ( ! extend ) {
deselectall_except ( scene , basact ) ;
if ( extend ) {
ED_base_object_select ( basact , BA_SELECT ) ;
}
else if ( 0 ) {
// XXX select_all_from_groups(basact);
else if ( deselect ) {
ED_base_object_select ( basact , BA_DESELECT ) ;
}
else {
else if ( toggle ) {
if ( basact - > flag & SELECT ) {
if ( basact = = oldbasact )
ED_base_object_select ( basact , BA_DESELECT ) ;
}
else ED_base_object_select ( basact , BA_SELECT ) ;
}
else {
deselectall_except ( scene , basact ) ;
ED_base_object_select ( basact , BA_SELECT ) ;
}
if ( oldbasact ! = basact ) {
ED_base_object_activate ( C , basact ) ; /* adds notifier */
@ -2043,7 +2046,7 @@ static int vertsel_vert_pick(struct bContext *C, Mesh *me, const int mval[2], un
/* mouse selection in weight paint */
/* gets called via generic mouse select operator */
static int mouse_weight_paint_vertex_select ( bContext * C , const int mval [ 2 ] , short extend , Object * obact )
static int mouse_weight_paint_vertex_select ( bContext * C , const int mval [ 2 ] , short extend , short deselect , short toggle , Object * obact )
{
Mesh * me = obact - > data ; /* already checked for NULL */
unsigned int index = 0 ;
@ -2052,6 +2055,12 @@ static int mouse_weight_paint_vertex_select(bContext *C, const int mval[2], shor
if ( vertsel_vert_pick ( C , me , mval , & index , 50 ) ) {
mv = me - > mvert + index ;
if ( extend ) {
mv - > flag | = SELECT ;
}
else if ( deselect ) {
mv - > flag & = ~ SELECT ;
}
else if ( toggle ) {
mv - > flag ^ = SELECT ;
}
else {
@ -2073,6 +2082,8 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
Object * obedit = CTX_data_edit_object ( C ) ;
Object * obact = CTX_data_active_object ( C ) ;
short extend = RNA_boolean_get ( op - > ptr , " extend " ) ;
short deselect = RNA_boolean_get ( op - > ptr , " deselect " ) ;
short toggle = RNA_boolean_get ( op - > ptr , " toggle " ) ;
short center = RNA_boolean_get ( op - > ptr , " center " ) ;
short enumerate = RNA_boolean_get ( op - > ptr , " enumerate " ) ;
short object = RNA_boolean_get ( op - > ptr , " object " ) ;
@ -2092,27 +2103,27 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
if ( obedit & & object = = FALSE ) {
if ( obedit - > type = = OB_MESH )
retval = mouse_mesh ( C , event - > mval , extend );
retval = mouse_mesh ( C , event - > mval , extend , deselect , toggle );
else if ( obedit - > type = = OB_ARMATURE )
retval = mouse_armature ( C , event - > mval , extend );
retval = mouse_armature ( C , event - > mval , extend , deselect , toggle );
else if ( obedit - > type = = OB_LATTICE )
retval = mouse_lattice ( C , event - > mval , extend );
retval = mouse_lattice ( C , event - > mval , extend , deselect , toggle );
else if ( ELEM ( obedit - > type , OB_CURVE , OB_SURF ) )
retval = mouse_nurb ( C , event - > mval , extend );
retval = mouse_nurb ( C , event - > mval , extend , deselect , toggle );
else if ( obedit - > type = = OB_MBALL )
retval = mouse_mball ( C , event - > mval , extend );
retval = mouse_mball ( C , event - > mval , extend , deselect , toggle );
}
else if ( obact & & obact - > mode & OB_MODE_SCULPT )
return OPERATOR_CANCELLED ;
else if ( obact & & obact - > mode & OB_MODE_PARTICLE_EDIT )
return PE_mouse_particles ( C , event - > mval , extend );
return PE_mouse_particles ( C , event - > mval , extend , deselect , toggle );
else if ( obact & & paint_facesel_test ( obact ) )
retval = paintface_mouse_select ( C , obact , event - > mval , extend );
retval = paintface_mouse_select ( C , obact , event - > mval , extend , deselect , toggle );
else if ( paint_vertsel_test ( obact ) )
retval = mouse_weight_paint_vertex_select ( C , event - > mval , extend , obact) ;
retval = mouse_weight_paint_vertex_select ( C , event - > mval , extend , deselect, toggle , obact) ;
else
retval = mouse_select ( C , event - > mval , extend , center, enumerate ) ;
retval = mouse_select ( C , event - > mval , extend , deselect, toggle , center, enumerate ) ;
/* passthrough allows tweaks
* FINISHED to signal one operator worked
@ -2139,6 +2150,8 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* properties */
RNA_def_boolean ( ot - > srna , " extend " , 0 , " Extend " , " Extend selection instead of deselecting everything first " ) ;
RNA_def_boolean ( ot - > srna , " deselect " , 0 , " Deselect " , " Remove from selection " ) ;
RNA_def_boolean ( ot - > srna , " toggle " , 0 , " Toggle Selection " , " Toggles selection " ) ;
RNA_def_boolean ( ot - > srna , " center " , 0 , " Center " , " Use the object center when selecting, in editmode used to extend object selection " ) ;
RNA_def_boolean ( ot - > srna , " enumerate " , 0 , " Enumerate " , " List objects under the mouse (object mode only) " ) ;
RNA_def_boolean ( ot - > srna , " object " , 0 , " Object " , " Use object selection (editmode only) " ) ;