[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23660] trunk/blender/source/blender: new operator - bpy.ops.wm.call_menu(name="SOME_MT_menu")

Campbell Barton ideasman42 at gmail.com
Tue Oct 6 15:04:31 CEST 2009


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 */





More information about the Bf-blender-cvs mailing list