1. Extend option for 3d view border select now does something (default True to keep...
authorMartin Poirier <theeth@yahoo.com>
Sun, 29 Nov 2009 22:16:29 +0000 (22:16 +0000)
committerMartin Poirier <theeth@yahoo.com>
Sun, 29 Nov 2009 22:16:29 +0000 (22:16 +0000)
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.

36 files changed:
release/scripts/io/import_anim_bvh.py
release/scripts/io/import_scene_obj.py
release/scripts/ui/space_image.py
release/scripts/ui/space_view3d.py
source/blender/editors/animation/anim_markers.c
source/blender/editors/armature/armature_intern.h
source/blender/editors/armature/armature_ops.c
source/blender/editors/armature/editarmature.c
source/blender/editors/curve/curve_intern.h
source/blender/editors/curve/curve_ops.c
source/blender/editors/curve/editcurve.c
source/blender/editors/include/ED_curve.h
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_object.h
source/blender/editors/include/ED_particle.h
source/blender/editors/mesh/editface.c
source/blender/editors/mesh/editmesh_mods.c
source/blender/editors/mesh/mesh_intern.h
source/blender/editors/mesh/mesh_ops.c
source/blender/editors/metaball/mball_edit.c
source/blender/editors/metaball/mball_intern.h
source/blender/editors/metaball/mball_ops.c
source/blender/editors/object/object_intern.h
source/blender/editors/object/object_lattice.c
source/blender/editors/object/object_ops.c
source/blender/editors/object/object_select.c
source/blender/editors/physics/particle_edit.c
source/blender/editors/physics/physics_intern.h
source/blender/editors/physics/physics_ops.c
source/blender/editors/sculpt_paint/paint_intern.h
source/blender/editors/sculpt_paint/paint_ops.c
source/blender/editors/sculpt_paint/paint_utils.c
source/blender/editors/space_view3d/view3d_select.c
source/blender/editors/uvedit/uvedit_ops.c
source/blender/windowmanager/WM_api.h
source/blender/windowmanager/intern/wm_operators.c

index 9f7063b24cff052a75d28e57ca26ae0d7a077e13..bb0f486b09e49d136613e0fb4d088adf68731039 100644 (file)
@@ -399,7 +399,7 @@ def bvh_node_dict2armature(context, bvh_nodes, IMPORT_START_FRAME= 1, IMPORT_LOO
 #XXX - sloppy operator code
        
        bpy.ops.armature.delete()
-       bpy.ops.armature.select_all_toggle()
+       bpy.ops.armature.select_all()
        bpy.ops.armature.delete()
 
        ZERO_AREA_BONES= []
@@ -484,7 +484,7 @@ def bvh_node_dict2armature(context, bvh_nodes, IMPORT_START_FRAME= 1, IMPORT_LOO
                pass 
        
        
-       bpy.ops.pose.select_all_toggle() # set
+       bpy.ops.pose.select_all() # set
        bpy.ops.anim.keyframe_insert_menu(type=-4) # XXX -     -4 ???
        
 
index a19962666749f48e70ac1e02cbf00383e4175f82..febd1174a066e1d3a5698f2c6f719b89d159776a 100644 (file)
@@ -1277,7 +1277,7 @@ def load_obj(filepath,
        
        # deselect all
 #      if context.selected_objects:
-#              bpy.ops.OBJECT_OT_select_all_toggle()
+#              bpy.ops.OBJECT_OT_select_all()
 
        scene = context.scene
 #      scn = bpy.data.scenes.active
@@ -1640,5 +1640,5 @@ menu_item = dynamic_menu.add(bpy.types.INFO_MT_file_import, menu_func)
 # search image in bpy.config.textureDir - load_image
 # replaced BPyImage.comprehensiveImageLoad with a simplified version that only checks additional directory specified, but doesn't search dirs recursively (obj_image_load)
 # bitmask won't work? - 132
-# uses operator bpy.ops.OBJECT_OT_select_all_toggle() to deselect all (not necessary?)
+# uses operator bpy.ops.OBJECT_OT_select_all() to deselect all (not necessary?)
 # uses bpy.sys.time()
index 32c5dbb9375c33f52a8bc80a5a560a3c1f49c1af..ea8ed19d31b8c0673cab8cf1aab050c524538b7c 100644 (file)
@@ -75,7 +75,7 @@ class IMAGE_MT_select(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("uv.select_all_toggle")
+        layout.operator("uv.select_all")
         layout.operator("uv.select_inverse")
         layout.operator("uv.unlink_selection")
 
index 5b33fbecac281112a177e993cee719ee4ffa2b27..5895460133765701e5e8ef0f20ceeaef0e289a27 100644 (file)
@@ -364,7 +364,7 @@ class VIEW3D_MT_select_object(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("object.select_all_toggle", text="Select/Deselect All")
+        layout.operator("object.select_all", text="Select/Deselect All")
         layout.operator("object.select_inverse", text="Inverse")
         layout.operator("object.select_random", text="Random")
         layout.operator("object.select_mirror", text="Mirror")
@@ -388,7 +388,7 @@ class VIEW3D_MT_select_pose(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("pose.select_all_toggle", text="Select/Deselect All")
+        layout.operator("pose.select_all", text="Select/Deselect All")
         layout.operator("pose.select_inverse", text="Inverse")
         layout.operator("pose.select_constraint_target", text="Constraint Target")
         layout.operator("pose.select_linked", text="Linked")
@@ -419,7 +419,7 @@ class VIEW3D_MT_select_particle(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("particle.select_all_toggle", text="Select/Deselect All")
+        layout.operator("particle.select_all", text="Select/Deselect All")
         layout.operator("particle.select_linked")
         layout.operator("particle.select_inverse")
 
@@ -445,7 +445,7 @@ class VIEW3D_MT_select_edit_mesh(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("mesh.select_all_toggle", text="Select/Deselect All")
+        layout.operator("mesh.select_all", text="Select/Deselect All")
         layout.operator("mesh.select_inverse", text="Inverse")
 
         layout.separator()
@@ -494,7 +494,7 @@ class VIEW3D_MT_select_edit_curve(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("curve.select_all_toggle", text="Select/Deselect All")
+        layout.operator("curve.select_all", text="Select/Deselect All")
         layout.operator("curve.select_inverse")
         layout.operator("curve.select_random")
         layout.operator("curve.select_every_nth")
@@ -523,7 +523,7 @@ class VIEW3D_MT_select_edit_surface(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("curve.select_all_toggle", text="Select/Deselect All")
+        layout.operator("curve.select_all", text="Select/Deselect All")
         layout.operator("curve.select_inverse")
         layout.operator("curve.select_random")
         layout.operator("curve.select_every_nth")
@@ -566,7 +566,7 @@ class VIEW3D_MT_select_edit_lattice(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("lattice.select_all_toggle", text="Select/Deselect All")
+        layout.operator("lattice.select_all", text="Select/Deselect All")
 
 
 class VIEW3D_MT_select_edit_armature(bpy.types.Menu):
@@ -580,7 +580,7 @@ class VIEW3D_MT_select_edit_armature(bpy.types.Menu):
 
         layout.separator()
 
-        layout.operator("armature.select_all_toggle", text="Select/Deselect All")
+        layout.operator("armature.select_all", text="Select/Deselect All")
         layout.operator("armature.select_inverse", text="Inverse")
 
         layout.separator()
index 463518a32ff2479942f372f389f48ad1312db0a7..721fa928e4458b9a6cc655b2a6242170ef53be96 100644 (file)
@@ -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);
        
index f53b70120d5121e7eeaac8f9db4657d1e785e689..c65d4637dcf5d36b62ffe6bbf8ad908dfbb95aa1 100644 (file)
@@ -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);
index e3c823283d1c7bbe14a6ef3bf3ac4fa2fd91957c..d1c50439c0188397f1dfe8ade4625475bba9bf2d 100644 (file)
@@ -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);
index 95b743a7b274741476617513d26b40cd9a2ec9d7..38daa22bbc72c0e81a3d2bef34fb9dbfbb9d03e7 100644 (file)
@@ -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)
index ad3e94278613cfe53575f6826a67688c70567840..6c477bd011a287901c77309461c83623f15891d5 100644 (file)
@@ -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);
index 15ff971b9cfd1d8ef4b30423cc33bbba871fde77..c54739902d0f82e9d7b572e237e24dae16fb4fb4 100644 (file)
@@ -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);
index e53b419c6ea91e758c6d5ea344e0382042f1315e..a65e1164a27ca71731197561bb781c3762ed6782 100644 (file)
@@ -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;
index 66a481ca5ac5d511e9cc895d60b03cfffa0b8139..3166f77815cb9300f0fc15dfa11e5a4d5abd9524 100644 (file)
@@ -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);
 
index ba26104a5550053319bc7739f27355e817deae88..58f4a566ff78ab2f4e2e7e9f35ecc4e7aebe47ce 100644 (file)
@@ -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 */
index 69b478c6dfa847884d82964cac14c5b5b612cc16..1b77d298e3a9385134f6e229b0878141031bfbc5 100644 (file)
@@ -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,
index fcdaf8cb59df12bb4170bb7b020d61097f85c07e..6dd54fd9b1a14062d37437d3e8c9c33f47109714 100644 (file)
@@ -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);
 
index 5d94fb32438c60dbd15406c3278a4fd43c5f0342..d034fe4a78389393c91b8579cc5aa9a20f62c3c7 100644 (file)
@@ -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);
index 8501b7fba92f38747e81bc7bbb3af64950bf8f93..c79ef342150867b65266564630e12f1c11bee7fc 100644 (file)
@@ -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);
 }
 
 /* ******************** **************** */
index 3f79b9b437077fb08436d9b8fee88df9c2b8de81..4ce9afaf2378865894bb295563564ed5cb6883dd 100644 (file)
@@ -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);
index 1363d8b21027577af3ce85fdb96a22bfb3292db8..866638d2f20f13e0e042e93c434fe11e4606ba95 100644 (file)
@@ -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);
index 09200514c0fdda62b7b584a178e212df075114b9..d4ad833d11e05dec0687a3b60c73a849b60a0e49 100644 (file)
@@ -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 *****************************/
index 8cf749733dda2465de369be4ca9f005a0fc945e9..fca9fc7e650bade599ad85c331c3a3321fca15f5 100644 (file)
@@ -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);
 
index 01da90212a077ced4c43495be00992753166451d..b638eaecbc25999147f11550166e7967a5f52002 100644 (file)
@@ -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);
 }
 
index 9230dca7ba2d89bce54db7f8882b1f7a68d4f07b..ebd8261f207f57039d6201c25ffeb24d30ecf537 100644 (file)
@@ -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 */
index 3f27ea407a238e94f86dbbf9335531dc64ca7e05..1cda843845a1cdc768c0d1c1396f0db6ce9c5c4e 100644 (file)
@@ -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
index 4dcecc9288047597bd0997a2196fa86768c535bd..8d407b0e571a5cd4240355dcc7fecdba213ecc5d 100644 (file)
@@ -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);
index 20f3ea3df9ec04ed166c6bda3a579f425111d769..5366446c8ae5ce1f329324ad5a78f48ec7693257 100644 (file)
@@ -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 ****************************/
index b5007ff72ceb2975b555a31f10ce7ee402ef8443..68e673c31b17eda639fca93bcad4dcfa7db2c402 100644 (file)
@@ -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;
index e7543cbb83ea5cd9e9dfa67b333656f6ffaf0474..085332b1788f6bb8149b79909c20d0d7a3461c94 100644 (file)
@@ -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);
index b0d804da4579a9d93f4cad6689b22c63adb3df89..09b4ebec7a211e76cb41d04d96b34db8d2080ff0 100644 (file)
@@ -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);
index b5748d7bc88863f6fce7369666f5b50fa77d390e..f86e1077ef326945cd3ebcf6f7bbe763208b7ab6 100644 (file)
@@ -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);
 
index 256d114fbdce22bd08a884288228db4a512836a6..92812c2ab0859b34386642ef67ffae4e03560d17 100644 (file)
@@ -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);
 
index 24d9e0f4bc1553e228b27967f7b1ea14dd5404a6..496d15d793f5128763609adcd4b5404d36bdf44d 100644 (file)
@@ -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);
 }
index 2b45cfef6e162e08c61b896c2f96e161eec64913..54038853775d50ecad018970bbef3f526be7cac6 100644 (file)
@@ -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);
index 623ddaae18865964a5cad218d0f8653fbbfa2d1e..fb02f5100b690b5808feeca53b9a59239d47190f 100644 (file)
@@ -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);
 
index a965b484087a5ae1b3ad63863d32ec0e3b1a5d04..22820d578a56fe2c362465a234a23f06965984f7 100644 (file)
@@ -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);
index 15e27f45d5e8ad0d1976373147c181c045769b48..ab4355bc5248d6313cfc6e3b1fa6d9d68ee3e362 100644 (file)
@@ -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.");
 }