Edit Mesh Loop select back; 
the versions with ALT+Select (edgeloop) or with
ALT+CTRL+Select ('ring'). Hold shift for extend.
This commit is contained in:
Ton Roosendaal
2009-01-30 18:53:54 +00:00
parent 6d2a30ece8
commit 30ee0806fb
3 changed files with 83 additions and 26 deletions

View File

@@ -1921,37 +1921,53 @@ void loop_multiselect(EditMesh *em, int looptype)
/* ***************** 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 @@ static void mouse_mesh_loop(ViewContext *vc)
}
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 @@ static void mouse_mesh_loop(ViewContext *vc)
}
}
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 @@ static void mouse_mesh_loop(ViewContext *vc)
}
}
switch (0) { // XXX scene->toolsettings->edge_mode) {
switch (vc.scene->toolsettings->edge_mode) {
case EDGE_MODE_TAG_SEAM:
G.f |= G_DRAWSEAMS;
break;
@@ -2015,12 +2031,50 @@ static void mouse_mesh_loop(ViewContext *vc)
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 */
@@ -2030,15 +2084,13 @@ void mouse_mesh(bContext *C, short mval[2], short extend)
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 @@ void mouse_mesh(bContext *C, short mval[2], short extend)
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

View File

@@ -168,7 +168,7 @@ extern struct EditFace *EM_face_from_faces(EditMesh *em, struct EditFace *efa1,
/* ******************* 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);

View File

@@ -139,7 +139,7 @@ void ED_operatortypes_mesh(void)
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 @@ void ED_keymap_mesh(wmWindowManager *wm)
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 @@ void ED_keymap_mesh(wmWindowManager *wm)
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);