Index: release/ui/space_view3d.py =================================================================== --- release/ui/space_view3d.py (revision 21800) +++ release/ui/space_view3d.py (working copy) @@ -75,18 +75,146 @@ layout.itemO("screen.screen_full_area") +class VIEW3D_MT_select_object(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_objectmenu() + +class VIEW3D_MT_select_mesh(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.itemO("view3d.select_border") + + layout.itemS() + + layout.itemO("mesh.select_all_toggle") + layout.itemO("mesh.select_inverse", text="Inverse") + + layout.itemS() + + layout.itemO("mesh.select_random", text="Random...") + layout.itemO("mesh.edges_select_sharp", text="Sharp Edges") + layout.itemO("mesh.faces_select_linked_flat", text="Linked Flat Faces") + + layout.itemS() + + layout.item_enumO("mesh.select_by_number_vertices", "type", "TRIANGLES", text="Triangles") + layout.item_enumO("mesh.select_by_number_vertices", "type", "QUADS", text="Quads") + layout.item_enumO("mesh.select_by_number_vertices", "type", "OTHER", text="Loose Verts/Edges") + layout.itemO("mesh.select_similar", text="Similar...") + + layout.itemS() + + layout.itemO("mesh.select_less", text="Less") + layout.itemO("mesh.select_more", text="More") + + layout.itemS() + + layout.itemO("mesh.select_linked", text="Linked") + layout.itemO("mesh.select_vertex_path", text="Vertex Path") + layout.itemO("mesh.loop_multi_select", text="Edge Loop") + layout.item_booleanO("mesh.loop_multi_select", "ring", True, text="Edge Ring") + + layout.itemS() + + layout.itemO("mesh.loop_to_region") + layout.itemO("mesh.region_to_loop") + +class VIEW3D_MT_select_curve(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_curvemenu() + +class VIEW3D_MT_select_metaball(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_metaballmenu() + +class VIEW3D_MT_select_lattice(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_latticemenu() + +class VIEW3D_MT_select_armature(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_armaturemenu() + +class VIEW3D_MT_select_pose(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_posemenu() + +class VIEW3D_MT_select_facesel(bpy.types.Menu): + __space_type__ = "VIEW_3D" + __label__ = "Select" + + def draw(self, context): + layout = self.layout + + layout.view3d_select_faceselmenu() + class VIEW3D_HT_header(bpy.types.Header): __space_type__ = "VIEW_3D" def draw(self, context): + view = context.space_data layout = self.layout layout.template_header() - + # menus if context.area.show_menus: row = layout.row() + row.itemM("VIEW3D_MT_view") + + if context.mode_string=="objectmode": + layout.itemM("VIEW3D_MT_select_object") + elif context.mode_string=="editmode_mesh": + layout.itemM("VIEW3D_MT_select_mesh") + elif context.mode_string=="editmode_curve": + layout.itemM("VIEW3D_MT_select_curve") + elif context.mode_string=="editmode_metaball": + layout.itemM("VIEW3D_MT_select_metaball") + elif context.mode_string=="editmode_lattice": + layout.itemM("VIEW3D_MT_select_lattice") + elif context.mode_string=="editmode_armature": + layout.itemM("VIEW3D_MT_select_armature") + elif context.mode_string=="posemode": + layout.itemM("VIEW3D_MT_select_pose") + elif context.mode_string=="editmode_facesel": + layout.itemM("VIEW3D_MT_select_facesel") + elif context.mode_string=="particlemode": + layout.itemM("VIEW3D_MT_select_particle") layout.template_header_3D() @@ -172,6 +300,14 @@ bpy.types.register(VIEW3D_MT_view_navigation) bpy.types.register(VIEW3D_MT_view) +bpy.types.register(VIEW3D_MT_select_object) +bpy.types.register(VIEW3D_MT_select_mesh) +bpy.types.register(VIEW3D_MT_select_curve) +bpy.types.register(VIEW3D_MT_select_metaball) +bpy.types.register(VIEW3D_MT_select_lattice) +bpy.types.register(VIEW3D_MT_select_armature) +bpy.types.register(VIEW3D_MT_select_pose) +bpy.types.register(VIEW3D_MT_select_facesel) bpy.types.register(VIEW3D_HT_header) bpy.types.register(VIEW3D_PT_3dview_properties) bpy.types.register(VIEW3D_PT_3dview_display) Index: source/blender/blenkernel/BKE_context.h =================================================================== --- source/blender/blenkernel/BKE_context.h (revision 21800) +++ source/blender/blenkernel/BKE_context.h (working copy) @@ -180,6 +180,8 @@ struct Scene *CTX_data_scene(const bContext *C); struct ToolSettings *CTX_data_tool_settings(const bContext *C); +char *CTX_data_mode_string(const bContext *C); + void CTX_data_main_set(bContext *C, struct Main *bmain); void CTX_data_scene_set(bContext *C, struct Scene *bmain); Index: source/blender/blenkernel/intern/context.c =================================================================== --- source/blender/blenkernel/intern/context.c (revision 21800) +++ source/blender/blenkernel/intern/context.c (working copy) @@ -34,6 +34,7 @@ #include "DNA_space_types.h" #include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" +#include "DNA_object_types.h" #include "RNA_access.h" @@ -43,6 +44,7 @@ #include "BKE_context.h" #include "BKE_main.h" #include "BKE_screen.h" +#include "BKE_global.h" #include @@ -579,6 +581,42 @@ return C->data.scene; } +char *CTX_data_mode_string(const bContext *C) +{ + Object *obedit= CTX_data_edit_object(C); + + if(obedit) { + switch(obedit->type) { + case OB_MESH: + return "editmode_mesh"; + case OB_CURVE: + return "editmode_curve"; + case OB_SURF: + return "editmode_surface"; + case OB_FONT: + return "editmode_text"; + case OB_ARMATURE: + return "editmode_armature"; + case OB_MBALL: + return "editmode_mball"; + case OB_LATTICE: + return "editmode_lattice"; + } + } + else { + Object *ob = CTX_data_active_object(C); + + if(ob && (ob->flag & OB_POSEMODE)) return "posemode"; + else if (G.f & G_SCULPTMODE) return "sculptmode"; + else if (G.f & G_WEIGHTPAINT) return "weightpaint"; + else if (G.f & G_VERTEXPAINT) return "vertexpaint"; + else if (G.f & G_TEXTUREPAINT) return "texturepaint"; + else if(G.f & G_PARTICLEEDIT) return "particlemode"; + } + + return "objectmode"; +} + void CTX_data_scene_set(bContext *C, Scene *scene) { C->data.scene= scene; Index: source/blender/editors/include/UI_interface.h =================================================================== --- source/blender/editors/include/UI_interface.h (revision 21800) +++ source/blender/editors/include/UI_interface.h (working copy) @@ -629,6 +629,15 @@ void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C); void uiTemplateOperatorSearch(uiLayout *layout); void uiTemplateHeader3D(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_objectmenu(uiLayout *layout, struct bContext *C); +/*void uiTemplate_view3d_select_meshmenu(uiLayout *layout, struct bContext *C);*/ +void uiTemplate_view3d_select_curvemenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_metaballmenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_latticemenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_armaturemenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_posemenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, struct bContext *C); +void uiTemplate_view3d_select_particlemenu(uiLayout *layout, struct bContext *C); void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex); typedef struct uiListItem { Index: source/blender/editors/space_view3d/space_view3d.c =================================================================== --- source/blender/editors/space_view3d/space_view3d.c (revision 21800) +++ source/blender/editors/space_view3d/space_view3d.c (working copy) @@ -589,7 +589,7 @@ static void view3d_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, view3d_context_string(C)); + ED_region_panels(C, ar, 1, CTX_data_mode_string(C)); } static int view3d_context(const bContext *C, const char *member, bContextDataResult *result) Index: source/blender/editors/space_view3d/view3d_header.c =================================================================== --- source/blender/editors/space_view3d/view3d_header.c (revision 21800) +++ source/blender/editors/space_view3d/view3d_header.c (working copy) @@ -987,7 +987,15 @@ #endif } -static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unused) +/* wrapper for python layouts */ +void uiTemplate_view3d_select_objectmenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_objectmenu(C, layout, arg_unused); +} + +/* moved to python */ +/*static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unused) { uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); @@ -1025,7 +1033,14 @@ uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region"); // Ctrl E 8 uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop"); // Ctrl E 9 -} +}*/ + +/* wrapper for python layouts */ +/*void uiTemplate_view3d_select_meshmenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_meshmenu(C, layout, arg_unused); +}*/ static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused) { @@ -1069,6 +1084,13 @@ #endif } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_curvemenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_curvemenu(C, layout, arg_unused); +} + void do_view3d_select_metaballmenu(bContext *C, void *arg, int event) { #if 0 @@ -1123,6 +1145,14 @@ return block; } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_metaballmenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + ARegion *ar= CTX_wm_region(C); + view3d_select_metaballmenu(C, ar, arg_unused); +} + static void view3d_select_latticemenu(bContext *C, uiLayout *layout, void *arg_unused) { uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border"); @@ -1130,6 +1160,13 @@ uiItemO(layout, NULL, 0, "LATTICE_OT_select_all_toggle"); } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_latticemenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_latticemenu(C, layout, arg_unused); +} + static void view3d_select_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused) { PointerRNA ptr; @@ -1159,6 +1196,13 @@ uiItemFullO(layout, "Extend Child", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_armaturemenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_armaturemenu(C, layout, arg_unused); +} + static void view3d_select_posemenu(bContext *C, uiLayout *layout, void *arg_unused) { PointerRNA ptr; @@ -1189,6 +1233,13 @@ uiItemFullO(layout, "Extend Child", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN); } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_posemenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_posemenu(C, layout, arg_unused); +} + void do_view3d_select_faceselmenu(bContext *C, void *arg, int event) { #if 0 @@ -1259,6 +1310,14 @@ return block; } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + ARegion *ar= CTX_wm_region(C); + view3d_select_faceselmenu(C, ar, arg_unused); +} + static void view3d_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused) { uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid"); @@ -3679,6 +3738,13 @@ uiItemO(layout, NULL, 0, "PARTICLE_OT_select_less"); } +/* wrapper for python layouts */ +void uiTemplate_view3d_select_particlemenu(uiLayout *layout, bContext *C) +{ + void *arg_unused = NULL; + view3d_select_particlemenu(C, layout, arg_unused); +} + static void view3d_particle_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused) { uiItemO(layout, NULL, 0, "PARTICLE_OT_reveal"); @@ -4106,7 +4172,8 @@ * height of the header */ xmax= GetButStringLength("Select"); - if (obedit) { + /* moved to python */ + /*if (obedit) { if (ob && ob->type == OB_MESH) { uiDefMenuBut(block, view3d_select_meshmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); } else if (ob && (ob->type == OB_CURVE || ob->type == OB_SURF)) { @@ -4134,7 +4201,7 @@ uiDefMenuBut(block, view3d_select_posemenu, NULL, "Select", xco,yco, xmax-3, 20, ""); else uiDefMenuBut(block, view3d_select_objectmenu, NULL, "Select", xco,yco, xmax-3, 20, ""); - } + }*/ xco+= xmax; if (obedit) { Index: source/blender/editors/space_view3d/view3d_intern.h =================================================================== --- source/blender/editors/space_view3d/view3d_intern.h (revision 21800) +++ source/blender/editors/space_view3d/view3d_intern.h (working copy) @@ -140,7 +140,6 @@ void VIEW3D_OT_toolbar(struct wmOperatorType *ot); void view3d_toolbar_register(struct ARegionType *art); void view3d_tool_props_register(struct ARegionType *art); -char *view3d_context_string(const struct bContext *C); /* view3d_snap.c */ int minmax_verts(Object *obedit, float *min, float *max); Index: source/blender/editors/space_view3d/view3d_toolbar.c =================================================================== --- source/blender/editors/space_view3d/view3d_toolbar.c (revision 21800) +++ source/blender/editors/space_view3d/view3d_toolbar.c (working copy) @@ -150,42 +150,6 @@ /* ******************* */ -char *view3d_context_string(const bContext *C) -{ - Object *obedit= CTX_data_edit_object(C); - - if(obedit) { - switch(obedit->type) { - case OB_MESH: - return "editmode_mesh"; - case OB_CURVE: - return "editmode_curve"; - case OB_SURF: - return "editmode_surface"; - case OB_FONT: - return "editmode_text"; - case OB_ARMATURE: - return "editmode_armature"; - case OB_MBALL: - return "editmode_mball"; - case OB_LATTICE: - return "editmode_lattice"; - } - } - else { - Object *ob = CTX_data_active_object(C); - - if(ob && (ob->flag & OB_POSEMODE)) return "posemode"; - else if (G.f & G_SCULPTMODE) return "sculptmode"; - else if (G.f & G_WEIGHTPAINT) return "weightpaint"; - else if (G.f & G_VERTEXPAINT) return "vertexpaint"; - else if (G.f & G_TEXTUREPAINT) return "texturepaint"; - else if(G.f & G_PARTICLEEDIT) return "particlemode"; - } - - return "objectmode"; -} - typedef struct CustomTool { struct CustomTool *next, *prev; char opname[OP_MAX_TYPENAME]; @@ -201,7 +165,7 @@ BLI_addtail(arg_listbase, ct); BLI_strncpy(ct->opname, ot->idname, OP_MAX_TYPENAME); - BLI_strncpy(ct->context, view3d_context_string(C), OP_MAX_TYPENAME); + BLI_strncpy(ct->context, CTX_data_mode_string(C), OP_MAX_TYPENAME); } } @@ -264,7 +228,7 @@ SpaceLink *sl= CTX_wm_space_data(C); SpaceType *st= NULL; uiLayout *col; - const char *context= view3d_context_string(C); + const char *context= CTX_data_mode_string(C); if(sl) st= BKE_spacetype_from_id(sl->spacetype); Index: source/blender/makesrna/intern/rna_context.c =================================================================== --- source/blender/makesrna/intern/rna_context.c (revision 21800) +++ source/blender/makesrna/intern/rna_context.c (working copy) @@ -110,6 +110,18 @@ return newptr; } +static void rna_Context_mode_string_get(PointerRNA *ptr, char *value) +{ + bContext *C= (bContext*)ptr->data; + strcpy(value, CTX_data_mode_string(C)); +} + +static int rna_Context_mode_string_length(PointerRNA *ptr) +{ + bContext *C= (bContext*)ptr->data; + return strlen(CTX_data_mode_string(C)); +} + #else void RNA_def_context(BlenderRNA *brna) @@ -177,6 +189,10 @@ RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "UserPreferences"); RNA_def_property_pointer_funcs(prop, "rna_Context_user_preferences_get", NULL, NULL); + + prop= RNA_def_property(srna, "mode_string", PROP_STRING, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_string_funcs(prop, "rna_Context_mode_string_get", "rna_Context_mode_string_length", NULL); } #endif Index: source/blender/makesrna/intern/rna_ui_api.c =================================================================== --- source/blender/makesrna/intern/rna_ui_api.c (revision 21800) +++ source/blender/makesrna/intern/rna_ui_api.c (working copy) @@ -287,6 +287,25 @@ func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_objectmenu", "uiTemplate_view3d_select_objectmenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + /*func= RNA_def_function(srna, "view3d_select_meshmenu", "uiTemplate_view3d_select_meshmenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT);*/ + func= RNA_def_function(srna, "view3d_select_curvemenu", "uiTemplate_view3d_select_curvemenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_metaballmenu", "uiTemplate_view3d_select_metaballmenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_latticemenu", "uiTemplate_view3d_select_latticemenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_armaturemenu", "uiTemplate_view3d_select_armaturemenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_posemenu", "uiTemplate_view3d_select_posemenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_faceselmenu", "uiTemplate_view3d_select_faceselmenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "view3d_select_particlemenu", "uiTemplate_view3d_select_particlemenu"); + RNA_def_function_flag(func, FUNC_USE_CONTEXT); + func= RNA_def_function(srna, "template_texture_image", "uiTemplateTextureImage"); RNA_def_function_flag(func, FUNC_USE_CONTEXT); parm= RNA_def_pointer(func, "texture", "Texture", "", "");