2.5 Object mode:

* 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
This commit is contained in:
2009-08-21 17:35:35 +00:00
parent bc41c845f3
commit 5280c2884b
3 changed files with 40 additions and 21 deletions

View File

@@ -7092,19 +7092,32 @@ static const char *object_mode_op_string(int mode)
static int object_mode_set_exec(bContext *C, wmOperator *op) static int object_mode_set_exec(bContext *C, wmOperator *op)
{ {
Object *ob= CTX_data_active_object(C); 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) if(!ob)
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;
/* Exit off current mode */ /* Exit current mode if it's not the mode we're setting */
if(ob->mode != OB_MODE_OBJECT) 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); WM_operator_name_call(C, object_mode_op_string(ob->mode), WM_OP_EXEC_REGION_WIN, NULL);
if(mode != OB_MODE_OBJECT) {
/* Enter new mode */ /* Enter new mode */
if(mode != OB_MODE_OBJECT) if(ob->mode != mode || toggle)
WM_operator_name_call(C, object_mode_op_string(mode), WM_OP_EXEC_REGION_WIN, NULL); 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; 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", ""); prop= RNA_def_enum(ot->srna, "mode", object_mode_items, 0, "Mode", "");
RNA_def_enum_funcs(prop, object_mode_set_itemsf); RNA_def_enum_funcs(prop, object_mode_set_itemsf);
RNA_def_boolean(ot->srna, "toggle", 0, "Toggle", "");
} }

View File

@@ -106,8 +106,12 @@ void view3d_keymap(wmWindowManager *wm)
ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0); ListBase *keymap= WM_keymap_listbase(wm, "View3D Generic", SPACE_VIEW3D, 0);
wmKeymapItem *km; wmKeymapItem *km;
WM_keymap_add_item(keymap, "PAINT_OT_vertex_paint_toggle", VKEY, KM_PRESS, 0, 0); km = WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", VKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PAINT_OT_weight_paint_toggle", TABKEY, KM_PRESS, KM_CTRL, 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_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW3D_OT_toolbar", TKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_toolbar", TKEY, KM_PRESS, 0, 0);

View File

@@ -116,8 +116,8 @@ typedef struct Object {
ListBase defbase; ListBase defbase;
ListBase modifiers; /* list of ModifierData structures */ ListBase modifiers; /* list of ModifierData structures */
/* For now just a flag for sculpt mode, eventually we make the other modes local too */ int mode; /* Local object mode */
int mode, pad2; int restore_mode; /* Keep track of what mode to return to after toggling a mode */
/* materials */ /* materials */
struct Material **mat; /* material slots */ 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 state; /* bit masks of game controllers that are active */
unsigned int init_state; /* bit masks of initial state as recorded by the users */ 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 */ ListBase gpulamp; /* runtime, for lamps only */
} Object; } Object;
@@ -511,16 +511,16 @@ extern Object workob;
#define OB_LOCK_SCALE 448 #define OB_LOCK_SCALE 448
/* ob->mode */ /* ob->mode */
#define OB_MODE_OBJECT 0 typedef enum ObjectMode {
#define OB_MODE_EDIT 1 OB_MODE_OBJECT = 0,
#define OB_MODE_SCULPT 2 OB_MODE_EDIT = 1,
#define OB_MODE_VERTEX_PAINT 4 OB_MODE_SCULPT = 2,
#define OB_MODE_WEIGHT_PAINT 8 OB_MODE_VERTEX_PAINT = 4,
#define OB_MODE_TEXTURE_PAINT 16 OB_MODE_WEIGHT_PAINT = 8,
#define OB_MODE_PARTICLE_EDIT 32 OB_MODE_TEXTURE_PAINT = 16,
#define OB_MODE_POSE 64 OB_MODE_PARTICLE_EDIT = 32,
OB_MODE_POSE = 64
/* ob->softflag in DNA_object_force.h */ } ObjectMode;
#ifdef __cplusplus #ifdef __cplusplus
} }