diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2009-08-21 21:35:35 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2009-08-21 21:35:35 +0400 |
commit | 5280c2884b3395376eec8c9b6f7521375b88f51c (patch) | |
tree | a59c9ddf86615f79f9d6c25ad5298390c4a4cc9e | |
parent | bc41c845f355c0e4fed427bfa3ab7fc5f7e96660 (diff) |
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
-rw-r--r-- | source/blender/editors/object/object_edit.c | 27 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_ops.c | 8 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 26 |
3 files changed, 40 insertions, 21 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 47eaf1757ac..8ac12a5e3a4 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -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", ""); } diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 112847272e5..b0eabae3f5d 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -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); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 5c821b532fb..be43ae7f99d 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -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 } |