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>2018-06-21 17:43:39 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-06-21 17:43:39 +0300
commit78653cfb8cf53074a107e09bfe46c36192aa54d7 (patch)
tree5f5065ed0d7725f7a1e91cc7dd1eb116b581a062 /source/blender
parentc45a3b80e2356a952248eaafaeeec48b28bcb0fd (diff)
parent84dbf949d7263d22b8b87f1532a00db80ac12fab (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/interface/interface_handlers.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index d25488670e4..9d202c87077 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -6714,13 +6714,33 @@ static void ui_but_menu_add_path_operators(uiLayout *layout, PointerRNA *ptr, Pr
RNA_string_set(&props_ptr, "filepath", dir);
}
+static void ui_but_menu_lazy_init(
+ bContext *C, uiBut *but,
+ uiPopupMenu **pup_p, uiLayout **layout_p)
+{
+ if (*pup_p != NULL) {
+ return;
+ }
+
+ uiStringInfo label = {BUT_GET_LABEL, NULL};
+
+ /* highly unlikely getting the label ever fails */
+ UI_but_string_info_get(C, but, &label, NULL);
+
+ *pup_p = UI_popup_menu_begin(C, label.strinfo ? label.strinfo : "", ICON_NONE);
+ *layout_p = UI_popup_menu_layout(*pup_p);
+ if (label.strinfo) {
+ MEM_freeN(label.strinfo);
+ }
+ uiLayoutSetOperatorContext(*layout_p, WM_OP_INVOKE_DEFAULT);
+}
+
static bool ui_but_menu(bContext *C, uiBut *but)
{
- uiPopupMenu *pup;
- uiLayout *layout;
+ uiPopupMenu *pup = NULL;
+ uiLayout *layout = NULL;
MenuType *mt = WM_menutype_find("WM_MT_button_context", true);
bool is_array, is_array_component;
- uiStringInfo label = {BUT_GET_LABEL, NULL};
wmOperatorType *ot;
PointerRNA op_ptr;
@@ -6732,17 +6752,8 @@ static bool ui_but_menu(bContext *C, uiBut *but)
return false;
}
- /* highly unlikely getting the label ever fails */
- UI_but_string_info_get(C, but, &label, NULL);
-
- pup = UI_popup_menu_begin(C, label.strinfo ? label.strinfo : "", ICON_NONE);
- layout = UI_popup_menu_layout(pup);
- if (label.strinfo)
- MEM_freeN(label.strinfo);
-
- uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
-
if (but->rnapoin.data && but->rnaprop) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
PointerRNA *ptr = &but->rnapoin;
PropertyRNA *prop = but->rnaprop;
const PropertyType type = RNA_property_type(prop);
@@ -6988,6 +6999,8 @@ static bool ui_but_menu(bContext *C, uiBut *but)
/* We do have a shortcut, but only keyboard ones are editbale that way... */
if (kmi) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
+
if (ISKEYBOARD(kmi->type)) {
#if 0 /* would rather use a block but, but gets weirdly positioned... */
uiDefBlockBut(block, menu_change_shortcut, but, "Change Shortcut",
@@ -7014,6 +7027,8 @@ static bool ui_but_menu(bContext *C, uiBut *but)
}
/* only show 'add' if there's a suitable key map for it to go in */
else if (WM_keymap_guess_opname(C, but->optype->idname)) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
+
but2 = uiDefIconTextBut(block, UI_BTYPE_BUT, 0, ICON_HAND,
CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Add Shortcut"),
0, 0, w, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
@@ -7030,6 +7045,7 @@ static bool ui_but_menu(bContext *C, uiBut *but)
if (ui_block_is_menu(but->block) == false) {
ARegion *ar = CTX_wm_region(C);
if (ar && (ar->regiontype == RGN_TYPE_HEADER)) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
uiItemMenuF(layout, IFACE_("Header"), ICON_NONE, ED_screens_header_tools_menu_create, NULL);
uiItemS(layout);
}
@@ -7039,6 +7055,8 @@ static bool ui_but_menu(bContext *C, uiBut *but)
char buf[512];
if (UI_but_online_manual_id(but, buf, sizeof(buf))) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
+
PointerRNA ptr_props;
uiItemO(layout, CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Online Manual"),
ICON_URL, "WM_OT_doc_view_manual_ui_context");
@@ -7061,6 +7079,7 @@ static bool ui_but_menu(bContext *C, uiBut *but)
}
if (but->optype) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
uiItemO(layout, NULL,
ICON_NONE, "UI_OT_copy_python_command_button");
}
@@ -7068,22 +7087,27 @@ static bool ui_but_menu(bContext *C, uiBut *but)
/* perhaps we should move this into (G.debug & G_DEBUG) - campbell */
if (U.flag & USER_DEVELOPER_UI) {
if (ui_block_is_menu(but->block) == false) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
uiItemFullO(layout, "UI_OT_editsource", NULL, ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0, NULL);
}
}
if (BKE_addon_find(&U.addons, "ui_translate")) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
uiItemFullO(layout, "UI_OT_edittranslation_init", NULL, ICON_NONE, NULL, WM_OP_INVOKE_DEFAULT, 0, NULL);
}
mt = WM_menutype_find("WM_MT_button_context", true);
if (mt) {
+ ui_but_menu_lazy_init(C, but, &pup, &layout);
UI_menutype_draw(C, mt, uiLayoutColumn(layout, false));
}
- UI_popup_menu_end(C, pup);
+ if (pup != NULL) {
+ UI_popup_menu_end(C, pup);
+ }
- return true;
+ return (pup != NULL);
}
static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *event)