Commit: d3c89f50a0167cb978daf3eda064bc7f36167de8 Author: Campbell Barton Date: Sat May 19 10:22:44 2018 +0200 Branches: blender2.8 https://developer.blender.org/rBd3c89f50a0167cb978daf3eda064bc7f36167de8
UI: Use popover for toolbar popup operator - Currently the popup closes immediately, could be made configurable. - Support exiting popups when their submenu's are accessed. =================================================================== M release/scripts/startup/bl_operators/wm.py M source/blender/editors/interface/interface_region_popover.c M source/blender/editors/interface/interface_region_popup.c =================================================================== diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 3e2e31e1ef1..c4b04e63e3f 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2365,14 +2365,15 @@ class WM_OT_toolbar(Operator): from bl_ui.space_toolsystem_common import ToolSelectPanelHelper cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) if cls is None: - self.report({'WARNING'}, "Toolbar not found for {space_type!r}") + self.report({'WARNING'}, f"Toolbar not found for {space_type!r}") return {'CANCELLED'} def draw_menu(popover, context): cls.draw_cls(popover.layout, context, detect_layout=False) wm = context.window_manager - wm.popup_menu(draw_menu) + # wm.popup_menu(draw_menu) # this also works + wm.popover(draw_menu) return {'FINISHED'} diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index 219a4fc8ed5..fcfbc3027d0 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -250,6 +250,11 @@ void UI_popover_end(bContext *C, uiPopover *pup) UI_popup_handlers_add(C, &window->modalhandlers, handle, 0); WM_event_add_mousemove(C); handle->popup = true; + + /* TODO(campbell): we may want to make this configurable. + * The begin/end stype of calling popups doesn't allow to 'can_refresh' to be set. + * For now close this style of popvers when accessed. */ + UI_block_flag_disable(pup->block, UI_BLOCK_KEEP_OPEN); } uiLayout *UI_popover_layout(uiPopover *pup) diff --git a/source/blender/editors/interface/interface_region_popup.c b/source/blender/editors/interface/interface_region_popup.c index db3c8742e09..654dc5e4d30 100644 --- a/source/blender/editors/interface/interface_region_popup.c +++ b/source/blender/editors/interface/interface_region_popup.c @@ -704,6 +704,21 @@ uiPopupBlockHandle *ui_popup_block_create( void ui_popup_block_free(bContext *C, uiPopupBlockHandle *handle) { + /* If this popup is created from a popover which does NOT have keep-open flag set, + * then close the popover too. We could extend this to other popup types too. */ + ARegion *ar = handle->popup_create_vars.butregion; + if (ar != NULL) { + for (uiBlock *block = ar->uiblocks.first; block; block = block->next) { + if (block->handle && + (block->flag & UI_BLOCK_POPOVER) && + (block->flag & UI_BLOCK_KEEP_OPEN) == 0) + { + uiPopupBlockHandle *menu = block->handle; + menu->menuretval = UI_RETURN_OK; + } + } + } + if (handle->popup_create_vars.free_func) { handle->popup_create_vars.free_func(handle, handle->popup_create_vars.arg); } _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs