Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-10-06 17:04:31 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-10-06 17:04:31 +0400
commitdd8e2897ba19daac5191a341add9955e00798262 (patch)
treeda30b474f92eb4c88887a061c31e19d7bb726151 /source/blender
parent2011ba50c84d61eff998812944354d444bd00041 (diff)
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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_screen.h2
-rw-r--r--source/blender/blenkernel/intern/screen.c22
-rw-r--r--source/blender/editors/include/UI_interface.h1
-rw-r--r--source/blender/editors/interface/interface_layout.c23
-rw-r--r--source/blender/editors/interface/interface_regions.c28
-rw-r--r--source/blender/editors/space_node/node_ops.c4
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c3
-rw-r--r--source/blender/makesdna/DNA_space_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_ui.c10
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c21
10 files changed, 95 insertions, 21 deletions
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index ee04d4f47bc..b983c6f7dc4 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -222,6 +222,8 @@ 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);
+
/* spacedata */
void BKE_spacedata_freelist(ListBase *lb);
void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 661d0da1550..3567de5df40 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -343,3 +343,25 @@ 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 7fea4b10ed9..35598db9e02 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -256,6 +256,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 */
/* Popup Blocks
*
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 11dfc44906a..b15be940eef 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -1202,24 +1202,21 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
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 */
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 0f04333c6c5..dae4a54c233 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2481,6 +2481,34 @@ void uiPupMenuReports(bContext *C, ReportList *reports)
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)
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index f47e9aa2a6f..880cc489838 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -70,6 +70,7 @@ void node_operatortypes(void)
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 @@ void node_keymap(struct wmWindowManager *wm)
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);
}
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index ac125c10b2d..1541b32f566 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -177,6 +177,9 @@ void sequencer_keymap(wmWindowManager *wm)
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);
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 2cd47e340bd..ce4f0bc8737 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -139,7 +139,7 @@ typedef struct SpaceSeq {
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;
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index f16180451a7..1a1172247fc 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -381,13 +381,9 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
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");
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 486a887b354..9ec0ce0df8d 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -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,6 +767,25 @@ static void WM_OT_search_menu(wmOperatorType *ot)
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 ************** */
@@ -2122,6 +2142,7 @@ void wm_operatortype_init(void)
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 */