diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-06 09:01:11 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-06 09:01:11 +0400 |
commit | 4d9d21600dc0ae508bfbc300fd210a99de8b7ee4 (patch) | |
tree | 3955e248ea33c32e2f1d83e29ac20d9a118a0762 /source/blender/editors | |
parent | 34aa68f29935e2d5b92f339eb732385cd67535f9 (diff) |
Add key shortcut for context sensitive dissolve, Ctrl+X / Ctrl+Delete (as with node editor)
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 55 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/mesh/mesh_ops.c | 4 |
3 files changed, 54 insertions, 6 deletions
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 8c9ebea0305..75fadfc6de5 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3039,6 +3039,17 @@ void MESH_OT_tris_convert_to_quads(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /* Dissolve */ +static void edbm_dissolve_prop__use_verts(wmOperatorType *ot) +{ + RNA_def_boolean(ot->srna, "use_verts", 0, "Dissolve Verts", + "Dissolve remaining vertices"); +} +static void edbm_dissolve_prop__use_face_split(wmOperatorType *ot) +{ + RNA_def_boolean(ot->srna, "use_face_split", 0, "Face Split", + "Split off face corners to maintain surrounding geometry"); +} + static int edbm_dissolve_verts_exec(bContext *C, wmOperator *op) { Object *obedit = CTX_data_edit_object(C); @@ -3068,8 +3079,7 @@ void MESH_OT_dissolve_verts(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "use_face_split", 0, "Face Split", - "Split off face corners to maintain surrounding geometry"); + edbm_dissolve_prop__use_face_split(ot); } static int edbm_dissolve_edges_exec(bContext *C, wmOperator *op) @@ -3106,9 +3116,8 @@ void MESH_OT_dissolve_edges(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "use_verts", 0, "Dissolve Verts", "Dissolve remaining vertices"); - RNA_def_boolean(ot->srna, "use_face_split", 0, "Face Split", - "Split off face corners to maintain surrounding geometry"); + edbm_dissolve_prop__use_verts(ot); + edbm_dissolve_prop__use_face_split(ot); } static int edbm_dissolve_faces_exec(bContext *C, wmOperator *op) @@ -3140,9 +3149,43 @@ void MESH_OT_dissolve_faces(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - RNA_def_boolean(ot->srna, "use_verts", 0, "Dissolve Verts", "Dissolve remaining vertices"); + edbm_dissolve_prop__use_verts(ot); +} + + +static int edbm_dissolve_mode_exec(bContext *C, wmOperator *op) +{ + Object *obedit = CTX_data_edit_object(C); + BMEditMesh *em = BKE_editmesh_from_object(obedit); + + if (em->selectmode & SCE_SELECT_VERTEX) { + return edbm_dissolve_verts_exec(C, op); + } + else if (em->selectmode & SCE_SELECT_EDGE) { + return edbm_dissolve_edges_exec(C, op); + } + else { + return edbm_dissolve_faces_exec(C, op); + } } +void MESH_OT_dissolve_mode(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Dissolve Selection"; + ot->description = "Dissolve geometry based on the selection mode"; + ot->idname = "MESH_OT_dissolve_mode"; + + /* api callbacks */ + ot->exec = edbm_dissolve_mode_exec; + ot->poll = ED_operator_editmesh; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + edbm_dissolve_prop__use_verts(ot); + edbm_dissolve_prop__use_face_split(ot); +} static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op) { diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index b2d6e872206..1dcc0e64183 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -204,6 +204,7 @@ void MESH_OT_tris_convert_to_quads(struct wmOperatorType *ot); void MESH_OT_dissolve_verts(struct wmOperatorType *ot); void MESH_OT_dissolve_edges(struct wmOperatorType *ot); void MESH_OT_dissolve_faces(struct wmOperatorType *ot); +void MESH_OT_dissolve_mode(struct wmOperatorType *ot); void MESH_OT_dissolve_limited(struct wmOperatorType *ot); void MESH_OT_delete_edgeloop(struct wmOperatorType *ot); void MESH_OT_edge_face_add(struct wmOperatorType *ot); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 90dc803ea50..b5352fb35f4 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -109,6 +109,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_dissolve_verts); WM_operatortype_append(MESH_OT_dissolve_edges); WM_operatortype_append(MESH_OT_dissolve_faces); + WM_operatortype_append(MESH_OT_dissolve_mode); WM_operatortype_append(MESH_OT_dissolve_limited); WM_operatortype_append(MESH_OT_delete_edgeloop); WM_operatortype_append(MESH_OT_faces_shade_smooth); @@ -384,6 +385,9 @@ void ED_keymap_mesh(wmKeyConfig *keyconf) WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", DELKEY, KM_PRESS, 0, 0); + + WM_keymap_add_item(keymap, "MESH_OT_dissolve_mode", XKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "MESH_OT_dissolve_mode", DELKEY, KM_PRESS, KM_CTRL, 0); kmi = WM_keymap_add_item(keymap, "MESH_OT_knife_tool", KKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "use_occlude_geometry", true); |