diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-10-08 23:06:32 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-10-08 23:06:32 +0400 |
commit | 5c867406aa66a1d89260c233a6bbc1a2a7912dbe (patch) | |
tree | 0cce14e7a49cb61b6114b69f457ca6a920db8de4 /source | |
parent | 3ebd58673fb9a8c5ef13048b2e8e8a4cb7bb3a4e (diff) |
menus are now global (like operators), so for eg, the info add menu and the 3D add menu can be shared.
Diffstat (limited to 'source')
18 files changed, 70 insertions, 103 deletions
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 */ |