From 5c867406aa66a1d89260c233a6bbc1a2a7912dbe Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 8 Oct 2009 19:06:32 +0000 Subject: menus are now global (like operators), so for eg, the info add menu and the 3D add menu can be shared. --- source/blender/blenkernel/BKE_screen.h | 6 +-- source/blender/blenkernel/intern/screen.c | 27 ------------- source/blender/editors/include/UI_interface.h | 2 +- .../blender/editors/interface/interface_layout.c | 2 +- .../blender/editors/interface/interface_regions.c | 4 +- source/blender/editors/mesh/editmesh_mods.c | 2 +- source/blender/editors/object/object_add.c | 45 --------------------- source/blender/editors/object/object_intern.h | 1 - source/blender/editors/object/object_ops.c | 5 ++- source/blender/editors/space_node/node_header.c | 2 +- source/blender/makesrna/intern/rna_ui.c | 17 ++------ source/blender/python/intern/bpy_operator.c | 2 +- source/blender/windowmanager/WM_api.h | 7 ++++ source/blender/windowmanager/intern/wm.c | 46 ++++++++++++++++++++++ source/blender/windowmanager/intern/wm_init_exit.c | 1 + source/blender/windowmanager/intern/wm_operators.c | 2 +- source/blender/windowmanager/intern/wm_window.c | 1 - source/blender/windowmanager/wm_window.h | 1 - 18 files changed, 70 insertions(+), 103 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 7c62c8c6dd4..39a90fe3074 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -138,9 +138,6 @@ typedef struct ARegionType { /* header type definitions */ ListBase headertypes; - - /* menu type definitions */ - ListBase menutypes; /* hardcoded constraints, smaller than these values region is not visible */ int minsizex, minsizey; @@ -200,7 +197,6 @@ typedef struct MenuType { char idname[BKE_ST_MAXNAME]; /* unique name */ char label[BKE_ST_MAXNAME]; /* for button text */ - int space_type; /* verify if the menu should draw or not */ int (*poll)(const struct bContext *, struct MenuType *); @@ -223,7 +219,7 @@ const struct ListBase *BKE_spacetypes_list(void); void BKE_spacetype_register(struct SpaceType *st); void BKE_spacetypes_free(void); /* only for quitting blender */ -MenuType *BKE_spacemenu_find(const char *idname, int spacetype); +// MenuType *BKE_spacemenu_find(const char *idname, int spacetype); /* spacedata */ void BKE_spacedata_freelist(ListBase *lb); diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c index 3567de5df40..918a67311a0 100644 --- a/source/blender/blenkernel/intern/screen.c +++ b/source/blender/blenkernel/intern/screen.c @@ -70,13 +70,8 @@ static void spacetype_free(SpaceType *st) if(ht->ext.free) ht->ext.free(ht->ext.data); - for(mt= art->menutypes.first; mt; mt= mt->next) - if(mt->ext.free) - mt->ext.free(mt->ext.data); - BLI_freelistN(&art->paneltypes); BLI_freelistN(&art->headertypes); - BLI_freelistN(&art->menutypes); } BLI_freelistN(&st->regiontypes); @@ -343,25 +338,3 @@ unsigned int BKE_screen_visible_layers(bScreen *screen) return layer; } -MenuType *BKE_spacemenu_find(const char *idname, int spacetype) -{ - SpaceType *st= BKE_spacetype_from_id(spacetype); - ARegionType *art; - MenuType* mt; - - if(st==NULL) { - printf("space type %d is invalid\n", spacetype); - return NULL; - } - - if(idname==NULL) - return NULL; - - for(art= st->regiontypes.first; art; art= art->next) - for(mt=art->menutypes.first; mt; mt=mt->next) - if(strcmp(idname, mt->idname)==0) - return mt; - - return NULL; -} - diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 3c6ed1137ae..5766fcfdb1f 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -257,7 +257,7 @@ void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, char *filename void uiPupMenuNotice(struct bContext *C, char *str, ...); void uiPupMenuError(struct bContext *C, char *str, ...); void uiPupMenuReports(struct bContext *C, struct ReportList *reports); -void uiPupMenuInvoke(struct bContext *C, const char *idname, int spacetype); /* popup registered menu */ +void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registered menu */ /* Popup Blocks * diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index eb81044852a..b0f93472240 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1232,7 +1232,7 @@ void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname { MenuType *mt; - mt= BKE_spacemenu_find(menuname, CTX_wm_area(C)->spacetype); + mt= WM_menutype_find(menuname, FALSE); if(mt==NULL) { printf("uiItemM: not found %s\n", menuname); diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index cdb62d0a4b4..c837599baf3 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -2481,12 +2481,12 @@ void uiPupMenuReports(bContext *C, ReportList *reports) BLI_dynstr_free(ds); } -void uiPupMenuInvoke(bContext *C, const char *idname, int spacetype) +void uiPupMenuInvoke(bContext *C, const char *idname) { uiPopupMenu *pup; uiLayout *layout; Menu menu; - MenuType *mt= BKE_spacemenu_find(idname, spacetype); + MenuType *mt= WM_menutype_find(idname, TRUE); if(mt==NULL) { printf("uiPupMenuInvoke: named menu \"%s\" not found\n", idname); diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 4669f7a6741..3c3cdf25d7b 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -119,7 +119,7 @@ void EM_select_mirrored(Object *obedit, EditMesh *em) void EM_automerge(Scene *scene, Object *obedit, int update) { - Mesh *me= (Mesh*)obedit->data; /* can be NULL */ + Mesh *me= obedit ? obedit->data : NULL; /* can be NULL */ int len; if ((scene->toolsettings->automerge) && diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 780126852ed..c552a2954b7 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -686,51 +686,6 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot) RNA_def_enum(ot->srna, "type", lamp_type_items, 0, "Type", ""); } -static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event) -{ - uiPopupMenu *pup= uiPupMenuBegin(C, "Add Object", 0); - uiLayout *layout= uiPupMenuLayout(pup); - - uiItemMenuEnumO(layout, "Mesh", ICON_OUTLINER_OB_MESH, "OBJECT_OT_mesh_add", "type"); - uiItemMenuEnumO(layout, "Curve", ICON_OUTLINER_OB_CURVE, "OBJECT_OT_curve_add", "type"); - uiItemMenuEnumO(layout, "Surface", ICON_OUTLINER_OB_SURFACE, "OBJECT_OT_surface_add", "type"); - uiItemMenuEnumO(layout, "Metaball", ICON_OUTLINER_OB_META, "OBJECT_OT_metaball_add", "type"); - uiItemO(layout, "Text", ICON_OUTLINER_OB_FONT, "OBJECT_OT_text_add"); - uiItemS(layout); - uiItemO(layout, "Armature", ICON_OUTLINER_OB_ARMATURE, "OBJECT_OT_armature_add"); - uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_LATTICE, "OBJECT_OT_add", "type", OB_LATTICE); - uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_add", "type", OB_EMPTY); - uiItemS(layout); - uiItemEnumO(layout, NULL, ICON_OUTLINER_OB_CAMERA, "OBJECT_OT_add", "type", OB_CAMERA); - uiItemMenuEnumO(layout, "Lamp", ICON_OUTLINER_OB_LAMP, "OBJECT_OT_lamp_add", "type"); - uiItemS(layout); - uiItemMenuEnumO(layout, "Force Field", ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_effector_add", "type"); - uiItemS(layout); - uiItemMenuEnumO(layout, "Group Instance", ICON_OUTLINER_OB_EMPTY, "OBJECT_OT_group_instance_add", "type"); - - uiPupMenuEnd(C, pup); - - /* this operator is only for a menu, not used further */ - return OPERATOR_CANCELLED; -} - -/* only used as menu */ -void OBJECT_OT_primitive_add(wmOperatorType *ot) -{ - /* identifiers */ - ot->name= "Add Primitive"; - ot->description = "Add a primitive object."; - ot->idname= "OBJECT_OT_primitive_add"; - - /* api callbacks */ - ot->invoke= object_primitive_add_invoke; - - ot->poll= ED_operator_scene_editable; - - /* flags */ - ot->flag= 0; -} - /* add dupligroup */ static EnumPropertyItem *add_dupligroup_itemf(bContext *C, PointerRNA *ptr, int *free) { diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 1a7d3841aaa..353622526d3 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -90,7 +90,6 @@ void OBJECT_OT_metaball_add(struct wmOperatorType *ot); void OBJECT_OT_text_add(struct wmOperatorType *ot); void OBJECT_OT_armature_add(struct wmOperatorType *ot); void OBJECT_OT_lamp_add(struct wmOperatorType *ot); -void OBJECT_OT_primitive_add(struct wmOperatorType *ot); /* only used as menu */ void OBJECT_OT_effector_add(struct wmOperatorType *ot); void OBJECT_OT_group_instance_add(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index f2f24c099bc..d75cf63c1d4 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -119,7 +119,6 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_add); WM_operatortype_append(OBJECT_OT_effector_add); WM_operatortype_append(OBJECT_OT_group_instance_add); - WM_operatortype_append(OBJECT_OT_primitive_add); WM_operatortype_append(OBJECT_OT_mesh_add); WM_operatortype_append(OBJECT_OT_metaball_add); WM_operatortype_append(OBJECT_OT_duplicates_make_real); @@ -247,7 +246,9 @@ void ED_keymap_object(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0); - WM_keymap_verify_item(keymap, "OBJECT_OT_primitive_add", AKEY, KM_PRESS, KM_SHIFT, 0); + kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", AKEY, KM_PRESS, KM_SHIFT, 0); + RNA_string_set(kmi->ptr, "name", "INFO_MT_add"); + WM_keymap_add_item(keymap, "OBJECT_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_duplicate", DKEY, KM_PRESS, KM_ALT, 0)->ptr, "linked", 1); WM_keymap_add_item(keymap, "OBJECT_OT_join", JKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c index 2abcd2f2135..a0eae40f579 100644 --- a/source/blender/editors/space_node/node_header.c +++ b/source/blender/editors/space_node/node_header.c @@ -199,7 +199,7 @@ void node_menus_register(ARegionType *art) strcpy(mt->idname, "NODE_MT_add"); strcpy(mt->label, "Add"); mt->draw= node_menu_add; - BLI_addtail(&art->menutypes, mt); + WM_menutype_add(mt); } #if 0 diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 1a1172247fc..a1b412c70f4 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -348,12 +348,11 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type) if(!mt) return; - if(!(art=region_type_find(NULL, mt->space_type, RGN_TYPE_HEADER))) - return; RNA_struct_free_extension(type, &mt->ext); - BLI_freelinkN(&art->menutypes, mt); + WM_menutype_freelink(mt); + RNA_struct_free(&BLENDER_RNA, type); /* update while blender is running */ @@ -376,12 +375,9 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void /* validate the python class */ if(validate(&dummymtr, data, have_function) != 0) return NULL; - - if(!(art=region_type_find(reports, dummymt.space_type, RGN_TYPE_HEADER))) - return NULL; /* check if we have registered this menu type before, and remove it */ - mt= BKE_spacemenu_find(dummymt.idname, dummymt.space_type); + mt= WM_menutype_find(dummymt.idname, TRUE); if(mt && mt->ext.srna) rna_Menu_unregister(C, mt->ext.srna); @@ -398,7 +394,7 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void mt->poll= (have_function[0])? menu_poll: NULL; mt->draw= (have_function[1])? menu_draw: NULL; - BLI_addtail(&art->menutypes, mt); + WM_menutype_add(mt); /* update while blender is running */ if(C) @@ -734,11 +730,6 @@ static void rna_def_menu(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "type->label"); RNA_def_property_flag(prop, PROP_REGISTER); - prop= RNA_def_property(srna, "space_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "type->space_type"); - RNA_def_property_enum_items(prop, space_type_items); - RNA_def_property_flag(prop, PROP_REGISTER); - RNA_define_verify_sdna(1); } diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 301204d3e2b..87752ca9c58 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -94,7 +94,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args) char *report_str= BKE_reports_string(reports, 0); /* all reports */ if(report_str) { - PySys_WriteStdout(report_str); + PySys_WriteStdout("%s\n", report_str); MEM_freeN(report_str); } } diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index b29dbec6364..eaf8b00163c 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -41,6 +41,7 @@ struct wmNotifier; struct rcti; struct PointerRNA; struct EnumPropertyItem; +struct MenuType; typedef struct wmJob wmJob; @@ -187,6 +188,12 @@ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struc void WM_operator_bl_idname(char *to, const char *from); void WM_operator_py_idname(char *to, const char *from); +/* *************** menu types ******************** */ +struct MenuType *WM_menutype_find(const char *idname, int quiet); +int WM_menutype_add(struct MenuType* mt); +void WM_menutype_freelink(struct MenuType* mt); +void WM_menutype_free(void); + /* default operator callbacks for border/circle/lasso */ int WM_border_select_invoke (struct bContext *C, struct wmOperator *op, struct wmEvent *event); int WM_border_select_modal (struct bContext *C, struct wmOperator *op, struct wmEvent *event); diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index a068f84ae29..dbb8fc400c0 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -26,6 +26,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include "string.h" + #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -39,6 +41,7 @@ #include "BKE_idprop.h" #include "BKE_library.h" #include "BKE_main.h" +#include "BKE_screen.h" #include "BKE_report.h" #include "WM_api.h" @@ -128,6 +131,49 @@ void WM_operator_stack_clear(bContext *C) /* ****************************************** */ +static ListBase menutypes = {NULL, NULL}; /* global menutype list */ + +MenuType *WM_menutype_find(const char *idname, int quiet) +{ + MenuType* mt; + + if (idname[0]) { + for(mt=menutypes.first; mt; mt=mt->next) + if(strcmp(idname, mt->idname)==0) + return mt; + } + + if(!quiet) + printf("search for unknown menutype %s\n", idname); + + return NULL; +} + +int WM_menutype_add(MenuType* mt) +{ + BLI_addtail(&menutypes, mt); + return 1; +} + +void WM_menutype_freelink(MenuType* mt) +{ + BLI_freelinkN(&menutypes, mt); +} + +void WM_menutype_free(void) +{ + MenuType* mt; + + for(mt= menutypes.first; mt; mt= mt->next) { + if(mt->ext.free) { + mt->ext.free(mt->ext.data); + } + WM_menutype_freelink(mt); + } +} + +/* ****************************************** */ + void WM_keymap_init(bContext *C) { wmWindowManager *wm= CTX_wm_manager(C); diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 490ef12a523..2e456669cb1 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -195,6 +195,7 @@ void WM_exit(bContext *C) } } wm_operatortype_free(); + WM_menutype_free(); /* all non-screen and non-space stuff editors did, like editmode */ if(C) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index a92fcee48e2..915f4c80663 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -783,7 +783,7 @@ static int wm_call_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) char idname[BKE_ST_MAXNAME]; RNA_string_get(op->ptr, "name", idname); - uiPupMenuInvoke(C, idname, CTX_wm_area(C)->spacetype); + uiPupMenuInvoke(C, idname); return OPERATOR_CANCELLED; } diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 44b7b60e451..f7116a2bd1f 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -68,7 +68,6 @@ GHOST_SystemHandle g_system= NULL; /* set by commandline */ static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0; - /* ******** win open & close ************ */ /* XXX this one should correctly check for apple top header... diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index f159f7f098d..44c31e7cb69 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -62,6 +62,5 @@ void wm_window_testbreak (void); int wm_window_duplicate_op (bContext *C, wmOperator *op); int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op); - #endif /* WM_WINDOW_H */ -- cgit v1.2.3