Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Sat, 23 Jun 2018 08:45:19 +0000 (10:45 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 23 Jun 2018 08:46:09 +0000 (10:46 +0200)
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_region_menu_popup.c

index 0b4817c8049a512cbe4766911d4967ce5305a6f4..0666691607dd251a589dbbfcddbf6fbd603b6286 100644 (file)
@@ -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);
index 8c37054098b3758e453c8128fe09219867453295..a36f534807cd9d6d22778f6cce98e247ffd910d8 100644 (file)
@@ -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();
 }
-
index 9d202c870777f1609827451e7ebccb71fd380ea0..cb37c3010312d4098d73b02efefa31dd68721578 100644 (file)
@@ -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)
index a6046e551c648a88ac7296816c6322524c349c9d..b9222a75803a08a94e1ab94845e0151522e67e9a 100644 (file)
@@ -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;