diff options
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_query.c | 27 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_region_menu_popup.c | 2 |
3 files changed, 25 insertions, 5 deletions
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 6fc71846cbb..5326888036e 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -524,6 +524,7 @@ bool UI_but_is_tool(const uiBut *but); bool UI_but_is_utf8(const uiBut *but); #define UI_but_is_decorator(but) ((but)->func == ui_but_anim_decorate_cb) +bool UI_block_is_empty_ex(const uiBlock *block, const bool skip_title); bool UI_block_is_empty(const uiBlock *block); bool UI_block_can_add_separator(const uiBlock *block); diff --git a/source/blender/editors/interface/interface_query.c b/source/blender/editors/interface/interface_query.c index 1c3d99d8bd2..457d01c5dc8 100644 --- a/source/blender/editors/interface/interface_query.c +++ b/source/blender/editors/interface/interface_query.c @@ -463,14 +463,33 @@ bool ui_block_is_popup_any(const uiBlock *block) return (ui_block_is_menu(block) || ui_block_is_popover(block) || ui_block_is_pie_menu(block)); } -bool UI_block_is_empty(const uiBlock *block) +static const uiBut *ui_but_next_non_separator(const uiBut *but) { - for (const uiBut *but = block->buttons.first; but; but = but->next) { + for (; but; but = but->next) { if (!ELEM(but->type, UI_BTYPE_SEPR, UI_BTYPE_SEPR_LINE)) { - return false; + return but; } } - return true; + return NULL; +} + +bool UI_block_is_empty_ex(const uiBlock *block, const bool skip_title) +{ + const uiBut *but = block->buttons.first; + if (skip_title) { + /* Skip the first label, since popups often have a title, + * we may want to consider the block empty in this case. */ + but = ui_but_next_non_separator(but); + if (but && but->type == UI_BTYPE_LABEL) { + but = but->next; + } + } + return (ui_but_next_non_separator(but) == NULL); +} + +bool UI_block_is_empty(const uiBlock *block) +{ + return UI_block_is_empty_ex(block, false); } bool UI_block_can_add_separator(const uiBlock *block) diff --git a/source/blender/editors/interface/interface_region_menu_popup.c b/source/blender/editors/interface/interface_region_menu_popup.c index ab3a86ec9e1..fed3c0b3d11 100644 --- a/source/blender/editors/interface/interface_region_menu_popup.c +++ b/source/blender/editors/interface/interface_region_menu_popup.c @@ -474,7 +474,7 @@ void UI_popup_menu_end(bContext *C, uiPopupMenu *pup) bool UI_popup_menu_end_or_cancel(bContext *C, uiPopupMenu *pup) { - if (!UI_block_is_empty(pup->block)) { + if (!UI_block_is_empty_ex(pup->block, true)) { UI_popup_menu_end(C, pup); return true; } |