diff options
42 files changed, 691 insertions, 1186 deletions
diff --git a/release/ui/buttons_physics_softbody.py b/release/ui/buttons_physics_softbody.py index a4bfae3bee8..774f7f67979 100644 --- a/release/ui/buttons_physics_softbody.py +++ b/release/ui/buttons_physics_softbody.py @@ -90,7 +90,7 @@ class PHYSICS_PT_softbody_goal(PhysicButtonsPanel): col.itemL(text="Goal Settings:") col.itemR(softbody, "goal_spring", text="Stiffness") col.itemR(softbody, "goal_friction", text="Damping") - layout.itemR(softbody, "goal_vertex_group", text="Vertex Group") + layout.item_pointerR(softbody, "goal_vertex_group", ob, "vertex_groups", text="Vertex Group") class PHYSICS_PT_softbody_edge(PhysicButtonsPanel): __idname__ = "PHYSICS_PT_softbody_edge" diff --git a/release/ui/buttons_scene.py b/release/ui/buttons_scene.py index df172ea8298..7e1f05d774e 100644 --- a/release/ui/buttons_scene.py +++ b/release/ui/buttons_scene.py @@ -274,4 +274,4 @@ bpy.types.register(RENDER_PT_dimensions) bpy.types.register(RENDER_PT_antialiasing) bpy.types.register(RENDER_PT_shading) bpy.types.register(RENDER_PT_output) -bpy.types.register(RENDER_PT_stamp)
\ No newline at end of file +bpy.types.register(RENDER_PT_stamp) diff --git a/release/ui/space_image.py b/release/ui/space_image.py index 49ef18705c4..53563e76154 100644 --- a/release/ui/space_image.py +++ b/release/ui/space_image.py @@ -257,8 +257,6 @@ class IMAGE_HT_header(bpy.types.Header): if show_uvedit: uvedit = sima.uv_editor - layout.itemS() - layout.itemR(uvedit, "pivot", text="") layout.itemR(settings, "uv_sync_selection", text="") diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index 646c75f50bf..19204710116 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -60,6 +60,7 @@ void POSE_OT_select_invert(struct wmOperatorType *ot); void POSE_OT_select_parent(struct wmOperatorType *ot); void POSE_OT_select_hierarchy(struct wmOperatorType *ot); void POSE_OT_select_linked(struct wmOperatorType *ot); +void POSE_OT_select_constraint_target(struct wmOperatorType *ot); void SKETCH_OT_gesture(struct wmOperatorType *ot); void SKETCH_OT_delete(struct wmOperatorType *ot); diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 5c31883834c..adbfb500eb0 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -153,6 +153,7 @@ void ED_operatortypes_armature(void) WM_operatortype_append(POSE_OT_select_parent); WM_operatortype_append(POSE_OT_select_hierarchy); WM_operatortype_append(POSE_OT_select_linked); + WM_operatortype_append(POSE_OT_select_constraint_target); /* POSELIB */ WM_operatortype_append(POSELIB_OT_browse_interactive); @@ -194,14 +195,12 @@ void ED_keymap_armature(wmWindowManager *wm) kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); - RNA_boolean_set(kmi->ptr, "extend", 0); kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); RNA_boolean_set(kmi->ptr, "extend", 1); kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); - RNA_boolean_set(kmi->ptr, "extend", 0); kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); RNA_boolean_set(kmi->ptr, "extend", 1); @@ -240,14 +239,12 @@ void ED_keymap_armature(wmWindowManager *wm) kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); - RNA_boolean_set(kmi->ptr, "extend", 0); kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", LEFTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_PARENT); RNA_boolean_set(kmi->ptr, "extend", 1); kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, 0, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); - RNA_boolean_set(kmi->ptr, "extend", 0); kmi= WM_keymap_add_item(keymap, "POSE_OT_select_hierarchy", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_enum_set(kmi->ptr, "direction", BONE_SELECT_CHILD); RNA_boolean_set(kmi->ptr, "extend", 1); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 7155bdd6850..97bf3492f7c 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -110,7 +110,7 @@ static void adduplicate() {} /* **************** tools on Editmode Armature **************** */ /* Sync selection to parent for connected children */ -static void armature_sync_selection(ListBase *edbo) +void ED_armature_sync_selection(ListBase *edbo) { EditBone *ebo; @@ -1435,7 +1435,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); /* BIF_undo_push("Select connected"); */ @@ -1668,7 +1668,7 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op) } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT, obedit); @@ -1742,7 +1742,7 @@ void deselectall_armature(Object *obedit, int toggle, int doundo) } } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); if (doundo) { if (sel==1) BIF_undo_push("Select All"); else BIF_undo_push("Deselect All"); @@ -1814,7 +1814,7 @@ void mouse_armature(bContext *C, short mval[2], int extend) nearBone->flag |= selmask; } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); if(nearBone) { /* then now check for active status */ @@ -2246,7 +2246,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op) } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit); @@ -2508,7 +2508,7 @@ static int armature_duplicate_selected_exec(bContext *C, wmOperator *op) if (CTX_DATA_COUNT(C, selected_bones) == 0) return OPERATOR_CANCELLED; - armature_sync_selection(arm->edbo); // XXX why is this needed? + ED_armature_sync_selection(arm->edbo); // XXX why is this needed? preEditBoneDuplicate(arm->edbo); @@ -3058,7 +3058,7 @@ void merge_armature(Scene *scene) } /* undo + updates */ - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); BIF_undo_push("Merge Bones"); } @@ -3080,7 +3080,7 @@ void hide_selected_armature_bones(Scene *scene) } } } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); BIF_undo_push("Hide Bones"); } @@ -3100,7 +3100,7 @@ void hide_unselected_armature_bones(Scene *scene) } } } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); BIF_undo_push("Hide Unselected Bones"); } @@ -3118,7 +3118,7 @@ void show_all_armature_bones(Scene *scene) } } } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); BIF_undo_push("Reveal Bones"); } @@ -3251,7 +3251,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op) if (totbone==0) return OPERATOR_CANCELLED; /* Transform the endpoints */ - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); return OPERATOR_FINISHED; } @@ -3812,7 +3812,7 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op) } CTX_DATA_END; - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); /* note, notifier might evolve */ WM_event_add_notifier(C, NC_OBJECT, ob); @@ -3963,7 +3963,7 @@ static int armature_select_hierarchy_exec(bContext *C, wmOperator *op) } } - armature_sync_selection(arm->edbo); + ED_armature_sync_selection(arm->edbo); WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob); diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index 281f314a546..4a7056274c6 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -443,6 +443,65 @@ void pose_select_constraint_target(Scene *scene) } +static int pose_select_constraint_target_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + bArmature *arm= ob->data; + bPoseChannel *pchan; + bConstraint *con; + int found= 0; + + for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { + if (arm->layer & pchan->bone->layer) { + if (pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) { + for (con= pchan->constraints.first; con; con= con->next) { + bConstraintTypeInfo *cti= constraint_get_typeinfo(con); + ListBase targets = {NULL, NULL}; + bConstraintTarget *ct; + + if (cti && cti->get_constraint_targets) { + cti->get_constraint_targets(con, &targets); + + for (ct= targets.first; ct; ct= ct->next) { + if ((ct->tar == ob) && (ct->subtarget[0])) { + bPoseChannel *pchanc= get_pose_channel(ob->pose, ct->subtarget); + if(pchanc) { + pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL; + found= 1; + } + } + } + + if (cti->flush_constraint_targets) + cti->flush_constraint_targets(con, &targets, 1); + } + } + } + } + } + + if(!found) + return OPERATOR_CANCELLED; + + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob); + + return OPERATOR_FINISHED; +} + +void POSE_OT_select_constraint_target(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Constraint Target"; + ot->idname= "POSE_OT_select_constraint_target"; + + /* api callbacks */ + ot->exec= pose_select_constraint_target_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + /* ******************* select hierarchy operator ************* */ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) @@ -453,6 +512,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) Bone *curbone, *pabone, *chbone; int direction = RNA_enum_get(op->ptr, "direction"); int add_to_sel = RNA_boolean_get(op->ptr, "extend"); + int found= 0; for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) { curbone= pchan->bone; @@ -469,8 +529,8 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) if (!add_to_sel) curbone->flag &= ~BONE_SELECTED; curbone->flag &= ~BONE_ACTIVE; pabone->flag |= (BONE_ACTIVE|BONE_SELECTED); - - // XXX notifiers need to be sent to other editors to update + + found= 1; break; } } else { // BONE_SELECT_CHILD @@ -483,8 +543,8 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) if (!add_to_sel) curbone->flag &= ~BONE_SELECTED; curbone->flag &= ~BONE_ACTIVE; chbone->flag |= (BONE_ACTIVE|BONE_SELECTED); - - // XXX notifiers need to be sent to other editors to update + + found= 1; break; } } @@ -492,6 +552,9 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op) } } + if(!found) + return OPERATOR_CANCELLED; + WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob); return OPERATOR_FINISHED; diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 5283aacf39e..64303c149a8 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -1067,7 +1067,7 @@ void CURVE_OT_spline_weight_set(wmOperatorType *ot) /* api callbacks */ ot->exec= set_weight_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_editsurfcurve; /* flags */ @@ -1118,7 +1118,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot) /* api callbacks */ ot->exec= set_radius_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_editsurfcurve; /* flags */ @@ -4145,7 +4145,7 @@ void CURVE_OT_select_random(wmOperatorType *ot) /* api callbacks */ ot->exec= select_random_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_editsurfcurve; /* flags */ @@ -4179,7 +4179,7 @@ void CURVE_OT_select_every_nth(wmOperatorType *ot) /* api callbacks */ ot->exec= select_every_nth_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_editsurfcurve; /* flags */ diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h index 0f2ac6e3027..f28dbe2a619 100644 --- a/source/blender/editors/include/ED_armature.h +++ b/source/blender/editors/include/ED_armature.h @@ -103,6 +103,7 @@ void mouse_armature(struct bContext *C, short mval[2], int extend); struct Bone *get_indexed_bone (struct Object *ob, int index); float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3]); EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, EditBone *ebo); // XXX this is needed for populating the context iterators +void ED_armature_sync_selection(struct ListBase *edbo); void add_primitive_bone(struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d); diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h index 602e94838b7..f9e427ac006 100644 --- a/source/blender/editors/include/UI_icons.h +++ b/source/blender/editors/include/UI_icons.h @@ -880,3 +880,5 @@ DEF_ICON(VICON_DISCLOSURE_TRI_DOWN) DEF_ICON(VICON_MOVE_UP) DEF_ICON(VICON_MOVE_DOWN) DEF_ICON(VICON_X) +DEF_ICON(VICON_SMALL_TRI_RIGHT) + diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index cf284e7b111..67438120eef 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -544,11 +544,6 @@ void UI_init(void); void UI_init_userdef(void); void UI_exit(void); -/* XXX hide this */ - -uiBut *uiDefMenuButO(uiBlock *block, char *opname, char *name); -uiBut *uiDefMenuSep(uiBlock *block); - /* Layout * * More automated layout of buttons. Has three levels: diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 00ec875bd86..a76fdcbf39d 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -2619,26 +2619,6 @@ uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext, return but; } -static int ui_menu_y(uiBlock *block) -{ - uiBut *but= block->buttons.last; - - if(but) return but->y1; - else return 0; -} - -uiBut *uiDefMenuButO(uiBlock *block, char *opname, char *name) -{ - int y= ui_menu_y(block) - MENU_ITEM_HEIGHT; - return uiDefIconTextButO(block, BUT, opname, WM_OP_INVOKE_REGION_WIN, ICON_BLANK1, name, 0, y, MENU_WIDTH, MENU_ITEM_HEIGHT-1, NULL); -} - -uiBut *uiDefMenuSep(uiBlock *block) -{ - int y= ui_menu_y(block) - MENU_SEP_HEIGHT; - return uiDefBut(block, SEPR, 0, "", 0, y, MENU_WIDTH, MENU_SEP_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); -} - /* END Button containing both string label and icon */ void uiSetButLink(uiBut *but, void **poin, void ***ppoin, short *tot, int from, int to) diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 315b8693905..549164c23a1 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -342,6 +342,28 @@ static void vicon_disclosure_tri_right_draw(int x, int y, int w, int h, float al viconutil_draw_lineloop_smooth(pts, 3); } +static void vicon_small_tri_right_draw(int x, int y, int w, int h, float alpha) +{ + GLint pts[3][2]; + int cx = x+w/2-4; + int cy = y+w/2; + int d = w/5, d2 = w/7; + + viconutil_set_point(pts[0], cx-d2, cy+d); + viconutil_set_point(pts[1], cx-d2, cy-d); + viconutil_set_point(pts[2], cx+d2, cy); + + glColor4f(0.2f, 0.2f, 0.2f, alpha); + + glShadeModel(GL_SMOOTH); + glBegin(GL_TRIANGLES); + glVertex2iv(pts[0]); + glVertex2iv(pts[1]); + glVertex2iv(pts[2]); + glEnd(); + glShadeModel(GL_FLAT); +} + static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alpha) { GLint pts[3][2]; @@ -450,6 +472,7 @@ static void init_internal_icons() def_internal_vicon(VICON_MOVE_UP, vicon_move_up_draw); def_internal_vicon(VICON_MOVE_DOWN, vicon_move_down_draw); def_internal_vicon(VICON_X, vicon_x_draw); + def_internal_vicon(VICON_SMALL_TRI_RIGHT, vicon_small_tri_right_draw); IMB_freeImBuf(bbuf); } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 319e69a40e4..3e009b50045 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -539,6 +539,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re int ofsx; if(panel->paneltab) return; + if(panel->type && (panel->type->flag & PNL_NO_HEADER)) return; /* calculate header rect */ /* + 0.001f to prevent flicker due to float inaccuracy */ @@ -644,6 +645,14 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re /************************** panel alignment *************************/ +static int get_panel_header(Panel *pa) +{ + if(pa->type && (pa->type->flag & PNL_NO_HEADER)) + return 0; + + return PNL_HEADER; +} + /* this function is needed because uiBlock and Panel itself dont change sizey or location when closed */ static int get_panel_real_ofsy(Panel *pa) @@ -656,8 +665,8 @@ static int get_panel_real_ofsy(Panel *pa) static int get_panel_real_ofsx(Panel *pa) { - if(pa->flag & PNL_CLOSEDX) return pa->ofsx+PNL_HEADER; - else if(pa->paneltab && (pa->paneltab->flag & PNL_CLOSEDX)) return pa->ofsx+PNL_HEADER; + if(pa->flag & PNL_CLOSEDX) return pa->ofsx+get_panel_header(pa); + else if(pa->paneltab && (pa->paneltab->flag & PNL_CLOSEDX)) return pa->ofsx+get_panel_header(pa); else return pa->ofsx+pa->sizex; } @@ -762,18 +771,18 @@ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag) /* no smart other default start loc! this keeps switching f5/f6/etc compatible */ ps= panelsort; ps->pa->ofsx= 0; - ps->pa->ofsy= -ps->pa->sizey-PNL_HEADER-style->panelouter; + ps->pa->ofsy= -ps->pa->sizey-get_panel_header(ps->pa)-style->panelouter; for(a=0; a<tot-1; a++, ps++) { psnext= ps+1; if(align==BUT_VERTICAL) { psnext->pa->ofsx= ps->pa->ofsx; - psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-PNL_HEADER-style->panelouter; + psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-get_panel_header(psnext->pa)-style->panelouter; } else { psnext->pa->ofsx= get_panel_real_ofsx(ps->pa); - psnext->pa->ofsy= ps->pa->ofsy + ps->pa->sizey - psnext->pa->sizey; + psnext->pa->ofsy= ps->pa->ofsy + ps->pa->sizey + get_panel_header(ps->pa) - psnext->pa->sizey - get_panel_header(psnext->pa); } } @@ -1200,6 +1209,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) { ARegion *ar= CTX_wm_region(C); uiBlock *block; + Panel *pa; int retval, mx, my, inside_header= 0, inside_scale= 0, inside; retval= WM_UI_HANDLER_CONTINUE; @@ -1215,22 +1225,27 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) /* check if inside boundbox */ inside= 0; + pa= block->panel; + + if(!pa || pa->paneltab!=NULL) + continue; + if(pa->type && pa->type->flag & PNL_NO_HEADER) + continue; - if(block->panel && block->panel->paneltab==NULL) - if(block->minx <= mx && block->maxx >= mx) - if(block->miny <= my && block->maxy+PNL_HEADER >= my) - inside= 1; + if(block->minx <= mx && block->maxx >= mx) + if(block->miny <= my && block->maxy+PNL_HEADER >= my) + inside= 1; if(inside) { /* clicked at panel header? */ - if(block->panel->flag & PNL_CLOSEDX) { + if(pa->flag & PNL_CLOSEDX) { if(block->minx <= mx && block->minx+PNL_HEADER >= mx) inside_header= 1; } else if((block->maxy <= my) && (block->maxy+PNL_HEADER >= my)) { inside_header= 1; } - else if(block->panel->control & UI_PNL_SCALE) { + else if(pa->control & UI_PNL_SCALE) { if(block->maxx-PNL_HEADER <= mx) if(block->miny+PNL_HEADER >= my) inside_scale= 1; @@ -1242,8 +1257,8 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) ui_handle_panel_header(C, block, mx, my); break; } - else if(inside_scale && !(block->panel->flag & PNL_CLOSED)) { - panel_activate_state(C, block->panel, PANEL_STATE_DRAG_SCALE); + else if(inside_scale && !(pa->flag & PNL_CLOSED)) { + panel_activate_state(C, pa, PANEL_STATE_DRAG_SCALE); break; } } @@ -1258,7 +1273,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) int zoom=0; /* if panel is closed, only zoom if mouse is over the header */ - if (block->panel->flag & (PNL_CLOSEDX|PNL_CLOSEDY)) { + if (pa->flag & (PNL_CLOSEDX|PNL_CLOSEDY)) { if (inside_header) zoom=1; } @@ -1271,7 +1286,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event) SpaceLink *sl= sa->spacedata.first; if(sa->spacetype!=SPACE_BUTS) { - if(!(block->panel->control & UI_PNL_SCALE)) { + if(!(pa->control & UI_PNL_SCALE)) { if(event->type==PADPLUSKEY) sl->blockscale+= 0.1; else sl->blockscale-= 0.1; CLAMP(sl->blockscale, 0.6, 1.0); diff --git a/source/blender/editors/interface/keyval.c b/source/blender/editors/interface/keyval.c deleted file mode 100644 index f2172ac8cf0..00000000000 --- a/source/blender/editors/interface/keyval.c +++ /dev/null @@ -1,540 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include "stdio.h" -#include "ctype.h" -#include "string.h" - -#include "BKE_global.h" -#include "BLI_blenlib.h" -#include "BLI_arithb.h" - -#include "WM_types.h" - -char *key_event_to_string(unsigned short event) -{ - - switch(event) { - case AKEY: - return "A"; - break; - case BKEY: - return "B"; - break; - case CKEY: - return "C"; - break; - case DKEY: - return "D"; - break; - case EKEY: - return "E"; - break; - case FKEY: - return "F"; - break; - case GKEY: - return "G"; - break; - case HKEY: - return "H"; - break; - case IKEY: - return "I"; - break; - case JKEY: - return "J"; - break; - case KKEY: - return "K"; - break; - case LKEY: - return "L"; - break; - case MKEY: - return "M"; - break; - case NKEY: - return "N"; - break; - case OKEY: - return "O"; - break; - case PKEY: - return "P"; - break; - case QKEY: - return "Q"; - break; - case RKEY: - return "R"; - break; - case SKEY: - return "S"; - break; - case TKEY: - return "T"; - break; - case UKEY: - return "U"; - break; - case VKEY: - return "V"; - break; - case WKEY: - return "W"; - break; - case XKEY: - return "X"; - break; - case YKEY: - return "Y"; - break; - case ZKEY: - return "Z"; - break; - - case ZEROKEY: - return "Zero"; - break; - case ONEKEY: - return "One"; - break; - case TWOKEY: - return "Two"; - break; - case THREEKEY: - return "Three"; - break; - case FOURKEY: - return "Four"; - break; - case FIVEKEY: - return "Five"; - break; - case SIXKEY: - return "Six"; - break; - case SEVENKEY: - return "Seven"; - break; - case EIGHTKEY: - return "Eight"; - break; - case NINEKEY: - return "Nine"; - break; - - case LEFTCTRLKEY: - return "Leftctrl"; - break; - case LEFTALTKEY: - return "Leftalt"; - break; - case RIGHTALTKEY: - return "Rightalt"; - break; - case RIGHTCTRLKEY: - return "Rightctrl"; - break; - case RIGHTSHIFTKEY: - return "Rightshift"; - break; - case LEFTSHIFTKEY: - return "Leftshift"; - break; - - case ESCKEY: - return "Esc"; - break; - case TABKEY: - return "Tab"; - break; - case RETKEY: - return "Ret"; - break; - case SPACEKEY: - return "Space"; - break; - case LINEFEEDKEY: - return "Linefeed"; - break; - case BACKSPACEKEY: - return "Backspace"; - break; - case DELKEY: - return "Del"; - break; - case SEMICOLONKEY: - return "Semicolon"; - break; - case PERIODKEY: - return "Period"; - break; - case COMMAKEY: - return "Comma"; - break; - case QUOTEKEY: - return "Quote"; - break; - case ACCENTGRAVEKEY: - return "Accentgrave"; - break; - case MINUSKEY: - return "Minus"; - break; - case SLASHKEY: - return "Slash"; - break; - case BACKSLASHKEY: - return "Backslash"; - break; - case EQUALKEY: - return "Equal"; - break; - case LEFTBRACKETKEY: - return "Leftbracket"; - break; - case RIGHTBRACKETKEY: - return "Rightbracket"; - break; - - case LEFTARROWKEY: - return "Leftarrow"; - break; - case DOWNARROWKEY: - return "Downarrow"; - break; - case RIGHTARROWKEY: - return "Rightarrow"; - break; - case UPARROWKEY: - return "Uparrow"; - break; - - case PAD2: - return "Pad2"; - break; - case PAD4: - return "Pad4"; - break; - case PAD6: - return "Pad6"; - break; - case PAD8: - return "Pad8"; - break; - case PAD1: - return "Pad1"; - break; - case PAD3: - return "Pad3"; - break; - case PAD5: - return "Pad5"; - break; - case PAD7: - return "Pad7"; - break; - case PAD9: - return "Pad9"; - break; - - case PADPERIOD: - return "Padperiod"; - break; - case PADSLASHKEY: - return "Padslash"; - break; - case PADASTERKEY: - return "Padaster"; - break; - - case PAD0: - return "Pad0"; - break; - case PADMINUS: - return "Padminus"; - break; - case PADENTER: - return "Padenter"; - break; - case PADPLUSKEY: - return "Padplus"; - break; - - case F1KEY: - return "F1"; - break; - case F2KEY: - return "F2"; - break; - case F3KEY: - return "F3"; - break; - case F4KEY: - return "F4"; - break; - case F5KEY: - return "F5"; - break; - case F6KEY: - return "F6"; - break; - case F7KEY: - return "F7"; - break; - case F8KEY: - return "F8"; - break; - case F9KEY: - return "F9"; - break; - case F10KEY: - return "F10"; - break; - case F11KEY: - return "F11"; - break; - case F12KEY: - return "F12"; - break; - - case PAUSEKEY: - return "Pause"; - break; - case INSERTKEY: - return "Insert"; - break; - case HOMEKEY: - return "Home"; - break; - case PAGEUPKEY: - return "Pageup"; - break; - case PAGEDOWNKEY: - return "Pagedown"; - break; - case ENDKEY: - return "End"; - break; - } - - return ""; -} - -/* - * Decodes key combination strings [qual1+[qual2+[...]]]keyname - * The '+'s may be replaced by '-' or ' ' characters to support different - * formats. No additional whitespace is allowed. The keyname may be an internal - * name, like "RETKEY", or a more common name, like "Return". Decoding is case- - * insensitive. - * - * Example strings: "Ctrl+L", "ALT-ESC", "Shift A" - * - * Returns 1 if successful. - */ -int decode_key_string(char *str, unsigned short *key, unsigned short *qual) -{ - int i, prev, len, invalid=0; - - len= strlen(str); - *key= *qual= 0; - - /* Convert to upper case */ - for (i=0; i<len; i++) { - str[i]= toupper(str[i]); - } - - /* Handle modifiers */ - for (prev=i=0; i<len; i++) { - if (str[i]==' ' || str[i]=='+' || str[i]=='-') { -// XXX if (!strncmp(str+prev, "CTRL", i-prev)) *qual |= LR_CTRLKEY; -// else if (!strncmp(str+prev, "ALT", i-prev)) *qual |= LR_ALTKEY; -// else if (!strncmp(str+prev, "SHIFT", i-prev)) *qual |= LR_SHIFTKEY; -// else if (!strncmp(str+prev, "COMMAND", i-prev)) *qual |= LR_COMMANDKEY; - prev=i+1; - } - } - - /* Compare last part against key names */ - if ((len-prev==1) || ((len-prev==4) && !strncmp(str+prev, "KEY", 3))) { - - if (str[prev]>='A' && str[prev]<='Z') { - *key= str[prev]-'A'+AKEY; - } else if (str[prev]>='0' && str[prev]<='9') { - *key= str[prev]-'0'+ZEROKEY; - } else { - invalid= 1; - } - - } else if (!strncmp(str+prev, "ZEROKEY", len-prev) || !strncmp(str+prev, "ZERO", len-prev)) { - *key= ZEROKEY; - } else if (!strncmp(str+prev, "ONEKEY", len-prev) || !strncmp(str+prev, "ONE", len-prev)) { - *key= ONEKEY; - } else if (!strncmp(str+prev, "TWOKEY", len-prev) || !strncmp(str+prev, "TWO", len-prev)) { - *key= TWOKEY; - } else if (!strncmp(str+prev, "THREEKEY", len-prev) || !strncmp(str+prev, "THREE", len-prev)) { - *key= THREEKEY; - } else if (!strncmp(str+prev, "FOURKEY", len-prev) || !strncmp(str+prev, "FOUR", len-prev)) { - *key= FOURKEY; - } else if (!strncmp(str+prev, "FIVEKEY", len-prev) || !strncmp(str+prev, "FIVE", len-prev)) { - *key= FIVEKEY; - } else if (!strncmp(str+prev, "SIZEKEY", len-prev) || !strncmp(str+prev, "SIX", len-prev)) { - *key= SIXKEY; - } else if (!strncmp(str+prev, "SEVENKEY", len-prev) || !strncmp(str+prev, "SEVEN", len-prev)) { - *key= SEVENKEY; - } else if (!strncmp(str+prev, "EIGHTKEY", len-prev) || !strncmp(str+prev, "EIGHT", len-prev)) { - *key= EIGHTKEY; - } else if (!strncmp(str+prev, "NINEKEY", len-prev) || !strncmp(str+prev, "NINE", len-prev)) { - *key= NINEKEY; - - } else if (!strncmp(str+prev, "ESCKEY", len-prev) || !strncmp(str+prev, "ESC", len-prev)) { - *key= ESCKEY; - } else if (!strncmp(str+prev, "TABKEY", len-prev) || !strncmp(str+prev, "TAB", len-prev)) { - *key= TABKEY; - } else if (!strncmp(str+prev, "RETKEY", len-prev) || !strncmp(str+prev, "RETURN", len-prev) || !strncmp(str+prev, "ENTER", len-prev)) { - *key= RETKEY; - } else if (!strncmp(str+prev, "SPACEKEY", len-prev) || !strncmp(str+prev, "SPACE", len-prev)) { - *key= SPACEKEY; - } else if (!strncmp(str+prev, "LINEFEEDKEY", len-prev) || !strncmp(str+prev, "LINEFEED", len-prev)) { - *key= LINEFEEDKEY; - } else if (!strncmp(str+prev, "BACKSPACEKEY", len-prev) || !strncmp(str+prev, "BACKSPACE", len-prev)) { - *key= BACKSPACEKEY; - } else if (!strncmp(str+prev, "DELKEY", len-prev) || !strncmp(str+prev, "DELETE", len-prev)) { - *key= DELKEY; - - } else if (!strncmp(str+prev, "SEMICOLONKEY", len-prev) || !strncmp(str+prev, "SEMICOLON", len-prev)) { - *key= SEMICOLONKEY; - } else if (!strncmp(str+prev, "PERIODKEY", len-prev) || !strncmp(str+prev, "PERIOD", len-prev)) { - *key= PERIODKEY; - } else if (!strncmp(str+prev, "COMMAKEY", len-prev) || !strncmp(str+prev, "COMMA", len-prev)) { - *key= COMMAKEY; - } else if (!strncmp(str+prev, "QUOTEKEY", len-prev) || !strncmp(str+prev, "QUOTE", len-prev)) { - *key= QUOTEKEY; - } else if (!strncmp(str+prev, "ACCENTGRAVEKEY", len-prev) || !strncmp(str+prev, "ACCENTGRAVE", len-prev)) { - *key= ACCENTGRAVEKEY; - } else if (!strncmp(str+prev, "MINUSKEY", len-prev) || !strncmp(str+prev, "MINUS", len-prev)) { - *key= MINUSKEY; - } else if (!strncmp(str+prev, "SLASHKEY", len-prev) || !strncmp(str+prev, "SLASH", len-prev)) { - *key= SLASHKEY; - } else if (!strncmp(str+prev, "BACKSLASHKEY", len-prev) || !strncmp(str+prev, "BACKSLASH", len-prev)) { - *key= BACKSLASHKEY; - } else if (!strncmp(str+prev, "EQUALKEY", len-prev) || !strncmp(str+prev, "EQUAL", len-prev)) { - *key= EQUALKEY; - } else if (!strncmp(str+prev, "LEFTBRACKETKEY", len-prev) || !strncmp(str+prev, "LEFTBRACKET", len-prev)) { - *key= LEFTBRACKETKEY; - } else if (!strncmp(str+prev, "RIGHTBRACKETKEY", len-prev) || !strncmp(str+prev, "RIGHTBRACKET", len-prev)) { - *key= RIGHTBRACKETKEY; - } else if (!strncmp(str+prev, "DELKEY", len-prev) || !strncmp(str+prev, "DELETE", len-prev)) { - *key= DELKEY; - - } else if (!strncmp(str+prev, "LEFTARROWKEY", len-prev) || !strncmp(str+prev, "LEFTARROW", len-prev)) { - *key= LEFTARROWKEY; - } else if (!strncmp(str+prev, "DOWNARROWKEY", len-prev) || !strncmp(str+prev, "DOWNARROW", len-prev)) { - *key= DOWNARROWKEY; - } else if (!strncmp(str+prev, "RIGHTARROWKEY", len-prev) || !strncmp(str+prev, "RIGHTARROW", len-prev)) { - *key= RIGHTARROWKEY; - } else if (!strncmp(str+prev, "UPARROWKEY", len-prev) || !strncmp(str+prev, "UPARROW", len-prev)) { - *key= UPARROWKEY; - - } else if (!strncmp(str+prev, "PAD", 3)) { - - if (len-prev<=4) { - - if (str[prev]>='0' && str[prev]<='9') { - *key= str[prev]-'0'+ZEROKEY; - } else { - invalid= 1; - } - - } else if (!strncmp(str+prev+3, "PERIODKEY", len-prev-3) || !strncmp(str+prev+3, "PERIOD", len-prev-3)) { - *key= PADPERIOD; - } else if (!strncmp(str+prev+3, "SLASHKEY", len-prev-3) || !strncmp(str+prev+3, "SLASH", len-prev-3)) { - *key= PADSLASHKEY; - } else if (!strncmp(str+prev+3, "ASTERKEY", len-prev-3) || !strncmp(str+prev+3, "ASTERISK", len-prev-3)) { - *key= PADASTERKEY; - } else if (!strncmp(str+prev+3, "MINUSKEY", len-prev-3) || !strncmp(str+prev+3, "MINUS", len-prev-3)) { - *key= PADMINUS; - } else if (!strncmp(str+prev+3, "ENTERKEY", len-prev-3) || !strncmp(str+prev+3, "ENTER", len-prev-3)) { - *key= PADENTER; - } else if (!strncmp(str+prev+3, "PLUSKEY", len-prev-3) || !strncmp(str+prev+3, "PLUS", len-prev-3)) { - *key= PADPLUSKEY; - } else { - invalid= 1; - } - - } else if (!strncmp(str+prev, "F1KEY", len-prev) || !strncmp(str+prev, "F1", len-prev)) { - *key= F1KEY; - } else if (!strncmp(str+prev, "F2KEY", len-prev) || !strncmp(str+prev, "F2", len-prev)) { - *key= F2KEY; - } else if (!strncmp(str+prev, "F3KEY", len-prev) || !strncmp(str+prev, "F3", len-prev)) { - *key= F3KEY; - } else if (!strncmp(str+prev, "F4KEY", len-prev) || !strncmp(str+prev, "F4", len-prev)) { - *key= F4KEY; - } else if (!strncmp(str+prev, "F5KEY", len-prev) || !strncmp(str+prev, "F5", len-prev)) { - *key= F5KEY; - } else if (!strncmp(str+prev, "F6KEY", len-prev) || !strncmp(str+prev, "F6", len-prev)) { - *key= F6KEY; - } else if (!strncmp(str+prev, "F7KEY", len-prev) || !strncmp(str+prev, "F7", len-prev)) { - *key= F7KEY; - } else if (!strncmp(str+prev, "F8KEY", len-prev) || !strncmp(str+prev, "F8", len-prev)) { - *key= F8KEY; - } else if (!strncmp(str+prev, "F9KEY", len-prev) || !strncmp(str+prev, "F9", len-prev)) { - *key= F9KEY; - } else if (!strncmp(str+prev, "F10KEY", len-prev) || !strncmp(str+prev, "F10", len-prev)) { - *key= F10KEY; - } else if (!strncmp(str+prev, "F11KEY", len-prev) || !strncmp(str+prev, "F11", len-prev)) { - *key= F11KEY; - } else if (!strncmp(str+prev, "F12KEY", len-prev) || !strncmp(str+prev, "F12", len-prev)) { - *key= F12KEY; - - } else if (!strncmp(str+prev, "PAUSEKEY", len-prev) || !strncmp(str+prev, "PAUSE", len-prev)) { - *key= PAUSEKEY; - } else if (!strncmp(str+prev, "INSERTKEY", len-prev) || !strncmp(str+prev, "INSERT", len-prev)) { - *key= INSERTKEY; - } else if (!strncmp(str+prev, "HOMEKEY", len-prev) || !strncmp(str+prev, "HOME", len-prev)) { - *key= HOMEKEY; - } else if (!strncmp(str+prev, "PAGEUPKEY", len-prev) || !strncmp(str+prev, "PAGEUP", len-prev)) { - *key= PAGEUPKEY; - } else if (!strncmp(str+prev, "PAGEDOWNKEY", len-prev) || !strncmp(str+prev, "PAGEDOWN", len-prev)) { - *key= PAGEDOWNKEY; - } else if (!strncmp(str+prev, "ENDKEY", len-prev) || !strncmp(str+prev, "END", len-prev)) { - *key= ENDKEY; - - } else { - invalid= 1; - } - - if (!invalid && *key) { - return 1; - } - - return 0; -} diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index 7f5201f4704..3ac6a1778db 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -1947,26 +1947,35 @@ void EM_init_index_arrays(EditMesh *em, int forVert, int forEdge, int forFace) if (forVert) { em->totvert= BLI_countlist(&em->verts); - g_em_vert_array = MEM_mallocN(sizeof(*g_em_vert_array)*em->totvert, "em_v_arr"); - for (i=0,eve=em->verts.first; eve; i++,eve=eve->next) - g_em_vert_array[i] = eve; + if(em->totvert) { + g_em_vert_array = MEM_mallocN(sizeof(*g_em_vert_array)*em->totvert, "em_v_arr"); + + for (i=0,eve=em->verts.first; eve; i++,eve=eve->next) + g_em_vert_array[i] = eve; + } } if (forEdge) { em->totedge= BLI_countlist(&em->edges); - g_em_edge_array = MEM_mallocN(sizeof(*g_em_edge_array)*em->totedge, "em_e_arr"); - for (i=0,eed=em->edges.first; eed; i++,eed=eed->next) - g_em_edge_array[i] = eed; + if(em->totedge) { + g_em_edge_array = MEM_mallocN(sizeof(*g_em_edge_array)*em->totedge, "em_e_arr"); + + for (i=0,eed=em->edges.first; eed; i++,eed=eed->next) + g_em_edge_array[i] = eed; + } } if (forFace) { em->totface= BLI_countlist(&em->faces); - g_em_face_array = MEM_mallocN(sizeof(*g_em_face_array)*em->totface, "em_f_arr"); - for (i=0,efa=em->faces.first; efa; i++,efa=efa->next) - g_em_face_array[i] = efa; + if(em->totface) { + g_em_face_array = MEM_mallocN(sizeof(*g_em_face_array)*em->totface, "em_f_arr"); + + for (i=0,efa=em->faces.first; efa; i++,efa=efa->next) + g_em_face_array[i] = efa; + } } } diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 12138ee13d2..abbbb5aea3d 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -1307,6 +1307,7 @@ static float new_primitive_matrix(bContext *C, float primmat[][4]) static int add_primitive_plane_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1316,6 +1317,7 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_PLANE, mat, 4, 0, 0, dia, 0.0f, 0, 1); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1337,6 +1339,7 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot) static int add_primitive_cube_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1346,6 +1349,7 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_CUBE, mat, 4, 0, 0, dia, 1.0f, 1, 1); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1367,6 +1371,7 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot) static int add_primitive_circle_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1376,6 +1381,7 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_CIRCLE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, 0.0f, 0, RNA_boolean_get(op->ptr, "fill")); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1402,6 +1408,7 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot) static int add_primitive_cylinder_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1411,6 +1418,7 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, RNA_float_get(op->ptr, "depth"), 1, 1); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1437,6 +1445,7 @@ void MESH_OT_primitive_cylinder_add(wmOperatorType *ot) static int add_primitive_tube_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1446,6 +1455,7 @@ static int add_primitive_tube_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_CYLINDER, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, RNA_float_get(op->ptr, "depth"), 1, 0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1472,6 +1482,7 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot) static int add_primitive_cone_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1481,6 +1492,7 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_CONE, mat, RNA_int_get(op->ptr, "vertices"), 0, 0, dia, RNA_float_get(op->ptr, "depth"), 0, RNA_boolean_get(op->ptr, "cap_end")); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1509,6 +1521,7 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot) static int add_primitive_grid_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1518,6 +1531,7 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_GRID, mat, RNA_int_get(op->ptr, "x_subdivisions"), RNA_int_get(op->ptr, "y_subdivisions"), 0, dia, 0.0f, 0, 1); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1544,6 +1558,7 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot) static int add_primitive_monkey_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float mat[4][4]; @@ -1551,6 +1566,7 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_MONKEY, mat, 0, 0, 2, 0.0f, 0.0f, 0, 0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1572,6 +1588,7 @@ void MESH_OT_primitive_monkey_add(wmOperatorType *ot) static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1581,6 +1598,7 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_UVSPHERE, mat, RNA_int_get(op->ptr, "rings"), RNA_int_get(op->ptr, "segments"), 0, dia, 0.0f, 0, 0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; @@ -1607,6 +1625,7 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot) static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); float dia, mat[4][4]; @@ -1616,6 +1635,7 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) make_prim(obedit, PRIM_ICOSPHERE, mat, 0, 0, RNA_int_get(op->ptr, "subdivisions"), dia, 0.0f, 0, 0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); return OPERATOR_FINISHED; diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c index afbf43c4d85..9f804ee8553 100644 --- a/source/blender/editors/mesh/editmesh_loop.c +++ b/source/blender/editors/mesh/editmesh_loop.c @@ -624,6 +624,7 @@ static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct static int knife_cut_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); ARegion *ar= CTX_wm_region(C); @@ -703,6 +704,10 @@ static int knife_cut_exec(bContext *C, wmOperator *op) BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN); BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 70a0c6b82da..67886ee8df5 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -642,25 +642,24 @@ static int unified_findnearest(ViewContext *vc, EditVert **eve, EditEdge **eed, /* **************** SIMILAR "group" SELECTS. FACE, EDGE AND VERTEX ************** */ -/* selects new faces/edges/verts based on the - existing selection - -FACES GROUP - mode 1: same material - mode 2: same image - mode 3: same area - mode 4: same perimeter - mode 5: same normal - mode 6: same co-planer -*/ +/* selects new faces/edges/verts based on the existing selection */ + +/* FACES GROUP */ + +#define SIMFACE_MATERIAL 201 +#define SIMFACE_IMAGE 202 +#define SIMFACE_AREA 203 +#define SIMFACE_PERIMETER 204 +#define SIMFACE_NORMAL 205 +#define SIMFACE_COPLANAR 206 static EnumPropertyItem prop_simface_types[] = { - {1, "MATERIAL", 0, "Material", ""}, - {2, "IMAGE", 0, "Image", ""}, - {3, "AREA", 0, "Area", ""}, - {4, "PERIMETER", 0, "Perimeter", ""}, - {5, "NORMAL", 0, "Normal", ""}, - {6, "COPLANAR", 0, "Co-planar", ""}, + {SIMFACE_MATERIAL, "MATERIAL", 0, "Material", ""}, + {SIMFACE_IMAGE, "IMAGE", 0, "Image", ""}, + {SIMFACE_AREA, "AREA", 0, "Area", ""}, + {SIMFACE_PERIMETER, "PERIMETER", 0, "Perimeter", ""}, + {SIMFACE_NORMAL, "NORMAL", 0, "Normal", ""}, + {SIMFACE_COPLANAR, "COPLANAR", 0, "Co-planar", ""}, {0, NULL, 0, NULL, NULL} }; @@ -695,12 +694,11 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) if (!ok || !deselcount) /* no data selected OR no more data to select */ return 0; - /*if mode is 3 then record face areas, 4 record perimeter */ - if (mode==3) { + if (mode==SIMFACE_AREA) { for(efa= em->faces.first; efa; efa= efa->next) { efa->tmp.fp= EM_face_area(efa); } - } else if (mode==4) { + } else if (mode==SIMFACE_PERIMETER) { for(efa= em->faces.first; efa; efa= efa->next) { efa->tmp.fp= EM_face_perimeter(efa); } @@ -708,7 +706,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) for(base_efa= em->faces.first; base_efa; base_efa= base_efa->next) { if (base_efa->f1) { /* This was one of the faces originaly selected */ - if (mode==1) { /* same material */ + if (mode==SIMFACE_MATERIAL) { /* same material */ for(efa= em->faces.first; efa; efa= efa->next) { if ( !(efa->f & SELECT) && @@ -722,7 +720,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==2) { /* same image */ + } else if (mode==SIMFACE_IMAGE) { /* same image */ MTFace *tf, *base_tf; base_tf = (MTFace*)CustomData_em_get(&em->fdata, base_efa->data, @@ -745,7 +743,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) } } } - } else if (mode==3 || mode==4) { /* same area OR same perimeter, both use the same temp var */ + } else if (mode==SIMFACE_AREA || mode==SIMFACE_PERIMETER) { /* same area OR same perimeter, both use the same temp var */ for(efa= em->faces.first; efa; efa= efa->next) { if ( (!(efa->f & SELECT) && !efa->h) && @@ -758,7 +756,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==5) { /* same normal */ + } else if (mode==SIMFACE_NORMAL) { float angle; for(efa= em->faces.first; efa; efa= efa->next) { if (!(efa->f & SELECT) && !efa->h) { @@ -772,7 +770,7 @@ static int similar_face_select__internal(Scene *scene, EditMesh *em, int mode) } } } - } else if (mode==6) { /* same planer */ + } else if (mode==SIMFACE_COPLANAR) { /* same planer */ float angle, base_dot, dot; base_dot= Inpf(base_efa->cent, base_efa->n); for(efa= em->faces.first; efa; efa= efa->next) { @@ -817,45 +815,26 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void MESH_OT_faces_select_similar(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Similar Face Select"; - ot->idname= "MESH_OT_faces_select_similar"; - - /* api callbacks */ - ot->invoke= WM_menu_invoke; - ot->exec= similar_face_select_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* properties */ - RNA_def_enum(ot->srna, "type", prop_simface_types, 0, "Type", ""); -} - /* ***************************************************** */ -/* -EDGE GROUP - mode 1: same length - mode 2: same direction - mode 3: same number of face users - mode 4: similar face angles. - mode 5: similar crease - mode 6: similar seam - mode 7: similar sharp -*/ +/* EDGE GROUP */ + +#define SIMEDGE_LENGTH 101 +#define SIMEDGE_DIR 102 +#define SIMEDGE_FACE 103 +#define SIMEDGE_FACE_ANGLE 104 +#define SIMEDGE_CREASE 105 +#define SIMEDGE_SEAM 106 +#define SIMEDGE_SHARP 107 static EnumPropertyItem prop_simedge_types[] = { - {1, "LENGTH", 0, "Length", ""}, - {2, "DIR", 0, "Direction", ""}, - {3, "FACE", 0, "Amount of Vertices in Face", ""}, - {4, "FACE_ANGLE", 0, "Face Angles", ""}, - {5, "CREASE", 0, "Crease", ""}, - {6, "SEAM", 0, "Seam", ""}, - {7, "SHARP", 0, "Sharpness", ""}, + {SIMEDGE_LENGTH, "LENGTH", 0, "Length", ""}, + {SIMEDGE_DIR, "DIR", 0, "Direction", ""}, + {SIMEDGE_FACE, "FACE", 0, "Amount of Vertices in Face", ""}, + {SIMEDGE_FACE_ANGLE, "FACE_ANGLE", 0, "Face Angles", ""}, + {SIMEDGE_CREASE, "CREASE", 0, "Crease", ""}, + {SIMEDGE_SEAM, "SEAM", 0, "Seam", ""}, + {SIMEDGE_SHARP, "SHARP", 0, "Sharpness", ""}, {0, NULL, 0, NULL, NULL} }; @@ -883,19 +862,19 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) /* set all eed->tmp.l to 0 we use it later. for counting face users*/ eed->tmp.l=0; - eed->f2=0; /* only for mode 4, edge animations */ + eed->f2=0; /* only for mode SIMEDGE_FACE_ANGLE, edge animations */ } } if (!ok || !deselcount) /* no data selected OR no more data to select*/ return 0; - if (mode==1) { /*store length*/ + if (mode==SIMEDGE_LENGTH) { /*store length*/ for(eed= em->edges.first; eed; eed= eed->next) { if (!eed->h) /* dont calc data for hidden edges*/ eed->tmp.fp= VecLenf(eed->v1->co, eed->v2->co); } - } else if (mode==3) { /*store face users*/ + } else if (mode==SIMEDGE_FACE) { /*store face users*/ EditFace *efa; /* cound how many faces each edge uses use tmp->l */ for(efa= em->faces.first; efa; efa= efa->next) { @@ -904,7 +883,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) efa->e3->tmp.l++; if (efa->e4) efa->e4->tmp.l++; } - } else if (mode==4) { /*store edge angles */ + } else if (mode==SIMEDGE_FACE_ANGLE) { /*store edge angles */ EditFace *efa; int j; /* cound how many faces each edge uses use tmp.l */ @@ -946,7 +925,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) for(base_eed= em->edges.first; base_eed; base_eed= base_eed->next) { if (base_eed->f1) { - if (mode==1) { /* same length */ + if (mode==SIMEDGE_LENGTH) { /* same length */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -960,7 +939,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==2) { /* same direction */ + } else if (mode==SIMEDGE_DIR) { /* same direction */ float base_dir[3], dir[3], angle; VecSubf(base_dir, base_eed->v1->co, base_eed->v2->co); for(eed= em->edges.first; eed; eed= eed->next) { @@ -980,7 +959,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) } } } - } else if (mode==3) { /* face users */ + } else if (mode==SIMEDGE_FACE) { /* face users */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -994,7 +973,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==4 && base_eed->f2==2) { /* edge angles, f2==2 means the edge has an angle. */ + } else if (mode==SIMEDGE_FACE_ANGLE && base_eed->f2==2) { /* edge angles, f2==2 means the edge has an angle. */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -1009,7 +988,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==5) { /* edge crease */ + } else if (mode==SIMEDGE_CREASE) { /* edge crease */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -1023,7 +1002,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==6) { /* edge seam */ + } else if (mode==SIMEDGE_SEAM) { /* edge seam */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -1037,7 +1016,7 @@ static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode) return selcount; } } - } else if (mode==7) { /* edge sharp */ + } else if (mode==SIMEDGE_SHARP) { /* edge sharp */ for(eed= em->edges.first; eed; eed= eed->next) { if ( !(eed->f & SELECT) && @@ -1078,24 +1057,6 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void MESH_OT_edges_select_similar(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Similar Edge Select"; - ot->idname= "MESH_OT_edges_select_similar"; - - /* api callbacks */ - ot->invoke= WM_menu_invoke; - ot->exec= similar_edge_select_exec; - ot->poll= ED_operator_editmesh; - - /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* properties */ - RNA_def_enum(ot->srna, "type", prop_simedge_types, 0, "Type", ""); -} - /* ********************************* */ /* @@ -1104,10 +1065,15 @@ VERT GROUP mode 2: same number of face users mode 3: same vertex groups */ + +#define SIMVERT_NORMAL 0 +#define SIMVERT_FACE 1 +#define SIMVERT_VGROUP 2 + static EnumPropertyItem prop_simvertex_types[] = { - {0, "NORMAL", 0, "Normal", ""}, - {1, "FACE", 0, "Amount of Vertices in Face", ""}, - {2, "VGROUP", 0, "Vertex Groups", ""}, + {SIMVERT_NORMAL, "NORMAL", 0, "Normal", ""}, + {SIMVERT_FACE, "FACE", 0, "Amount of Vertices in Face", ""}, + {SIMVERT_VGROUP, "VGROUP", 0, "Vertex Groups", ""}, {0, NULL, 0, NULL, NULL} }; @@ -1124,6 +1090,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) /*count how many visible selected edges there are, so we can return when there are none left */ unsigned int deselcount=0; + int mode= RNA_enum_get(op->ptr, "type"); short ok=0; float thresh= scene->toolsettings->select_thresh; @@ -1148,7 +1115,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) return 0; } - if(RNA_enum_is_equal(op->ptr, "type", "FACE")) { + if(mode == SIMVERT_FACE) { /* store face users */ EditFace *efa; @@ -1165,7 +1132,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) for(base_eve= em->verts.first; base_eve; base_eve= base_eve->next) { if (base_eve->f1) { - if(RNA_enum_is_equal(op->ptr, "type", "NORMAL")) { + if(mode == SIMVERT_NORMAL) { float angle; for(eve= em->verts.first; eve; eve= eve->next) { if (!(eve->f & SELECT) && !eve->h) { @@ -1182,7 +1149,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) } } } - else if(RNA_enum_is_equal(op->ptr, "type", "FACE")) { + else if(mode == SIMVERT_FACE) { for(eve= em->verts.first; eve; eve= eve->next) { if ( !(eve->f & SELECT) && @@ -1199,7 +1166,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) } } } - else if(RNA_enum_is_equal(op->ptr, "type", "VGROUP")) { + else if(mode == SIMVERT_VGROUP) { MDeformVert *dvert, *base_dvert; short i, j; /* weight index */ @@ -1248,22 +1215,45 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void MESH_OT_vertices_select_similar(wmOperatorType *ot) +static int select_similar_exec(bContext *C, wmOperator *op) { + int type= RNA_enum_get(op->ptr, "type"); + + if(type < 100) + return similar_vert_select_exec(C, op); + else if(type < 200) + return similar_edge_select_exec(C, op); + else + return similar_face_select_exec(C, op); +} + +static EnumPropertyItem *select_similar_type_itemf(PointerRNA *ptr) +{ + /* XXX need context! */ + return prop_simface_types; + return prop_simvertex_types; + return prop_simedge_types; +} + +void MESH_OT_select_similar(wmOperatorType *ot) +{ + PropertyRNA *prop; + /* identifiers */ - ot->name= "Similar Vertex Select"; - ot->idname= "MESH_OT_vertices_select_similar"; + ot->name= "Select Similar"; + ot->idname= "MESH_OT_select_similar"; /* api callbacks */ ot->invoke= WM_menu_invoke; - ot->exec= similar_vert_select_exec; + ot->exec= select_similar_exec; ot->poll= ED_operator_editmesh; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "type", prop_simvertex_types, 0, "Type", ""); + prop= RNA_def_enum(ot->srna, "type", prop_simvertex_types, 0, "Type", ""); + RNA_def_enum_funcs(prop, select_similar_type_itemf); } /* ******************************************* */ @@ -2740,20 +2730,24 @@ void MESH_OT_reveal(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -void select_faces_by_numverts(EditMesh *em, wmOperator *op, int numverts) +int select_by_number_vertices_exec(bContext *C, wmOperator *op) { + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); EditFace *efa; + int numverts= RNA_enum_get(op->ptr, "type"); /* Selects trias/qiads or isolated verts, and edges that do not have 2 neighboring * faces */ /* for loose vertices/edges, we first select all, loop below will deselect */ - if(numverts==5) + if(numverts==5) { EM_set_flag_all(em, SELECT); + } else if(em->selectmode!=SCE_SELECT_FACE) { BKE_report(op->reports, RPT_ERROR, "Only works in face selection mode"); - return; + return OPERATOR_CANCELLED; } for(efa= em->faces.first; efa; efa= efa->next) { @@ -2765,8 +2759,32 @@ void select_faces_by_numverts(EditMesh *em, wmOperator *op, int numverts) } } -// if (EM_texFaceCheck()) + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + return OPERATOR_FINISHED; +} + +void MESH_OT_select_by_number_vertices(wmOperatorType *ot) +{ + static const EnumPropertyItem type_items[]= { + {3, "TRIANGLES", 0, "Triangles", NULL}, + {4, "QUADS", 0, "Triangles", NULL}, + {5, "OTHER", 0, "Other", NULL}, + {0, NULL, 0, NULL, NULL}}; + + /* identifiers */ + ot->name= "Select by Number of Vertices"; + ot->idname= "MESH_OT_select_by_number_vertices"; + + /* api callbacks */ + ot->exec= select_by_number_vertices_exec; + ot->poll= ED_operator_editmesh; + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_enum(ot->srna, "type", type_items, 3, "Type", "Type of elements to select."); } static int select_sharp_edges_exec(bContext *C, wmOperator *op) @@ -3475,6 +3493,7 @@ void MESH_OT_select_random(wmOperatorType *ot) /* api callbacks */ ot->exec= mesh_select_random_exec; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_editmesh; /* flags */ @@ -3580,6 +3599,7 @@ void MESH_OT_selection_type(wmOperatorType *ot) static int editmesh_mark_seam(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); Mesh *me= ((Mesh *)obedit->data); @@ -3610,9 +3630,11 @@ static int editmesh_mark_seam(bContext *C, wmOperator *op) } } + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -3634,6 +3656,7 @@ void MESH_OT_mark_seam(wmOperatorType *ot) static int editmesh_mark_sharp(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); Mesh *me= ((Mesh *)obedit->data); @@ -3659,9 +3682,11 @@ static int editmesh_mark_sharp(bContext *C, wmOperator *op) } } + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -4055,6 +4080,7 @@ void righthandfaces(EditMesh *em, int select) /* makes faces righthand turning * static int righthandfaces_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); @@ -4063,9 +4089,11 @@ static int righthandfaces_exec(bContext *C, wmOperator *op) // XXX need other args righthandfaces(em, RNA_boolean_get(op->ptr, "inside")); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); //TODO is this needed ? - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -4398,11 +4426,11 @@ static int smooth_vertex(bContext *C, wmOperator *op) recalc_editnormals(em); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + BKE_mesh_end_editmesh(obedit->data, em); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -4531,9 +4559,11 @@ static int vertices_to_sphere_exec(bContext *C, wmOperator *op) vertices_to_sphere(scene, v3d, obedit, em, RNA_float_get(op->ptr,"percent")); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -4576,6 +4606,7 @@ void flipface(EditMesh *em, EditFace *efa) static int flip_editnormals(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); EditFace *efa; @@ -4592,6 +4623,10 @@ static int flip_editnormals(bContext *C, wmOperator *op) recalc_editnormals(em); BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } @@ -4608,3 +4643,4 @@ void MESH_OT_flip_editnormals(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index dc9c8c6b6d2..2c3007d00ad 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -496,6 +496,7 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_INFO, msg); } + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -698,28 +699,33 @@ void extrude_mesh(Object *obedit, EditMesh *em, wmOperator *op) // XXX should be a menu item static int mesh_extrude_invoke(bContext *C, wmOperator *op, wmEvent *event) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); extrude_mesh(obedit,em, op); + + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); - - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } /* extrude without transform */ static int mesh_extrude_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(obedit->data); extrude_mesh(obedit,em, op); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -747,6 +753,7 @@ void MESH_OT_extrude(wmOperatorType *ot) static int split_mesh(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -760,9 +767,9 @@ static int split_mesh(bContext *C, wmOperator *op) WM_cursor_wait(0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -784,6 +791,7 @@ void MESH_OT_split(wmOperatorType *ot) static int extrude_repeat_mesh(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -819,9 +827,9 @@ static int extrude_repeat_mesh(bContext *C, wmOperator *op) EM_fgon_flags(em); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -931,16 +939,19 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float static int spin_mesh_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); int ok; - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - ok= spin_mesh(C, op, NULL, RNA_int_get(op->ptr,"steps"), RNA_float_get(op->ptr,"degrees"), RNA_boolean_get(op->ptr,"dupli")); if(ok==0) { BKE_report(op->reports, RPT_ERROR, "No valid vertices are selected"); return OPERATOR_CANCELLED; } + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } @@ -983,6 +994,7 @@ void MESH_OT_spin(wmOperatorType *ot) static int screw_mesh_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditVert *eve,*v1=0,*v2=0; @@ -1038,7 +1050,9 @@ static int screw_mesh_exec(bContext *C, wmOperator *op) } if(spin_mesh(C, op, dvec, turns*steps, 360.0f*turns, 0)) { + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -1047,8 +1061,6 @@ static int screw_mesh_exec(bContext *C, wmOperator *op) BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_CANCELLED; } - - BKE_mesh_end_editmesh(obedit->data, em); } /* get center and axis, in global coords */ @@ -1267,8 +1279,6 @@ void delete_mesh(Object *obedit, EditMesh *em, wmOperator *op, int event) } EM_fgon_flags(em); // redo flags and indices for fgons - -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); } /* Note, these values must match delete_mesh() event values */ @@ -1285,11 +1295,13 @@ static EnumPropertyItem prop_mesh_delete_types[] = { static int delete_mesh_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); - delete_mesh(obedit,em, op,RNA_enum_get(op->ptr, "type")); + delete_mesh(obedit, em, op, RNA_enum_get(op->ptr, "type")); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -2898,7 +2910,6 @@ void esubdivideflag(Object *obedit, EditMesh *em, int flag, float rad, int beaut } recalc_editnormals(em); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); } static int count_selected_edges(EditEdge *ed) @@ -3379,7 +3390,6 @@ void join_triangles(EditMesh *em) if(edsortblock) MEM_freeN(edsortblock); EM_selectmode_flush(em); -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); } /* ******************** END TRIANGLE TO QUAD ************************************* */ @@ -3475,9 +3485,6 @@ void edge_flip(EditMesh *em) free_tagged_edges_faces(em, em->edges.first, em->faces.first); MEM_freeN(efaar); - -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - } static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir) @@ -3658,6 +3665,7 @@ static void edge_rotate(EditMesh *em, wmOperator *op, EditEdge *eed,int dir) /* only accepts 1 selected edge, or 2 selected faces */ static int edge_rotate_selected(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -3722,10 +3730,9 @@ static int edge_rotate_selected(bContext *C, wmOperator *op) /* flush selected vertices (again) to edges/faces */ EM_select_flush(em); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; @@ -4733,9 +4740,6 @@ void mesh_set_smooth_faces(EditMesh *em, short event) } efa= efa->next; } - -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - } /* ********************** mesh rip ********************** */ @@ -4776,6 +4780,7 @@ static void mesh_rip_setface(EditMesh *em, EditFace *sefa) /* based on mouse cursor position, it defines how is being ripped */ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event) { + Scene *scene= CTX_data_scene(C); ARegion *ar= CTX_wm_region(C); RegionView3D *rv3d= ar->regiondata; Object *obedit= CTX_data_edit_object(C); @@ -4977,13 +4982,17 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event) } } + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + + BKE_mesh_end_editmesh(obedit->data, em); + RNA_int_set(op->ptr, "mode", TFM_TRANSLATION); WM_operator_name_call(C, "TFM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); // scene->prop_mode = propmode; // XXX scene->proportional = prop; - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -5762,8 +5771,13 @@ typedef struct PathEdge{ float w; } PathEdge; -void pathselect(EditMesh *em, wmOperator *op) +#define PATH_SELECT_EDGE_LENGTH 0 +#define PATH_SELECT_TOPOLOGICAL 1 + +int select_vertex_path_exec(bContext *C, wmOperator *op) { + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); EditVert *eve, *s, *t; EditEdge *eed; EditSelection *ese; @@ -5812,9 +5826,7 @@ void pathselect(EditMesh *em, wmOperator *op) } } - - - if(s->f1 && t->f1){ /*t can be reached by s*/ + if(s->f1 && t->f1){ /* t can be reached by s */ Q = MEM_callocN(sizeof(PathNode)*totnodes, "Path Select Nodes"); totnodes = 0; for(eve=em->verts.first; eve; eve=eve->next){ @@ -5908,15 +5920,41 @@ void pathselect(EditMesh *em, wmOperator *op) MEM_freeN(previous); BLI_heap_free(heap, NULL); EM_select_flush(em); - // DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - -// if (EM_texFaceCheck()) } } - else{ + else { + BKE_mesh_end_editmesh(obedit->data, em); BKE_report(op->reports, RPT_ERROR, "Path Selection requires that exactly two vertices be selected"); - return; + return OPERATOR_CANCELLED; } + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + BKE_mesh_end_editmesh(obedit->data, em); + + return OPERATOR_FINISHED; +} + +void MESH_OT_select_vertex_path(wmOperatorType *ot) +{ + static const EnumPropertyItem type_items[] = { + {PATH_SELECT_EDGE_LENGTH, "EDGE_LENGTH", 0, "Edge Length", NULL}, + {PATH_SELECT_TOPOLOGICAL, "TOPOLOGICAL", 0, "Topological", NULL}, + {0, NULL, 0, NULL, NULL}}; + + /* identifiers */ + ot->name= "Select Vertex Path"; + ot->idname= "MESH_OT_select_vertex_path"; + + /* api callbacks */ + ot->exec= select_vertex_path_exec; + ot->invoke= WM_menu_invoke; + ot->poll= ED_operator_editmesh; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + RNA_def_enum(ot->srna, "type", type_items, PATH_SELECT_EDGE_LENGTH, "Type", "Method to compute distance."); } static int region_to_loop(bContext *C, wmOperator *op) @@ -6156,6 +6194,7 @@ void MESH_OT_loop_to_region(wmOperatorType *ot) static int mesh_rotate_uvs(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -6219,17 +6258,20 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op) } } - if (change) { -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - } - BKE_mesh_end_editmesh(obedit->data, em); + + if(!change) + return OPERATOR_CANCELLED; + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } static int mesh_mirror_uvs(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -6308,17 +6350,20 @@ static int mesh_mirror_uvs(bContext *C, wmOperator *op) } } - if (change) { -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - } - BKE_mesh_end_editmesh(obedit->data, em); + + if(!change) + return OPERATOR_CANCELLED; + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } static int mesh_rotate_colors(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -6364,18 +6409,21 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op) } } - if (change) { -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - } - BKE_mesh_end_editmesh(obedit->data, em); + + if(!change) + return OPERATOR_CANCELLED; + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } static int mesh_mirror_colors(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); @@ -6420,12 +6468,14 @@ static int mesh_mirror_colors(bContext *C, wmOperator *op) } } - if (change) { -// DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); - WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - } - BKE_mesh_end_editmesh(obedit->data, em); + + if(!change) + return OPERATOR_CANCELLED; + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); + return OPERATOR_FINISHED; } @@ -6487,15 +6537,17 @@ void MESH_OT_colors_mirror(wmOperatorType *ot) static int subdivide_exec(bContext *C, wmOperator *op) { - Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, 1, 0); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6515,15 +6567,17 @@ void MESH_OT_subdivide(wmOperatorType *ot) static int subdivide_multi_exec(bContext *C, wmOperator *op) { - Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); esubdivideflag(obedit, em, 1, 0.0, scene->toolsettings->editbutflag, RNA_int_get(op->ptr,"number_cuts"), 0); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6546,15 +6600,17 @@ void MESH_OT_subdivide_multi(wmOperatorType *ot) static int subdivide_multi_fractal_exec(bContext *C, wmOperator *op) { - Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); esubdivideflag(obedit, em, 1, -(RNA_float_get(op->ptr, "random_factor")/100), scene->toolsettings->editbutflag, RNA_int_get(op->ptr, "number_cuts"), 0); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6578,15 +6634,15 @@ void MESH_OT_subdivide_multi_fractal(wmOperatorType *ot) static int subdivide_smooth_exec(bContext *C, wmOperator *op) { - Object *obedit= CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); + Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); esubdivideflag(obedit, em, 1, 0.292f*RNA_float_get(op->ptr, "smoothness"), scene->toolsettings->editbutflag | B_SMOOTH, 1, 0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6922,15 +6978,17 @@ static void fill_mesh(EditMesh *em) static int fill_mesh_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); fill_mesh(em); - DAG_object_flush_update(CTX_data_scene(C), obedit, OB_RECALC_DATA); - + + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6951,14 +7009,17 @@ void MESH_OT_fill(wmOperatorType *ot) static int beauty_fill_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); beauty_fill(em); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -6978,11 +7039,13 @@ void MESH_OT_beauty_fill(wmOperatorType *ot) static int quads_convert_to_tris_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); convert_to_triface(em,0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -7005,11 +7068,13 @@ void MESH_OT_quads_convert_to_tris(wmOperatorType *ot) static int tris_convert_to_quads_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); join_triangles(em); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -7032,11 +7097,13 @@ void MESH_OT_tris_convert_to_quads(wmOperatorType *ot) static int edge_flip_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); edge_flip(em); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); BKE_mesh_end_editmesh(obedit->data, em); @@ -7059,14 +7126,17 @@ void MESH_OT_edge_flip(wmOperatorType *ot) static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); mesh_set_smooth_faces(em,1); + BKE_mesh_end_editmesh(obedit->data, em); + + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -7086,14 +7156,15 @@ void MESH_OT_faces_shade_smooth(wmOperatorType *ot) static int mesh_faces_shade_solid_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data); mesh_set_smooth_faces(em,0); + DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); - BKE_mesh_end_editmesh(obedit->data, em); return OPERATOR_FINISHED; } @@ -7110,3 +7181,4 @@ void MESH_OT_faces_shade_solid(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } + diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 22e3b4060a4..ff07d03313b 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -155,13 +155,12 @@ void MESH_OT_select_linked(struct wmOperatorType *ot); void MESH_OT_select_linked_pick(struct wmOperatorType *ot); void MESH_OT_hide(struct wmOperatorType *ot); void MESH_OT_reveal(struct wmOperatorType *ot); +void MESH_OT_select_by_number_vertices(struct wmOperatorType *ot); void MESH_OT_normals_make_consistent(struct wmOperatorType *ot); void MESH_OT_faces_select_linked_flat(struct wmOperatorType *ot); void MESH_OT_edges_select_sharp(struct wmOperatorType *ot); void MESH_OT_select_shortest_path(struct wmOperatorType *ot); -void MESH_OT_vertices_select_similar(struct wmOperatorType *ot); -void MESH_OT_edges_select_similar(struct wmOperatorType *ot); -void MESH_OT_faces_select_similar(struct wmOperatorType *ot); +void MESH_OT_select_similar(struct wmOperatorType *ot); void MESH_OT_select_random(struct wmOperatorType *ot); void MESH_OT_vertices_transform_to_sphere(struct wmOperatorType *ot); void MESH_OT_selection_type(struct wmOperatorType *ot); @@ -223,6 +222,7 @@ void MESH_OT_faces_shade_solid(struct wmOperatorType *ot); void MESH_OT_split(struct wmOperatorType *ot); void MESH_OT_extrude_repeat(struct wmOperatorType *ot); void MESH_OT_edge_rotate(struct wmOperatorType *ot); +void MESH_OT_select_vertex_path(struct wmOperatorType *ot); void MESH_OT_loop_to_region(struct wmOperatorType *ot); void MESH_OT_region_to_loop(struct wmOperatorType *ot); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 2a9357ed0f0..7e59cd684ba 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -119,6 +119,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_selection_type); WM_operatortype_append(MESH_OT_hide); WM_operatortype_append(MESH_OT_reveal); + WM_operatortype_append(MESH_OT_select_by_number_vertices); WM_operatortype_append(MESH_OT_normals_make_consistent); WM_operatortype_append(MESH_OT_subdivide); WM_operatortype_append(MESH_OT_subdivide_multi); @@ -149,6 +150,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_split); WM_operatortype_append(MESH_OT_extrude_repeat); WM_operatortype_append(MESH_OT_edge_rotate); + WM_operatortype_append(MESH_OT_select_vertex_path); WM_operatortype_append(MESH_OT_loop_to_region); WM_operatortype_append(MESH_OT_region_to_loop); @@ -172,9 +174,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_loop_select); WM_operatortype_append(MESH_OT_edge_face_add); WM_operatortype_append(MESH_OT_select_shortest_path); - WM_operatortype_append(MESH_OT_vertices_select_similar); - WM_operatortype_append(MESH_OT_edges_select_similar); - WM_operatortype_append(MESH_OT_faces_select_similar); + WM_operatortype_append(MESH_OT_select_similar); WM_operatortype_append(MESH_OT_loop_multi_select); WM_operatortype_append(MESH_OT_mark_seam); WM_operatortype_append(MESH_OT_mark_sharp); @@ -223,7 +223,6 @@ void ED_keymap_mesh(wmWindowManager *wm) RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0); RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_edges_select_sharp", SKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0); - WM_keymap_add_item(keymap, "MESH_OT_select_random", SPACEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_vertices_transform_to_sphere", SKEY, KM_PRESS, KM_CTRL|KM_SHIFT , 0); WM_keymap_add_item(keymap, "MESH_OT_mark_seam", ONEKEY, KM_PRESS, KM_CTRL , 0); @@ -232,10 +231,7 @@ void ED_keymap_mesh(wmWindowManager *wm) WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_CTRL , 0); RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_mark_sharp", TWOKEY, KM_PRESS, KM_ALT , 0)->ptr,"set",1); - /* temp hotkeys! */ - WM_keymap_add_item(keymap, "MESH_OT_vertices_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0); - WM_keymap_add_item(keymap, "MESH_OT_edges_select_similar", GKEY, KM_PRESS, KM_SHIFT2|KM_CTRL, 0); - WM_keymap_add_item(keymap, "MESH_OT_faces_select_similar", GKEY, KM_PRESS, KM_SHIFT|KM_CTRL2, 0); + WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0); /* selection mode */ WM_keymap_add_item(keymap, "MESH_OT_selection_type", TABKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/physics/editparticle.c b/source/blender/editors/physics/editparticle.c index 1b6b5b43522..b656aa8fbf6 100644 --- a/source/blender/editors/physics/editparticle.c +++ b/source/blender/editors/physics/editparticle.c @@ -1826,7 +1826,7 @@ void PARTICLE_OT_rekey(wmOperatorType *ot) /* api callbacks */ ot->exec= rekey_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= PE_poll; /* flags */ diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index dd8efd68604..1a061172ec1 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1128,8 +1128,6 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex em= (ar->type->minsizex)? 10: 20; } - header= 20; // XXX - triangle= 22; x= 0; y= -style->panelouter; @@ -1150,10 +1148,14 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS); panel= uiBeginPanel(sa, ar, block, pt, &open); + /* bad fixed values */ + header= (pt->flag & PNL_NO_HEADER)? 0: 20; + triangle= 22; + if(vertical) y -= header; - if(pt->draw_header && (open || vertical)) { + if(pt->draw_header && header && (open || vertical)) { /* for enabled buttons */ panel->layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, triangle, header+style->panelspace, header, 1, style); diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index 02179f347f5..97644097108 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -685,7 +685,7 @@ void buttons_context_draw(const bContext *C, uiLayout *layout) if(!path) return; - row= uiLayoutRow(layout, 0); + row= uiLayoutRow(layout, 1); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT); block= uiLayoutGetBlock(row); @@ -696,18 +696,18 @@ void buttons_context_draw(const bContext *C, uiLayout *layout) for(a=0; a<path->len; a++) { ptr= &path->ptr[a]; + if(a != 0) + uiDefIconBut(block, LABEL, 0, VICON_SMALL_TRI_RIGHT, 0, 0, 10, UI_UNIT_Y, NULL, 0, 0, 0, 0, ""); + if(ptr->data) { icon= RNA_struct_ui_icon(ptr->type); name= RNA_struct_name_get_alloc(ptr, namebuf, sizeof(namebuf)); -#if 0 - if(sbuts->mainb != BCONTEXT_SCENE && ptr->type == &RNA_Scene) { - uiItemL(row, "", icon); /* save some space */ - } - else -#endif if(name) { - uiItemL(row, name, icon); + if(sbuts->mainb != BCONTEXT_SCENE && ptr->type == &RNA_Scene) + uiItemL(row, "", icon); /* save some space */ + else + uiItemL(row, name, icon); if(name != namebuf) MEM_freeN(name); @@ -731,6 +731,7 @@ void buttons_context_register(ARegionType *art) strcpy(pt->idname, "BUTTONS_PT_context"); strcpy(pt->label, "Context"); pt->draw= buttons_panel_context; + pt->flag= PNL_NO_HEADER; BLI_addtail(&art->paneltypes, pt); } diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 24781cc115e..358da483744 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1060,7 +1060,7 @@ void IMAGE_OT_new(wmOperatorType *ot) /* api callbacks */ ot->exec= new_exec; - ot->invoke= WM_operator_redo; + ot->invoke= WM_operator_props_popup; ot->poll= ED_operator_image_active; /* flags */ diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 7d6faa00dfc..a1217f84380 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -294,6 +294,13 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) case NC_IMAGE: ED_area_tag_redraw(sa); break; + case NC_OBJECT: + switch(wmn->data) { + case ND_GEOM_SELECT: + case ND_GEOM_DATA: + ED_area_tag_redraw(sa); + break; + } } } @@ -395,6 +402,10 @@ static void image_main_area_init(wmWindowManager *wm, ARegion *ar) /* image paint polls for mode */ keymap= WM_keymap_listbase(wm, "ImagePaint", SPACE_IMAGE, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); + + /* XXX need context here? + keymap= WM_keymap_listbase(wm, "UVEdit", 0, 0); + WM_event_add_keymap_handler(&ar->handlers, keymap);*/ /* own keymaps */ keymap= WM_keymap_listbase(wm, "Image Generic", SPACE_IMAGE, 0); @@ -459,13 +470,6 @@ static void image_main_area_listener(ARegion *ar, wmNotifier *wmn) break; } break; - case NC_OBJECT: - switch(wmn->data) { - case ND_GEOM_SELECT: - case ND_GEOM_DATA: - ED_region_tag_redraw(ar); - break; - } } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 5f475b004b9..e8749537f5e 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2969,7 +2969,6 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix { float vec[3], vec2[3]; float *vd = pdd->vd; - float *nd = pdd->nd; float *cd = pdd->cd; float ma_r; float ma_g; diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index a0d1b911370..5b378f39cd0 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -1007,203 +1007,67 @@ static uiBlock *view3d_select_object_groupedmenu(bContext *C, ARegion *ar, void #endif -static uiBlock *view3d_select_objectmenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_select_objectmenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiBlock *block; -// short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_objectmenu", UI_EMBOSSP); - + uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); + + uiItemS(layout); + + uiItemO(layout, "Select/Deselect All", 0, "OBJECT_OT_select_all_toggle"); + uiItemO(layout, "Inverse", 0, "OBJECT_OT_select_invert"); + uiItemO(layout, "Random", 0, "OBJECT_OT_select_random"); + uiItemO(layout, "Select All by Layer", 0, "OBJECT_OT_select_by_layer"); + uiItemMenuEnumO(layout, "Select All by Type", 0, "OBJECT_OT_select_by_type", "type"); + #if 0 - uiBlockSetButmFunc(block, do_view3d_select_objectmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - + + uiItemS(layout); + uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, ""); uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, ""); #endif - uiDefMenuButO(block, "VIEW3D_OT_select_border", "Border Select"); - - uiDefMenuSep(block); - - uiDefMenuButO(block, "OBJECT_OT_select_all_toggle", "Select/Deselect All"); - uiDefMenuButO(block, "OBJECT_OT_select_invert", "Inverse"); - uiDefMenuButO(block, "OBJECT_OT_select_random", "Random"); - uiDefMenuButO(block, "OBJECT_OT_select_by_layer", "Select All by Layer"); - uiDefMenuButO(block, "OBJECT_OT_select_by_type", "Select All by Type"); - - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - return block; } -void do_view3d_select_meshmenu(bContext *C, void *arg, int event) +static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 -/* extern void borderselect(void);*/ + uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); - switch(event) { - - case 0: /* border select */ - borderselect(); - break; - case 2: /* Select/Deselect all */ - deselectall_mesh(); - break; - case 3: /* Inverse */ - selectswap_mesh(); - break; - case 4: /* select linked vertices */ - selectconnected_mesh_all(); - break; - case 5: /* select random */ - selectrandom_mesh(); - break; - case 7: /* select more */ - select_more(); - break; - case 8: /* select less */ - select_less(); - break; - case 9: /* select non-manifold */ - select_non_manifold(); - break; - case 11: /* select triangles */ - select_faces_by_numverts(3); - break; - case 12: /* select quads */ - select_faces_by_numverts(4); - break; - case 13: /* select non-triangles/quads */ - select_faces_by_numverts(5); - break; - case 14: /* select sharp edges */ - select_sharp_edges(); - break; - case 15: /* select linked flat faces */ - select_linked_flat_faces(); - break; + uiItemS(layout); - case 16: /* path select */ - pathselect(); - ED_undo_push(C, "Path Select"); - break; - case 17: /* edge loop select */ - loop_multiselect(0); - break; - case 18: /* edge ring select */ - loop_multiselect(1); - break; - case 19: /* loop to region */ - loop_to_region(); - break; - case 20: /* region to loop */ - region_to_loop(); - break; - case 21: /* Select grouped */ - select_mesh_group_menu(); - break; - } -#endif -} + uiItemO(layout, "Select/Deselect All", 0, "MESH_OT_select_all_toggle"); + uiItemO(layout, "Inverse", 0, "MESH_OT_select_invert"); + uiItemS(layout); -static uiBlock *view3d_select_meshmenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_meshmenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_select_meshmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, - menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Non-Manifold|Ctrl Alt Shift M", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Sharp Edges|Ctrl Alt Shift S", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Linked Flat Faces|Ctrl Alt Shift F", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, - menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Triangles|Ctrl Alt Shift 3", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Quads|Ctrl Alt Shift 4", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Non-Triangles/Quads|Ctrl Alt Shift 5", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, - "Similar to Selection...|Shift G", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, - menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -", - 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, - menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Vertices|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vertex Path|W Alt 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Loop|Ctrl E 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Ring|Ctrl E 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, - menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop to Region|Ctrl E 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Region to Loop|Ctrl E 9", 0, yco-=20, menuwidth, 20, NULL, 0.0, 0.0, 1, 20, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } + uiItemO(layout, "Random...", 0, "MESH_OT_select_random"); // Random... + uiItemO(layout, "Sharp Edges", 0, "MESH_OT_edges_select_sharp"); + uiItemO(layout, "Linked Flat Faces", 0, "MESH_OT_faces_select_linked_flat"); - uiTextBoundsBlock(block, 50); - return block; + uiItemS(layout); + + uiItemEnumO(layout, "Triangles", 0, "MESH_OT_select_by_number_vertices", "type", 3); // Ctrl Alt Shift 3 + uiItemEnumO(layout, "Quads", 0, "MESH_OT_select_by_number_vertices", "type", 4); // Ctrl Alt Shift 4 + uiItemEnumO(layout, "Loose Verts/Edges", 0, "MESH_OT_select_by_number_vertices", "type", 5); // Ctrl Alt Shift 5 + uiItemO(layout, "Similar...", 0, "MESH_OT_select_similar"); + + uiItemS(layout); + + uiItemO(layout, "Less", 0, "MESH_OT_select_more"); + uiItemO(layout, "More", 0, "MESH_OT_select_less"); + + uiItemS(layout); + + uiItemO(layout, "Linked", 0, "MESH_OT_select_linked"); + uiItemO(layout, "Vertex Path", 0, "MESH_OT_select_vertex_path"); // W, Alt 7 + // XXX uiItemO(layout, "Edge Loop", 0, "MESH_OT_select_edge_loop"); // loop_multiselect(0) + // XXX uiItemO(layout, "Edge Ring", 0, "MESH_OT_select_edge_ring"); // loop_multiselect(1) + + uiItemS(layout); + + uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region"); // Ctrl E 8 + uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop"); // Ctrl E 9 } static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused) @@ -1309,144 +1173,63 @@ static void view3d_select_latticemenu(bContext *C, uiLayout *layout, void *arg_u uiItemO(layout, NULL, 0, "LATTICE_OT_select_all_toggle"); } -static void do_view3d_select_armaturemenu(bContext *C, void *arg, int event) +static void view3d_select_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused) { -#if 0 -/* extern void borderselect(void);*/ + PointerRNA ptr; - switch(event) { - case 0: /* border select */ - borderselect(); - break; - case 2: /* Select/Deselect all */ - deselectall_armature(1, 1); - break; - case 3: /* Swap Select All */ - deselectall_armature(3, 1); - break; - case 4: /* Select parent */ - armature_select_hierarchy(BONE_SELECT_PARENT, 0); - break; - case 5: /* Select child */ - armature_select_hierarchy(BONE_SELECT_CHILD, 0); - break; - case 6: /* Extend Select parent */ - armature_select_hierarchy(BONE_SELECT_PARENT, 1); - break; - case 7: /* Extend Select child */ - armature_select_hierarchy(BONE_SELECT_CHILD, 1); - break; - } -#endif -} + uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); -static uiBlock *view3d_select_armaturemenu(bContext *C, ARegion *ar, void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_armaturemenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_select_armaturemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } + uiItemS(layout); - uiTextBoundsBlock(block, 50); - return block; -} + uiItemO(layout, "Select/Deselect All", 0, "ARMATURE_OT_select_all_toggle"); + uiItemO(layout, "Inverse", 0, "ARMATURE_OT_select_invert"); -static void do_view3d_select_pose_armaturemenu(bContext *C, void *arg, int event) -{ -#if 0 -/* extern void borderselect(void);*/ - - switch(event) { - case 0: /* border select */ - borderselect(); - break; - case 2: /* Select/Deselect all */ - deselectall_posearmature(OBACT, 1, 1); - break; - case 3: /* Select Target(s) of Constraint(s) */ - pose_select_constraint_target(); - break; - case 5: /* Swap Select All */ - deselectall_posearmature(OBACT, 3, 1); - break; - case 6: /* Select parent */ - pose_select_hierarchy(BONE_SELECT_PARENT, 0); - break; - case 7: /* Select child */ - pose_select_hierarchy(BONE_SELECT_CHILD, 0); - break; - case 8: /* Extend Select parent */ - pose_select_hierarchy(BONE_SELECT_PARENT, 1); - break; - case 9: /* Extend Select child */ - pose_select_hierarchy(BONE_SELECT_CHILD, 1); - break; - } -#endif + uiItemS(layout); + + uiItemEnumO(layout, "Parent", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT); + uiItemEnumO(layout, "Child", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD); + + uiItemS(layout); + + WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy"); + RNA_boolean_set(&ptr, "extend", 1); + RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT); + uiItemFullO(layout, "Extend Parent", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); + + WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy"); + RNA_boolean_set(&ptr, "extend", 1); + RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD); + uiItemFullO(layout, "Extend Child", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); } -static uiBlock *view3d_select_pose_armaturemenu(bContext *C, ARegion *ar, void *arg_unused) +static void view3d_select_posemenu(bContext *C, uiLayout *layout, void *arg_unused) { - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiBeginBlock(C, ar, "view3d_select_pose_armaturemenu", UI_EMBOSSP); - uiBlockSetButmFunc(block, do_view3d_select_pose_armaturemenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Swap Select All|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Constraint Target|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, ""); - - if(ar->alignment==RGN_ALIGN_TOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } + PointerRNA ptr; - uiTextBoundsBlock(block, 50); - return block; + uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); + + uiItemS(layout); + + uiItemO(layout, "Select/Deselect All", 0, "POSE_OT_select_all_toggle"); + uiItemO(layout, "Inverse", 0, "POSE_OT_select_invert"); + uiItemO(layout, "Constraint Target", 0, "POSE_OT_select_constraint_target"); + + uiItemS(layout); + + uiItemEnumO(layout, "Parent", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT); + uiItemEnumO(layout, "Child", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD); + + uiItemS(layout); + + WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy"); + RNA_boolean_set(&ptr, "extend", 1); + RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT); + uiItemFullO(layout, "Extend Parent", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); + + WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy"); + RNA_boolean_set(&ptr, "extend", 1); + RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD); + uiItemFullO(layout, "Extend Child", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); } void do_view3d_select_faceselmenu(bContext *C, void *arg, int event) @@ -5071,17 +4854,17 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o xmax= GetButStringLength("Select"); if (obedit) { if (ob && ob->type == OB_MESH) { - uiDefPulldownBut(block, view3d_select_meshmenu, NULL, "Select", xco,yco, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_select_meshmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } else if (ob && (ob->type == OB_CURVE || ob->type == OB_SURF)) { - uiDefMenuBut(block, view3d_select_curvemenu, NULL, "Select", xco, yco, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_select_curvemenu, NULL, "Select", xco, yco, xmax-3, 20, ""); } else if (ob && ob->type == OB_FONT) { xmax= 0; } else if (ob && ob->type == OB_MBALL) { - uiDefPulldownBut(block, view3d_select_metaballmenu, NULL, "Select", xco,yco, xmax-3, 24, ""); + uiDefPulldownBut(block, view3d_select_metaballmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } else if (ob && ob->type == OB_LATTICE) { - uiDefMenuBut(block, view3d_select_latticemenu, NULL, "Select", xco, yco, xmax-3, 24, ""); + uiDefMenuBut(block, view3d_select_latticemenu, NULL, "Select", xco, yco, xmax-3, 20, ""); } else if (ob && ob->type == OB_ARMATURE) { - uiDefPulldownBut(block, view3d_select_armaturemenu, NULL, "Select", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_select_armaturemenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } } else if (FACESEL_PAINT_TEST) { if (ob && ob->type == OB_MESH) { @@ -5094,9 +4877,9 @@ static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *o } else { if (ob && (ob->flag & OB_POSEMODE)) - uiDefPulldownBut(block, view3d_select_pose_armaturemenu, NULL, "Select", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_select_posemenu, NULL, "Select", xco,yco, xmax-3, 20, ""); else - uiDefPulldownBut(block, view3d_select_objectmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); + uiDefMenuBut(block, view3d_select_objectmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } xco+= xmax; diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c index a153f795292..74063e0ad56 100644 --- a/source/blender/editors/space_view3d/view3d_select.c +++ b/source/blender/editors/space_view3d/view3d_select.c @@ -1442,6 +1442,7 @@ static int view3d_borderselect_exec(bContext *C, wmOperator *op) } } + ED_armature_sync_selection(arm->edbo); } else if(obedit->type==OB_LATTICE) { do_lattice_box_select(&vc, &rect, val==LEFTMOUSE); diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 1d79c542fa9..6f742d70440 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -125,7 +125,18 @@ static int ed_undo_step(bContext *C, int step) { Object *obedit= CTX_data_edit_object(C); ScrArea *sa= CTX_wm_area(C); - + + if(sa && sa->spacetype==SPACE_IMAGE) { + SpaceImage *sima= (SpaceImage *)sa->spacedata.first; + + if(G.f & G_TEXTUREPAINT || sima->flag & SI_DRAWTOOL) { + undo_imagepaint_step(step); + + WM_event_add_notifier(C, NC_WINDOW, NULL); + return OPERATOR_FINISHED; + } + } + if(sa && sa->spacetype==SPACE_TEXT) { ED_text_undo_step(C, step); } @@ -138,13 +149,6 @@ static int ed_undo_step(bContext *C, int step) if(G.f & G_TEXTUREPAINT) undo_imagepaint_step(step); - else if(sa && sa->spacetype==SPACE_IMAGE) { - SpaceImage *sima= (SpaceImage *)sa->spacedata.first; - if(sima->flag & SI_DRAWTOOL) - undo_imagepaint_step(step); - else - do_glob_undo= 1; - } else if(G.f & G_PARTICLEEDIT) { if(step==1) PE_undo(CTX_data_scene(C)); diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index b811906f5e5..a58ee9772e9 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -121,7 +121,7 @@ static void draw_uvs_shadow(SpaceImage *sima, Object *obedit) { EditMesh *em; EditFace *efa; - TFace *tf; + MTFace *tf; em= BKE_mesh_get_editmesh((Mesh*)obedit->data); @@ -591,7 +591,8 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) break; case SI_UVDT_BLACK: /* black/white */ case SI_UVDT_WHITE: - cpack((sima->dt_uv==SI_UVDT_WHITE) ? 0xFFFFFF : 0x0); + if(sima->dt_uv==SI_UVDT_WHITE) glColor3f(1.0f, 1.0f, 1.0f); + else glColor3f(0.0f, 0.0f, 0.0f); for(efa= em->faces.first; efa; efa= efa->next) { tf= (MTFace *)efa->tmp.p; /* visible faces cached */ diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 44133b61e6c..73ecade9b8b 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -211,6 +211,7 @@ typedef struct ARegion { /* paneltype flag */ #define PNL_DEFAULT_CLOSED 1 +#define PNL_NO_HEADER 2 /* screen handlers */ #define SCREEN_MAXHANDLER 8 diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index 85a148be2e2..69f5b5adc37 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -81,6 +81,7 @@ PropertyRNA *RNA_def_string_file_path(StructOrFunctionRNA *cont, const char *ide PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description); +void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc); PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax); PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax); diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 923191cba78..98646acd727 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -149,8 +149,6 @@ typedef struct RawArray { int stride; } RawArray; -/* Iterator Utility */ - typedef struct EnumPropertyItem { int value; const char *identifier; @@ -159,6 +157,8 @@ typedef struct EnumPropertyItem { const char *description; } EnumPropertyItem; +typedef EnumPropertyItem *(*EnumPropertyItemFunc)(PointerRNA *ptr); + typedef struct PropertyRNA PropertyRNA; /* Parameter List */ diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index 715f03bb3f1..2916c1bcb6e 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -1960,6 +1960,12 @@ PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, co return prop; } +void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc) +{ + EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop; + eprop->itemf= itemfunc; +} + PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax) { diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index 14db8ea3377..557d472afef 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -547,6 +547,26 @@ static int rna_EnumPropertyItem_name_length(PointerRNA *ptr) return strlen(((EnumPropertyItem*)ptr->data)->name); } +static void rna_EnumPropertyItem_description_get(PointerRNA *ptr, char *value) +{ + EnumPropertyItem *eprop= (EnumPropertyItem*)ptr->data; + + if(eprop->description) + strcpy(value, eprop->description); + else + value[0]= '\0'; +} + +static int rna_EnumPropertyItem_description_length(PointerRNA *ptr) +{ + EnumPropertyItem *eprop= (EnumPropertyItem*)ptr->data; + + if(eprop->description) + return strlen(eprop->description); + else + return 0; +} + static int rna_EnumPropertyItem_value_get(PointerRNA *ptr) { return ((EnumPropertyItem*)ptr->data)->value; @@ -861,6 +881,11 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna) RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_name_get", "rna_EnumPropertyItem_name_length", NULL); RNA_def_property_ui_text(prop, "Name", "Human readable name."); + prop= RNA_def_property(srna, "description", PROP_STRING, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_description_get", "rna_EnumPropertyItem_description_length", NULL); + RNA_def_property_ui_text(prop, "Description", "Description of the item's purpose."); + prop= RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_identifier_get", "rna_EnumPropertyItem_identifier_length", NULL); diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index eef221e45a4..9da8c8b2df3 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -607,6 +607,10 @@ static void rna_def_panel(BlenderRNA *brna) prop= RNA_def_property(srna, "default_closed", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_DEFAULT_CLOSED); RNA_def_property_flag(prop, PROP_REGISTER); + + prop= RNA_def_property(srna, "no_header", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "type->flag", PNL_NO_HEADER); + RNA_def_property_flag(prop, PROP_REGISTER); } static void rna_def_header(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index f8ab3a86744..9c9c256e819 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -69,23 +69,23 @@ EnumPropertyItem event_type_items[] = { {YKEY, "Y", 0, "Y", ""}, {ZKEY, "Z", 0, "Z", ""}, - {ZEROKEY, "ZERO", 0, "Zero Key", ""}, - {ONEKEY, "ONE", 0, "One Key", ""}, - {TWOKEY, "TWO", 0, "Two Key", ""}, - {THREEKEY, "THREE", 0, "Three Key", ""}, - {FOURKEY, "FOUR", 0, "Four Key", ""}, - {FIVEKEY, "FIVE", 0, "Five Key", ""}, - {SIXKEY, "SIX", 0, "Six Key", ""}, - {SEVENKEY, "SEVEN", 0, "Seven Key", ""}, - {EIGHTKEY, "EIGHT", 0, "Eight Key", ""}, - {NINEKEY, "NINE", 0, "Nine Key", ""}, + {ZEROKEY, "ZERO", 0, "0", ""}, + {ONEKEY, "ONE", 0, "1", ""}, + {TWOKEY, "TWO", 0, "2", ""}, + {THREEKEY, "THREE", 0, "3", ""}, + {FOURKEY, "FOUR", 0, "4", ""}, + {FIVEKEY, "FIVE", 0, "5", ""}, + {SIXKEY, "SIX", 0, "6", ""}, + {SEVENKEY, "SEVEN", 0, "7", ""}, + {EIGHTKEY, "EIGHT", 0, "8", ""}, + {NINEKEY, "NINE", 0, "9", ""}, {LEFTCTRLKEY, "LEFT_CTRL", 0, "Left Ctrl", ""}, {LEFTALTKEY, "LEFT_ALT", 0, "Left Alt", ""}, + {LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Left Shift", ""}, {RIGHTALTKEY, "RIGHT_ALT", 0, "Right Alt", ""}, - {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Rightctrl", ""}, - {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Rightshift", ""}, - {LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Leftshift", ""}, + {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", ""}, + {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", ""}, {ESCKEY, "ESC", 0, "Esc", ""}, {TABKEY, "TAB", 0, "Tab", ""}, @@ -94,17 +94,17 @@ EnumPropertyItem event_type_items[] = { {LINEFEEDKEY, "LINE_FEED", 0, "Line Feed", ""}, {BACKSPACEKEY, "BACK_SPACE", 0, "Back Space", ""}, {DELKEY, "DEL", 0, "Delete", ""}, - {SEMICOLONKEY, "SEMI_COLON", 0, "Semicolon", ""}, - {PERIODKEY, "PERIOD", 0, "Period", ""}, - {COMMAKEY, "COMMA", 0, "Comma", ""}, - {QUOTEKEY, "QUOTE", 0, "Quote", ""}, - {ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "Accentgrave", ""}, - {MINUSKEY, "MINUS", 0, "Minus", ""}, - {SLASHKEY, "SLASH", 0, "Slash", ""}, - {BACKSLASHKEY, "BACK_SLASH", 0, "Backslash", ""}, - {EQUALKEY, "EQUAL", 0, "Equal", ""}, - {LEFTBRACKETKEY, "LEFT_BRACKET", 0, "Leftbracket", ""}, - {RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "Rightbracket", ""}, + {SEMICOLONKEY, "SEMI_COLON", 0, ";", ""}, + {PERIODKEY, "PERIOD", 0, ".", ""}, + {COMMAKEY, "COMMA", 0, ",", ""}, + {QUOTEKEY, "QUOTE", 0, "\"", ""}, + {ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "`", ""}, + {MINUSKEY, "MINUS", 0, "-", ""}, + {SLASHKEY, "SLASH", 0, "/", ""}, + {BACKSLASHKEY, "BACK_SLASH", 0, "\\", ""}, + {EQUALKEY, "EQUAL", 0, "=", ""}, + {LEFTBRACKETKEY, "LEFT_BRACKET", 0, "]", ""}, + {RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "[", ""}, {LEFTARROWKEY, "LEFT_ARROW", 0, "Left Arrow", ""}, {DOWNARROWKEY, "DOWN_ARROW", 0, "Down Arrow", ""}, {RIGHTARROWKEY, "RIGHT_ARROW", 0, "Right Arrow", ""}, diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index f5eb81e3cea..67328455a77 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -377,7 +377,7 @@ void RNA_def_world(BlenderRNA *brna) prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "range"); RNA_def_property_range(prop, 0.2, 5.0); - RNA_def_property_ui_text(prop, "Range", "The color rage that will be mapped to 0-1"); + RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1."); /* sky type */ prop= RNA_def_property(srna, "blend_sky", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index ffeb342df77..50ba2aec867 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -124,7 +124,7 @@ int WM_operator_filesel (struct bContext *C, struct wmOperator *op, struct wm /* poll callback, context checks */ int WM_operator_winactive (struct bContext *C); /* invoke callback, exec + redo popup */ -int WM_operator_redo (struct bContext *C, struct wmOperator *op, struct wmEvent *event); +int WM_operator_props_popup (struct bContext *C, struct wmOperator *op, struct wmEvent *event); int WM_operator_redo_popup (struct bContext *C, struct wmOperator *op); /* operator api */ diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 7f9a2153dc3..d003f0786de 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -296,7 +296,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op) return block; } -int WM_operator_redo(bContext *C, wmOperator *op, wmEvent *event) +int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *event) { int retval= OPERATOR_CANCELLED; |