2.5 Object mode:
authorNicholas Bishop <nicholasbishop@gmail.com>
Fri, 21 Aug 2009 17:35:35 +0000 (17:35 +0000)
committerNicholas Bishop <nicholasbishop@gmail.com>
Fri, 21 Aug 2009 17:35:35 +0000 (17:35 +0000)
* Made object mode an enum, shows better in the debugger
* Added a toggle mode to the set object mode operator
* Toggling a mode on and off goes back to the previous mode, not just object mode
* Changed the vertex mode and weight mode shortcuts to call the toggle mode operator

source/blender/editors/object/object_edit.c
source/blender/editors/space_view3d/view3d_ops.c
source/blender/makesdna/DNA_object_types.h

index 47eaf1757ac305f9fca4ceb35d966d372b7426d5..8ac12a5e3a4b6bdb0b130c02a23547ca357b65df 100644 (file)
@@ -7092,18 +7092,31 @@ static const char *object_mode_op_string(int mode)
 static int object_mode_set_exec(bContext *C, wmOperator *op)
 {
        Object *ob= CTX_data_active_object(C);
-       int mode = RNA_enum_get(op->ptr, "mode");
+       ObjectMode mode = RNA_enum_get(op->ptr, "mode");
+       ObjectMode restore_mode = ob->mode;
+       int toggle = RNA_boolean_get(op->ptr, "toggle");
 
        if(!ob)
                return OPERATOR_CANCELLED;
 
-       /* Exit off current mode */
-       if(ob->mode != OB_MODE_OBJECT)
+       /* Exit current mode if it's not the mode we're setting */
+       if(ob->mode != OB_MODE_OBJECT && ob->mode != mode)
                WM_operator_name_call(C, object_mode_op_string(ob->mode), WM_OP_EXEC_REGION_WIN, NULL);
 
-       /* Enter new mode */
-       if(mode != OB_MODE_OBJECT)
-               WM_operator_name_call(C, object_mode_op_string(mode), WM_OP_EXEC_REGION_WIN, NULL);
+       if(mode != OB_MODE_OBJECT) {
+               /* Enter new mode */
+               if(ob->mode != mode || toggle)
+                       WM_operator_name_call(C, object_mode_op_string(mode), WM_OP_EXEC_REGION_WIN, NULL);
+
+               if(toggle) {
+                       if(ob->mode == mode)
+                               /* For toggling, store old mode so we know what to go back to */
+                               ob->restore_mode = restore_mode;
+                       else if(ob->restore_mode != OB_MODE_OBJECT && ob->restore_mode != mode) {
+                               WM_operator_name_call(C, object_mode_op_string(ob->restore_mode), WM_OP_EXEC_REGION_WIN, NULL);
+                       }
+               }
+       }
 
        return OPERATOR_FINISHED;
 }
@@ -7127,6 +7140,8 @@ void OBJECT_OT_mode_set(wmOperatorType *ot)
        
        prop= RNA_def_enum(ot->srna, "mode", object_mode_items, 0, "Mode", "");
        RNA_def_enum_funcs(prop, object_mode_set_itemsf);
+
+       RNA_def_boolean(ot->srna, "toggle", 0, "Toggle", "");
 }
 
 
index 112847272e5312d9a0034708a4686c92b9e6b562..b0eabae3f5df47905a03e0e03e87522fc9e741c5 100644 (file)
@@ -106,8 +106,12 @@ void view3d_keymap(wmWindowManager *wm)
        ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
        wmKeymapItem *km;
        
-       WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_toggle", VKEY, KM_PRESS, 0, 0);
-       WM_keymap_add_item(keymap, "PAINT_OT_weight_paint_toggle", TABKEY, KM_PRESS, KM_CTRL, 0);
+       km = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", VKEY, KM_PRESS, 0, 0);
+       RNA_enum_set(km->ptr, "mode", OB_MODE_VERTEX_PAINT);
+       RNA_boolean_set(km->ptr, "toggle", 1);
+       km = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, KM_CTRL, 0);
+       RNA_enum_set(km->ptr, "mode", OB_MODE_WEIGHT_PAINT);
+       RNA_boolean_set(km->ptr, "toggle", 1);
        
        WM_keymap_add_item(keymap, "VIEW3D_OT_properties", NKEY, KM_PRESS, 0, 0);
        WM_keymap_add_item(keymap, "VIEW3D_OT_toolbar", TKEY, KM_PRESS, 0, 0);
index 5c821b532fbca04b402e91b25543c56b02b0f7c4..be43ae7f99dcee85cac0a78e8822b3f80bbff277 100644 (file)
@@ -116,8 +116,8 @@ typedef struct Object {
        ListBase defbase;
        ListBase modifiers; /* list of ModifierData structures */
 
-       /* For now just a flag for sculpt mode, eventually we make the other modes local too */
-       int mode, pad2;
+       int mode;           /* Local object mode */
+       int restore_mode;   /* Keep track of what mode to return to after toggling a mode */
 
        /* materials */
        struct Material **mat;  /* material slots */
@@ -234,7 +234,7 @@ typedef struct Object {
        unsigned int state;                     /* bit masks of game controllers that are active */
        unsigned int init_state;        /* bit masks of initial state as recorded by the users */
 
-       int restore_mode;               /* Keep track of what mode to return to after edit mode exits */
+       int pad2;
 
        ListBase gpulamp;               /* runtime, for lamps only */
 } Object;
@@ -511,16 +511,16 @@ extern Object workob;
 #define OB_LOCK_SCALE  448
 
 /* ob->mode */
-#define OB_MODE_OBJECT          0
-#define OB_MODE_EDIT            1
-#define OB_MODE_SCULPT          2
-#define OB_MODE_VERTEX_PAINT    4
-#define OB_MODE_WEIGHT_PAINT    8
-#define OB_MODE_TEXTURE_PAINT  16
-#define OB_MODE_PARTICLE_EDIT  32
-#define OB_MODE_POSE           64
-
-/* ob->softflag in DNA_object_force.h */
+typedef enum ObjectMode {
+       OB_MODE_OBJECT = 0,
+       OB_MODE_EDIT = 1,
+       OB_MODE_SCULPT = 2,
+       OB_MODE_VERTEX_PAINT = 4,
+       OB_MODE_WEIGHT_PAINT = 8,
+       OB_MODE_TEXTURE_PAINT = 16,
+       OB_MODE_PARTICLE_EDIT = 32,
+       OB_MODE_POSE = 64
+} ObjectMode;
 
 #ifdef __cplusplus
 }