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;
}
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", "");
}
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);
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 */
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;
#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
}