diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-20 23:34:18 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-20 23:39:14 +0300 |
commit | e7895bac07f32d4f66184aff2ed2c08956daaac7 (patch) | |
tree | c817ebf7e0415253393b12aad58e5719c4e8ffba /source/blender/editors/interface/interface_region_popover.c | |
parent | 46514cf865238c6bbed70971da5ab8e1a8ef9fc2 (diff) |
UI: support for custom keymaps for popovers
Diffstat (limited to 'source/blender/editors/interface/interface_region_popover.c')
-rw-r--r-- | source/blender/editors/interface/interface_region_popover.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c index 2f654b4f7cd..4aeb9a6d00b 100644 --- a/source/blender/editors/interface/interface_region_popover.c +++ b/source/blender/editors/interface/interface_region_popover.c @@ -77,6 +77,11 @@ struct uiPopover { uiLayout *layout; uiBut *but; + /* Needed for keymap removal. */ + wmWindow *window; + wmKeyMap *keymap; + struct wmEventHandler *keymap_handler; + uiMenuCreateFunc menu_func; void *menu_arg; @@ -204,6 +209,10 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v static void ui_block_free_func_POPOVER(uiPopupBlockHandle *UNUSED(handle), void *arg_pup) { uiPopover *pup = arg_pup; + if (pup->keymap != NULL) { + wmWindow *window = pup->window; + WM_event_remove_keymap_handler(&window->modalhandlers, pup->keymap); + } MEM_freeN(pup); } @@ -261,22 +270,44 @@ uiPopover *UI_popover_begin(bContext *C) return pup; } +static void popover_keymap_fn(wmKeyMap *UNUSED(keymap), wmKeyMapItem *UNUSEDF(kmi), void *user_data) +{ + uiPopover *pup = user_data; + pup->block->handle->menuretval = UI_RETURN_OK; +} + /* set the whole structure to work */ -void UI_popover_end(bContext *C, uiPopover *pup) +void UI_popover_end(bContext *C, uiPopover *pup, wmKeyMap *keymap) { + wmWindow *window = CTX_wm_window(C); /* Create popup block. No refresh support since the buttons were created * between begin/end and we have no callback to recreate them. */ uiPopupBlockHandle *handle; + if (keymap) { + /* Add so we get keymaps shown in the buttons. */ + UI_block_flag_enable(pup->block, UI_BLOCK_SHOW_SHORTCUT_ALWAYS); + pup->keymap = keymap; + pup->keymap_handler = WM_event_add_keymap_handler_priority(&window->modalhandlers, keymap, 0); + WM_event_set_keymap_handler_callback(pup->keymap_handler, popover_keymap_fn, pup); + } + handle = ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_POPOVER, pup); handle->popup_create_vars.free_func = ui_block_free_func_POPOVER; /* Add handlers. */ - wmWindow *window = CTX_wm_window(C); UI_popup_handlers_add(C, &window->modalhandlers, handle, 0); WM_event_add_mousemove(C); handle->popup = true; + /* Re-add so it gets priority. */ + if (keymap) { + BLI_remlink(&window->modalhandlers, pup->keymap_handler); + BLI_addhead(&window->modalhandlers, pup->keymap_handler); + } + + pup->window = window; + /* 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. */ |