diff options
author | Andrew Wiggin <ender79bl@gmail.com> | 2011-10-15 18:47:37 +0400 |
---|---|---|
committer | Andrew Wiggin <ender79bl@gmail.com> | 2011-10-15 18:47:37 +0400 |
commit | 30141b44642609cccb9c252de578a00e92633b29 (patch) | |
tree | 9b95b604b19f1b3d8c1832133f90a621e2eafad3 /source/blender | |
parent | e9a194e55fd79a8928d43a2990c2c0c570a9bfaa (diff) |
select boundary loop tool (aka region to loop) switches to edge select mode if the mode was face select
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 2 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmesh_select.c | 16 | ||||
-rw-r--r-- | source/blender/editors/mesh/bmeshutils.c | 7 | ||||
-rw-r--r-- | source/blender/editors/util/editmode_undo.c | 2 |
4 files changed, 22 insertions, 5 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index cc4ed12c41e..18ee29fe863 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -297,7 +297,7 @@ int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set); int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me); -void EDBM_selectmode_to_scene(struct Scene *scene, struct Object *obedit); +void EDBM_selectmode_to_scene(struct bContext *C); #include "../mesh/editbmesh_bvh.h" diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c index 8b51b2809a6..c63fd6796a9 100644 --- a/source/blender/editors/mesh/bmesh_select.c +++ b/source/blender/editors/mesh/bmesh_select.c @@ -2437,6 +2437,9 @@ static int region_to_loop(bContext *C, wmOperator *UNUSED(op)) BMFace *f; BMEdge *e; BMIter iter; + ViewContext vc; + + em_setup_viewcontext(C, &vc); BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) { BM_SetIndex(e, 0); @@ -2465,8 +2468,17 @@ static int region_to_loop(bContext *C, wmOperator *UNUSED(op)) if (BM_GetIndex(e) && !BM_TestHFlag(e, BM_HIDDEN)) BM_Select_Edge(em->bm, e, 1); } - + + /* If in face-only select mode, switch to edge select mode so that + an edge-only selection is not inconsistent state */ + if (em->selectmode == SCE_SELECT_FACE) { + em->selectmode = SCE_SELECT_EDGE; + EDBM_selectmode_set(em); + EDBM_selectmode_to_scene(C); + } + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); + return OPERATOR_FINISHED; } @@ -2628,7 +2640,7 @@ static int loop_to_region(bContext *C, wmOperator *op) BMFace *f; int selbigger = RNA_boolean_get(op->ptr, "select_bigger"); int a, b; - + /*find the set of regions with smallest number of total faces*/ a = loop_find_regions(em, selbigger); b = loop_find_regions(em, !selbigger); diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c index 1a3c75f522a..51a2f2e279c 100644 --- a/source/blender/editors/mesh/bmeshutils.c +++ b/source/blender/editors/mesh/bmeshutils.c @@ -252,14 +252,19 @@ int EDBM_CallOpfSilent(BMEditMesh *em, const char *fmt, ...) return EDBM_FinishOp(em, &bmop, NULL, 0); } -void EDBM_selectmode_to_scene(Scene *scene, Object *obedit) +void EDBM_selectmode_to_scene(bContext *C) { + Scene *scene = CTX_data_scene(C); + Object *obedit = CTX_data_edit_object(C); BMEditMesh *em = ((Mesh*)obedit->data)->edit_btmesh; if (!em) return; scene->toolsettings->selectmode = em->selectmode; + + /* Request redraw of header buttons (to show new select mode) */ + WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, scene); } void EDBM_MakeEditBMesh(ToolSettings *ts, Scene *UNUSED(scene), Object *ob) diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index 9b938c44a5f..342f9d43fc9 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -274,7 +274,7 @@ void undo_editmode_step(bContext *C, int step) /* special case for editmesh, mode must be copied back to the scene */ if(obedit->type == OB_MESH) { - EDBM_selectmode_to_scene(CTX_data_scene(C), obedit); + EDBM_selectmode_to_scene(C); } DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); |