diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-25 13:54:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-25 13:55:22 +0300 |
commit | b11a1d5da26fa2906955e54254672b1af075d0dc (patch) | |
tree | 0fcb6f0004708131f90a4522ed3807704205e672 /source/blender/editors/interface/interface_region_popover.c | |
parent | e9908134e87e4c69698d73ff144f3f8771a51be5 (diff) |
UI: support for a popup panel which stays open
Diffstat (limited to 'source/blender/editors/interface/interface_region_popover.c')
-rw-r--r-- | source/blender/editors/interface/interface_region_popover.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index 169b3d43e80..1f9326ac204 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -189,17 +189,26 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v UI_block_flag_enable(block, UI_BLOCK_LOOP); UI_block_direction_set(block, block->direction); block->minbounds = UI_MENU_WIDTH_MIN; + bool use_place_under_active = false; - uiBut *but = NULL; - for (but = block->buttons.first; but; but = but->next) { - if (but->flag & (UI_SELECT | UI_SELECT_DRAW)) { - break; - } +#ifdef USE_POPOVER_ONCE + if (pup->is_once) { + /* Weak, toolbars act like menus, so position with the cursor under the active button. */ + use_place_under_active = true; } +#endif + if (use_place_under_active) { + uiBut *but = NULL; + for (but = block->buttons.first; but; but = but->next) { + if (but->flag & (UI_SELECT | UI_SELECT_DRAW)) { + break; + } + } - if (but) { - offset[0] = -(but->rect.xmin + 0.8f * BLI_rctf_size_x(&but->rect)); - offset[1] = -(but->rect.ymin + 0.5f * BLI_rctf_size_y(&but->rect)); + if (but) { + offset[0] = -(but->rect.xmin + 0.8f * BLI_rctf_size_x(&but->rect)); + offset[1] = -(but->rect.ymin + 0.5f * BLI_rctf_size_y(&but->rect)); + } } UI_block_bounds_set_popup(block, block_margin, offset[0], offset[1]); @@ -256,11 +265,15 @@ uiPopupBlockHandle *ui_popover_panel_create( /** \name Standard Popover Panels * \{ */ - +static void ui_item_paneltype_func(bContext *C, uiLayout *layout, void *arg_pt) +{ + PanelType *pt = (PanelType *)arg_pt; + UI_paneltype_draw(C, pt, layout); +} int UI_popover_panel_invoke( bContext *C, int space_id, int region_id, const char *idname, - ReportList *reports) + bool keep_open, ReportList *reports) { uiLayout *layout; PanelType *pt = UI_paneltype_find(space_id, region_id, idname); @@ -277,7 +290,10 @@ int UI_popover_panel_invoke( return (OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH); } - { + if (keep_open) { + ui_popover_panel_create(C, NULL, NULL, ui_item_paneltype_func, pt); + } + else { uiPopover *pup = UI_popover_begin(C); layout = UI_popover_layout(pup); UI_paneltype_draw(C, pt, layout); @@ -366,7 +382,3 @@ void UI_popover_once_clear(uiPopover *pup) #endif /** \} */ - -/* We may want to support this in future */ -/* Similar to UI_popup_menu_invoke */ -// int UI_popover_panel_invoke(bContext *C, const char *idname, ReportList *reports); |