Revision: 18756 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18756 Author: ton Date: 2009-01-30 19:53:54 +0100 (Fri, 30 Jan 2009)
Log Message: ----------- 2.5 Edit Mesh Loop select back; the versions with ALT+Select (edgeloop) or with ALT+CTRL+Select ('ring'). Hold shift for extend. Modified Paths: -------------- branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c Modified: branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c 2009-01-30 18:27:25 UTC (rev 18755) +++ branches/blender2.5/blender/source/blender/editors/mesh/editmesh_mods.c 2009-01-30 18:53:54 UTC (rev 18756) @@ -1921,37 +1921,53 @@ /* ***************** MAIN MOUSE SELECTION ************** */ -/* just to have the functions nice together */ -static void mouse_mesh_loop(ViewContext *vc) +/* ***************** loop select (non modal) ************** */ + +static EnumPropertyItem prop_select_types[] = { + {0, "LOOP_EXCLUSIVE", "Loop Exclusive", ""}, + {1, "LOOP_EXTEND", "Loop Extend", ""}, + {2, "RING_EXCLUSIVE", "Ring Exclusive", ""}, + {3, "RING_EXTEND", "Ring Extend", ""}, + {0, NULL, NULL, NULL} +}; + + +static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring) { - EditMesh *em= vc->em; + ViewContext vc; + EditMesh *em; EditEdge *eed; int select= 1; int dist= 50; - int shift= 0, alt= 0, ctrl= 0; // XXX - eed= findnearestedge(vc, &dist); + em_setup_viewcontext(C, &vc); + vc.mval[0]= mval[0]; + vc.mval[1]= mval[1]; + em= vc.em; + + eed= findnearestedge(&vc, &dist); if(eed) { - if (vc->scene->toolsettings->edge_mode == EDGE_MODE_SELECT) { - if(shift==0) EM_clear_flag_all(em, SELECT); + /* XXX: should toolsettings do this? */ + if (vc.scene->toolsettings->edge_mode == EDGE_MODE_SELECT) { + if(extend==0) EM_clear_flag_all(em, SELECT); if((eed->f & SELECT)==0) select=1; - else if(shift) select=0; + else if(extend) select=0; if(em->selectmode & SCE_SELECT_FACE) { faceloop_select(em, eed, select); } else if(em->selectmode & SCE_SELECT_EDGE) { - if((alt && ctrl)) + if(ring) edgering_select(em, eed, select); - else if(alt) + else edgeloop_select(em, eed, select); } else if(em->selectmode & SCE_SELECT_VERTEX) { - if((alt && ctrl)) + if(ring) edgering_select(em, eed, select); - else if(alt) + else edgeloop_select(em, eed, select); } @@ -1960,18 +1976,18 @@ } else { - int act = (edgetag_context_check(vc->scene, eed)==0); + int act = (edgetag_context_check(vc.scene, eed)==0); int path = 0; - if (alt && ctrl && em->selected.last) { + if (ring && em->selected.last) { EditSelection *ese = em->selected.last; if(ese && ese->type == EDITEDGE) { EditEdge *eed_act; eed_act = (EditEdge*)ese->data; if (eed_act != eed) { - /* If shift is pressed we need to use the last active edge, (if it exists) */ - if (edgetag_shortest_path(vc->scene, em, eed_act, eed)) { + /* If extend, we need to use the last active edge, (if it exists) */ + if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) { EM_remove_selection(em, eed_act, EDITEDGE); EM_select_edge(eed_act, 0); path = 1; @@ -1980,7 +1996,7 @@ } } if (path==0) { - edgetag_context_set(vc->scene, eed, act); /* switch the edge option */ + edgetag_context_set(vc.scene, eed, act); /* switch the edge option */ } if (act) { @@ -2000,7 +2016,7 @@ } } - switch (0) { // XXX scene->toolsettings->edge_mode) { + switch (vc.scene->toolsettings->edge_mode) { case EDGE_MODE_TAG_SEAM: G.f |= G_DRAWSEAMS; break; @@ -2015,13 +2031,51 @@ break; } -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA); } - + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); } } +static int mesh_loop_select_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + short extend= RNA_int_get(op->ptr, "type"); + short mval[2], ring= 0; + + mval[0]= event->x - ar->winrct.xmin; + mval[1]= event->y - ar->winrct.ymin; + + view3d_operator_needs_opengl(C); + + /* hmrs, 4 selections in 1 property this way? */ + if(extend>1) ring= 1; + extend &= ~2; + + mouse_mesh_loop(C, mval, extend, ring); + + /* allowing tweaks */ + return OPERATOR_PASS_THROUGH; +} +void MESH_OT_loop_select(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Loop Select"; + ot->idname= "MESH_OT_loop_select"; + + /* api callbacks */ + ot->invoke= mesh_loop_select_invoke; + ot->poll= ED_operator_editmesh; + + /* properties */ + RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", ""); +} + +/* ************************************************** */ + + /* here actual select happens */ /* gets called via generic mouse select operator */ void mouse_mesh(bContext *C, short mval[2], short extend) @@ -2030,15 +2084,13 @@ EditVert *eve; EditEdge *eed; EditFace *efa; - int alt= 0; // XXX /* setup view context for argument to callbacks */ em_setup_viewcontext(C, &vc); vc.mval[0]= mval[0]; vc.mval[1]= mval[1]; - if(alt) mouse_mesh_loop(&vc); - else if(unified_findnearest(&vc, &eve, &eed, &efa)) { + if(unified_findnearest(&vc, &eve, &eed, &efa)) { if(extend==0) EM_clear_flag_all(vc.em, SELECT); @@ -2089,7 +2141,6 @@ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); -// rightmouse_transform(); } // XXX should we use CTX_scene(C)->selectmode & SCE_SELECT_FACE like it was in the past ? calls selectconnected_delimit_mesh_all if true Modified: branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h =================================================================== --- branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h 2009-01-30 18:27:25 UTC (rev 18755) +++ branches/blender2.5/blender/source/blender/editors/mesh/mesh_intern.h 2009-01-30 18:53:54 UTC (rev 18756) @@ -168,7 +168,7 @@ /* ******************* editmesh_mods.c */ - +void MESH_OT_loop_select(struct wmOperatorType *ot); void MESH_OT_de_select_all(struct wmOperatorType *ot); void MESH_OT_select_more(struct wmOperatorType *ot); void MESH_OT_select_less(struct wmOperatorType *ot); Modified: branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c =================================================================== --- branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c 2009-01-30 18:27:25 UTC (rev 18755) +++ branches/blender2.5/blender/source/blender/editors/mesh/mesh_ops.c 2009-01-30 18:53:54 UTC (rev 18756) @@ -139,7 +139,7 @@ WM_operatortype_append(MESH_OT_edit_faces); WM_operatortype_append(MESH_OT_separate); WM_operatortype_append(MESH_OT_dupli_extrude_cursor); - + WM_operatortype_append(MESH_OT_loop_select); } /* note mesh keymap also for other space? */ @@ -148,6 +148,10 @@ ListBase *keymap= WM_keymap_listbase(wm, "EditMesh", 0, 0); /* selecting */ + RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "type", 0); + RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", 1); + RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0)->ptr, "type", 2); + RNA_int_set(WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0)->ptr, "type", 3); WM_keymap_add_item(keymap, "MESH_OT_de_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); @@ -161,6 +165,8 @@ RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_flat_faces", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0); RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_select_sharp_edges", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0); + /* transform keymap already defined, so no tweaks for select */ + /* hide */ WM_keymap_add_item(keymap, "MESH_OT_hide_mesh", HKEY, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_hide_mesh", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "swap", 1); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs