Revision: 23660 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23660 Author: campbellbarton Date: 2009-10-06 15:04:31 +0200 (Tue, 06 Oct 2009)
Log Message: ----------- new operator - bpy.ops.wm.call_menu(name="SOME_MT_menu") This calls a registered menu as a popup so we can reuse header menus , currently used for Node editor and Sequencer add menu (Shift+A), can be used for toolbox too. Modified Paths: -------------- trunk/blender/source/blender/blenkernel/BKE_screen.h trunk/blender/source/blender/blenkernel/intern/screen.c trunk/blender/source/blender/editors/include/UI_interface.h trunk/blender/source/blender/editors/interface/interface_layout.c trunk/blender/source/blender/editors/interface/interface_regions.c trunk/blender/source/blender/editors/space_node/node_ops.c trunk/blender/source/blender/editors/space_sequencer/sequencer_ops.c trunk/blender/source/blender/makesdna/DNA_space_types.h trunk/blender/source/blender/makesrna/intern/rna_ui.c trunk/blender/source/blender/windowmanager/intern/wm_operators.c Modified: trunk/blender/source/blender/blenkernel/BKE_screen.h =================================================================== --- trunk/blender/source/blender/blenkernel/BKE_screen.h 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/blenkernel/BKE_screen.h 2009-10-06 13:04:31 UTC (rev 23660) @@ -222,6 +222,8 @@ 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); + /* spacedata */ void BKE_spacedata_freelist(ListBase *lb); void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2); Modified: trunk/blender/source/blender/blenkernel/intern/screen.c =================================================================== --- trunk/blender/source/blender/blenkernel/intern/screen.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/blenkernel/intern/screen.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -343,3 +343,25 @@ 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; +} + Modified: trunk/blender/source/blender/editors/include/UI_interface.h =================================================================== --- trunk/blender/source/blender/editors/include/UI_interface.h 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/editors/include/UI_interface.h 2009-10-06 13:04:31 UTC (rev 23660) @@ -256,6 +256,7 @@ 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 */ /* Popup Blocks * Modified: trunk/blender/source/blender/editors/interface/interface_layout.c =================================================================== --- trunk/blender/source/blender/editors/interface/interface_layout.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/editors/interface/interface_layout.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -1202,24 +1202,21 @@ void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname) { - ARegion *ar= CTX_wm_region(C); MenuType *mt; - if(!menuname) - return; + mt= BKE_spacemenu_find(menuname, CTX_wm_area(C)->spacetype); - for(mt=ar->type->menutypes.first; mt; mt=mt->next) { - if(strcmp(menuname, mt->idname) == 0) { - if(!name) - name= mt->label; - if(layout->root->type == UI_LAYOUT_MENU && !icon) - icon= ICON_BLANK1; - ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL); - return; - } + if(mt==NULL) { + printf("uiItemM: not found %s\n", menuname); + return; } - printf("uiItemM: not found %s\n", menuname); + if(!name) + name= mt->label; + if(layout->root->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; + + ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL); } /* label item */ Modified: trunk/blender/source/blender/editors/interface/interface_regions.c =================================================================== --- trunk/blender/source/blender/editors/interface/interface_regions.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/editors/interface/interface_regions.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -2481,6 +2481,34 @@ BLI_dynstr_free(ds); } +void uiPupMenuInvoke(bContext *C, const char *idname, int spacetype) +{ + uiPopupMenu *pup; + uiLayout *layout; + MenuType *mt= BKE_spacemenu_find(idname, spacetype); + + if(mt==NULL) { + printf("uiPupMenuInvoke: named menu \"%s\" not found\n", idname); + return; + } + + if(mt->poll && mt->poll(C, mt)==0) + return; + + pup= uiPupMenuBegin(C, mt->label, 0); + layout= uiPupMenuLayout(pup); + + Menu menu; + + menu.layout= layout; + menu.type= mt; + + mt->draw(C, &menu); + + uiPupMenuEnd(C, pup); +} + + /*************************** Popup Block API **************************/ void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, int opcontext) Modified: trunk/blender/source/blender/editors/space_node/node_ops.c =================================================================== --- trunk/blender/source/blender/editors/space_node/node_ops.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/editors/space_node/node_ops.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -70,6 +70,7 @@ void node_keymap(struct wmWindowManager *wm) { wmKeyMap *keymap= WM_keymap_find(wm, "Node", SPACE_NODE, 0); + wmKeymapItem *kmi; /* mouse select in nodes used to be both keys, it's UI elements... */ RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, 0, 0)->ptr, "select_type", NODE_SELECT_MOUSE); @@ -97,5 +98,8 @@ WM_keymap_add_item(keymap, "NODE_OT_group_ungroup", GKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, 0, 0); + kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", AKEY, KM_PRESS, KM_SHIFT, 0); + RNA_string_set(kmi->ptr, "name", "NODE_MT_add"); + transform_keymap_for_space(wm, keymap, SPACE_NODE); } Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_ops.c =================================================================== --- trunk/blender/source/blender/editors/space_sequencer/sequencer_ops.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/editors/space_sequencer/sequencer_ops.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -177,6 +177,9 @@ WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_border", BKEY, KM_PRESS, 0, 0); + + kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", AKEY, KM_PRESS, KM_SHIFT, 0); + RNA_string_set(kmi->ptr, "name", "SEQUENCER_MT_add"); WM_keymap_verify_item(keymap, "ANIM_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0); Modified: trunk/blender/source/blender/makesdna/DNA_space_types.h =================================================================== --- trunk/blender/source/blender/makesdna/DNA_space_types.h 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/makesdna/DNA_space_types.h 2009-10-06 13:04:31 UTC (rev 23660) @@ -139,7 +139,7 @@ View2D v2d; /* deprecated, copied to region */ float xof, yof; /* offset for drawing the image preview */ - short mainb; + short mainb; /* weird name for the sequencer subtype (seq, image, luma... etc) */ short render_size; short chanshown; short zebra; Modified: trunk/blender/source/blender/makesrna/intern/rna_ui.c =================================================================== --- trunk/blender/source/blender/makesrna/intern/rna_ui.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/makesrna/intern/rna_ui.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -381,13 +381,9 @@ return NULL; /* check if we have registered this menu type before, and remove it */ - for(mt=art->menutypes.first; mt; mt=mt->next) { - if(strcmp(mt->idname, dummymt.idname) == 0) { - if(mt->ext.srna) - rna_Menu_unregister(C, mt->ext.srna); - break; - } - } + mt= BKE_spacemenu_find(dummymt.idname, dummymt.space_type); + if(mt && mt->ext.srna) + rna_Menu_unregister(C, mt->ext.srna); /* create a new menu type */ mt= MEM_callocN(sizeof(MenuType), "python buttons menu"); Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c =================================================================== --- trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2009-10-06 12:23:25 UTC (rev 23659) +++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2009-10-06 13:04:31 UTC (rev 23660) @@ -58,6 +58,7 @@ #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "BKE_screen.h" /* BKE_ST_MAXNAME */ #include "BKE_utildefines.h" #include "BIF_gl.h" @@ -766,7 +767,26 @@ ot->poll= wm_search_menu_poll; } +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); + + return OPERATOR_CANCELLED; +} + +static void WM_OT_call_menu(wmOperatorType *ot) +{ + ot->name= "Call Menu"; + ot->idname= "WM_OT_call_menu"; + + ot->invoke= wm_call_menu_invoke; + + RNA_def_string(ot->srna, "name", "", BKE_ST_MAXNAME, "Name", "Name of the new sequence strip"); +} + /* ************ window / screen operator definitions ************** */ static void WM_OT_window_duplicate(wmOperatorType *ot) @@ -2122,6 +2142,7 @@ WM_operatortype_append(WM_OT_redraw_timer); WM_operatortype_append(WM_OT_debug_menu); WM_operatortype_append(WM_OT_search_menu); + WM_operatortype_append(WM_OT_call_menu); } /* default keymap for windows and screens, only call once per WM */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs