From bb02d1fd4f86cdb42b1d3dee7b56ec2bde20fbbc Mon Sep 17 00:00:00 2001 From: Michael Fox Date: Sun, 28 Dec 2008 01:28:31 +0000 Subject: [PATCH] 2.5 ****** Ported object selection tools - (de)select all - invert selection (ctrl-i) - select random ( numpad *) each selection tool is own operator , mouse selection is seperated again to own operator select random has the hard coded fac of 50 as there is no number popup developed yet to be ported: select by layer and select by type --- .../editors/space_view3d/view3d_intern.h | 3 + .../blender/editors/space_view3d/view3d_ops.c | 12 +- .../editors/space_view3d/view3d_select.c | 196 ++++++++++++------ 3 files changed, 140 insertions(+), 71 deletions(-) diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 929e1f7751d..a83864a0b62 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -118,6 +118,9 @@ void view3d_update_depths(ARegion *ar, View3D *v3d); /* view3d_select.c */ void VIEW3D_OT_select(struct wmOperatorType *ot); +void VIEW3D_OT_de_select_all(struct wmOperatorType *ot); +void VIEW3D_OT_select_invert(struct wmOperatorType *ot); +void VIEW3D_OT_select_random(struct wmOperatorType *ot); void VIEW3D_OT_borderselect(struct wmOperatorType *ot); void VIEW3D_OT_circle_select(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 6ac110ea0cf..2be4e755b74 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -68,6 +68,9 @@ void view3d_operatortypes(void) WM_operatortype_append(VIEW3D_OT_viewnumpad); WM_operatortype_append(VIEW3D_OT_viewcenter); WM_operatortype_append(VIEW3D_OT_select); + WM_operatortype_append(VIEW3D_OT_select_invert); + WM_operatortype_append(VIEW3D_OT_select_random); + WM_operatortype_append(VIEW3D_OT_de_select_all); WM_operatortype_append(VIEW3D_OT_borderselect); WM_operatortype_append(VIEW3D_OT_clipping); WM_operatortype_append(VIEW3D_OT_circle_select); @@ -115,10 +118,15 @@ void view3d_keymap(wmWindowManager *wm) RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD6, KM_PRESS, KM_CTRL, 0)->ptr, "viewnum", V3D_VIEW_PANRIGHT); RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD8, KM_PRESS, KM_CTRL, 0)->ptr, "viewnum", V3D_VIEW_PANUP); - RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, 0, 0)->ptr, "select_type", V3D_SELECT_MOUSE); + /* selection*/ + WM_keymap_add_item(keymap, "VIEW3D_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "VIEW3D_OT_de_select_all",AKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "VIEW3D_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "VIEW3D_OT_select_random",PADASTERKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_borderselect", BKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "VIEW3D_OT_clipping", BKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_circle_select", CKEY, KM_PRESS, 0, 0); + + WM_keymap_add_item(keymap, "VIEW3D_OT_clipping", BKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_render_border", BKEY, KM_PRESS, KM_SHIFT, 0); /* TODO - this is just while we have no way to load a text datablock */ diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index 2be8df678f0..04635021bfe 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -742,10 +742,10 @@ void selectswap(Scene *scene, View3D *v3d) } /* inverts object selection */ -void selectrandom(Scene *scene, View3D *v3d) +void selectrandom(Scene *scene, View3D *v3d, short randfac) { Base *base; - static short randfac = 50; + /*static short randfac = 50;*/ // XXX if(button(&randfac,0, 100,"Percentage:")==0) return; for(base= FIRSTBASE; base; base= base->next) { @@ -1231,74 +1231,7 @@ static void mouse_select(Scene *scene, ARegion *ar, View3D *v3d, short *mval) /* note; make it notifier! */ ED_region_tag_redraw(ar); - -} -/* *****************Selection Operations Operator******************* */ - -static EnumPropertyItem prop_select_items[] = { - {V3D_SELECT_MOUSE, "NORMAL", "Normal Select", "Select using the mouse"}, - {0, NULL, NULL, NULL}}; - -static int view3d_select_exec(bContext *C, wmOperator *op) -{ - ScrArea *sa= CTX_wm_area(C); - ARegion *ar= CTX_wm_region(C); - View3D *v3d= sa->spacedata.first; - Scene *scene= CTX_data_scene(C); - int select_type; - short mval[2]; - - select_type = RNA_enum_get(op->ptr, "select_type"); - - view3d_operator_needs_opengl(C); - printf("about to look at enum"); - switch (select_type) { - case V3D_SELECT_MOUSE : - printf("caught event"); - mval[0] = RNA_int_get(op->ptr, "mx"); - mval[1] = RNA_int_get(op->ptr, "my"); - mouse_select(scene, ar, v3d, mval); - printf("selected object"); - break; - } - return OPERATOR_FINISHED; -} - -static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - ScrArea *sa= CTX_wm_area(C); - ARegion *ar= CTX_wm_region(C); - View3D *v3d= sa->spacedata.first; - short mval[2]; - - mval[0]= event->x - ar->winrct.xmin; - mval[1]= event->y - ar->winrct.ymin; - - RNA_int_set(op->ptr, "mx", mval[0]); - RNA_int_set(op->ptr, "my", mval[1]); - - return view3d_select_exec(C,op); - -} - -void VIEW3D_OT_select(wmOperatorType *ot) -{ - PropertyRNA *prop; - - /* identifiers */ - ot->name= "Activate/Select"; - ot->idname= "VIEW3D_OT_select"; - - /* api callbacks */ - ot->invoke= view3d_select_invoke; - ot->poll= ED_operator_view3d_active; - - prop = RNA_def_property(ot->srna, "select_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, prop_select_items); - - prop = RNA_def_property(ot->srna, "mx", PROP_INT, PROP_NONE); - prop = RNA_def_property(ot->srna, "my", PROP_INT, PROP_NONE); } /* ******************** border and circle ************************************** */ @@ -1654,6 +1587,9 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) } +/* *****************Selection Operators******************* */ + +/* ****** Border Select ****** */ void VIEW3D_OT_borderselect(wmOperatorType *ot) { @@ -1676,7 +1612,129 @@ void VIEW3D_OT_borderselect(wmOperatorType *ot) RNA_def_property(ot->srna, "ymax", PROP_INT, PROP_NONE); } +/* ****** Mouse Select ****** */ +static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ScrArea *sa= CTX_wm_area(C); + ARegion *ar= CTX_wm_region(C); + View3D *v3d= sa->spacedata.first; + Scene *scene= CTX_data_scene(C); + short mval[2]; + + mval[0]= event->x - ar->winrct.xmin; + mval[1]= event->y - ar->winrct.ymin; + view3d_operator_needs_opengl(C); + + mouse_select(scene, ar, v3d, mval); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_select(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Activate/Select"; + ot->idname= "VIEW3D_OT_select"; + + /* api callbacks */ + ot->invoke= view3d_select_invoke; + ot->poll= ED_operator_view3d_active; + +} + +/* ****** invert selection *******/ +static int view3d_select_invert_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ScrArea *sa= CTX_wm_area(C); + View3D *v3d= sa->spacedata.first; + ARegion *ar= CTX_wm_region(C); + Scene *scene= CTX_data_scene(C); + + selectswap(scene, v3d); + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_select_invert(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "Invert selection"; + ot->idname= "VIEW3D_OT_select_invert"; + + /* api callbacks */ + ot->invoke= view3d_select_invert_invoke; + ot->poll= ED_operator_view3d_active; + +} +/* ****** (de)select All *******/ +static int view3d_de_select_all_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ScrArea *sa= CTX_wm_area(C); + View3D *v3d= sa->spacedata.first; + ARegion *ar= CTX_wm_region(C); + Scene *scene= CTX_data_scene(C); + + deselectall(scene, v3d); + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_de_select_all(wmOperatorType *ot) +{ + + /* identifiers */ + ot->name= "deselect all"; + ot->idname= "VIEW3D_OT_de_select_all"; + + /* api callbacks */ + ot->invoke= view3d_de_select_all_invoke; + ot->poll= ED_operator_view3d_active; + +} +/* ****** random selection *******/ +static int view3d_select_random_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ScrArea *sa= CTX_wm_area(C); + View3D *v3d= sa->spacedata.first; + ARegion *ar= CTX_wm_region(C); + Scene *scene= CTX_data_scene(C); + short randfac; + + /*uiPupmenuOperator(C, 0, op, "percent", "percent");*/ + + randfac = RNA_int_get(op->ptr, "percent"); + + selectrandom(scene, v3d, randfac); + + ED_region_tag_redraw(ar); + + return OPERATOR_FINISHED; +} + +void VIEW3D_OT_select_random(wmOperatorType *ot) +{ + PropertyRNA *prop; + + /* identifiers */ + ot->name= "Random selection"; + ot->idname= "VIEW3D_OT_select_random"; + + /* api callbacks */ + ot->invoke= view3d_select_random_invoke; + ot->poll= ED_operator_view3d_active; + + prop = RNA_def_property(ot->srna, "percent", PROP_INT, PROP_NONE); + RNA_def_property_ui_range(prop, 1, 100,1, 1); + RNA_def_property_ui_text(prop, "Percent", "Max persentage that will be selected"); + RNA_def_property_int_default(prop, 50); +} /* ------------------------------------------------------------------------- */ /** The following functions are quick & dirty callback functions called