diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-06-23 11:45:19 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-06-23 11:46:09 +0300 |
commit | 43872124f78de03e55b567cf13fc88ff8edbef55 (patch) | |
tree | f54054deeb11d4f642aa28a2f2a5c0db404f35fc /source/blender/editors | |
parent | 0511cded25257877e5c41e27b5d01c29d37efac5 (diff) | |
parent | f8a3636374b76f6db31be21beaa0e40857644bc4 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/editors')
4 files changed, 46 insertions, 44 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 0b4817c8049..0666691607d 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -418,6 +418,7 @@ uiPopupMenu *UI_popup_menu_begin_ex( struct bContext *C, const char *title, const char *block_name, int icon) ATTR_NONNULL(); void UI_popup_menu_end(struct bContext *C, struct uiPopupMenu *head); +bool UI_popup_menu_end_or_cancel(struct bContext *C, struct uiPopupMenu *head); struct uiLayout *UI_popup_menu_layout(uiPopupMenu *head); void UI_popup_menu_reports(struct bContext *C, struct ReportList *reports) ATTR_NONNULL(); @@ -534,6 +535,8 @@ void UI_block_flag_enable(uiBlock *block, int flag); void UI_block_flag_disable(uiBlock *block, int flag); void UI_block_translate(uiBlock *block, int x, int y); +bool UI_block_is_empty(const uiBlock *block); + int UI_but_return_value_get(uiBut *but); void UI_but_drag_set_id(uiBut *but, struct ID *id); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 8c37054098b..a36f534807c 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -4031,6 +4031,16 @@ int UI_blocklist_min_y_get(ListBase *lb) return min; } +bool UI_block_is_empty(const uiBlock *block) +{ + for (const uiBut *but = block->buttons.first; but; but = but->next) { + if (!ELEM(but->type, UI_BTYPE_SEPR, UI_BTYPE_SEPR_LINE)) { + return false; + } + } + return true; +} + void UI_block_direction_set(uiBlock *block, char direction) { block->direction = direction; @@ -4780,4 +4790,3 @@ void UI_exit(void) ui_resources_free(); ui_but_clipboard_free(); } - diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 9d202c87077..cb37c301031 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -6714,46 +6714,36 @@ 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 = NULL; - uiLayout *layout = NULL; MenuType *mt = WM_menutype_find("WM_MT_button_context", true); bool is_array, is_array_component; wmOperatorType *ot; PointerRNA op_ptr; -/* if ((but->rnapoin.data && but->rnaprop) == 0 && but->optype == NULL)*/ -/* return 0;*/ - /* having this menu for some buttons makes no sense */ if (but->type == UI_BTYPE_IMAGE) { return false; } + uiPopupMenu *pup; + uiLayout *layout; + + { + uiStringInfo label = {BUT_GET_LABEL, NULL}; + + /* 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); @@ -6999,8 +6989,6 @@ 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", @@ -7027,8 +7015,6 @@ 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, ""); @@ -7045,7 +7031,6 @@ 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); } @@ -7055,8 +7040,6 @@ 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"); @@ -7079,7 +7062,6 @@ 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"); } @@ -7087,27 +7069,20 @@ 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)); } - if (pup != NULL) { - UI_popup_menu_end(C, pup); - } - - return (pup != NULL); + return UI_popup_menu_end_or_cancel(C, pup); } static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, const wmEvent *event) diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c index a6046e551c6..b9222a75803 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.c +++ b/source/blender/editors/interface/interface_region_menu_popup.c @@ -458,6 +458,21 @@ void UI_popup_menu_end(bContext *C, uiPopupMenu *pup) MEM_freeN(pup); } +bool UI_popup_menu_end_or_cancel(bContext *C, uiPopupMenu *pup) +{ + if (!UI_block_is_empty(pup->block)) { + UI_popup_menu_end(C, pup); + return true; + } + else { + UI_block_layout_resolve(pup->block, NULL, NULL); + MEM_freeN(pup->block->handle); + UI_block_free(C, pup->block); + MEM_freeN(pup); + return false; + } +} + uiLayout *UI_popup_menu_layout(uiPopupMenu *pup) { return pup->layout; |