diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-04-04 00:32:31 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-04-04 00:33:42 +0400 |
commit | 602629502ca4d307b4791fd3d29e1f7fd4c55bdb (patch) | |
tree | 56c2f2474f68e1a9817d4e939fb37f59905e2ae4 /source | |
parent | d9237203123ad44c8be67859d57174c7e7ca47ae (diff) |
Clicking outside menus wasn't closing when opened from non menu popups
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 9568f90396b..c69472b74b0 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -7704,8 +7704,9 @@ static int ui_handle_menu_button(bContext *C, const wmEvent *event, uiPopupBlock return retval; } -static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, - int level, const bool is_parent_inside, const bool is_floating) +static int ui_handle_menu_event( + bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, + int level, const bool is_parent_inside, const bool is_parent_menu, const bool is_floating) { ARegion *ar; uiBlock *block; @@ -8054,7 +8055,7 @@ static int ui_handle_menu_event(bContext *C, const wmEvent *event, uiPopupBlockH if (ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE) && ELEM(event->val, KM_PRESS, KM_DBL_CLICK)) { - if ((level == 0) && (U.uiflag & USER_MENUOPENAUTO) == 0) { + if ((is_parent_menu == false) && (U.uiflag & USER_MENUOPENAUTO) == 0) { /* for root menus, allow clicking to close */ if (block->flag & (UI_BLOCK_OUT_1)) menu->menuretval = UI_RETURN_OK; @@ -8206,8 +8207,9 @@ static int ui_handle_menu_return_submenu(bContext *C, const wmEvent *event, uiPo return WM_UI_HANDLER_BREAK; } -static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, - int level, const bool is_parent_inside, const bool is_floating) +static int ui_handle_menus_recursive( + bContext *C, const wmEvent *event, uiPopupBlockHandle *menu, + int level, const bool is_parent_inside, const bool is_parent_menu, const bool is_floating) { uiBut *but; uiHandleButtonData *data; @@ -8221,11 +8223,12 @@ static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupB submenu = (data) ? data->menu : NULL; if (submenu) { + uiBlock *block = menu->region->uiblocks.first; + const bool is_menu = ui_block_is_menu(block); bool inside = false; if (is_parent_inside == false) { int mx, my; - uiBlock *block = menu->region->uiblocks.first; mx = event->x; my = event->y; @@ -8233,7 +8236,7 @@ static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupB inside = BLI_rctf_isect_pt(&block->rect, mx, my); } - retval = ui_handle_menus_recursive(C, event, submenu, level + 1, is_parent_inside || inside, false); + retval = ui_handle_menus_recursive(C, event, submenu, level + 1, is_parent_inside || inside, is_menu, false); } /* now handle events for our own menu */ @@ -8266,7 +8269,7 @@ static int ui_handle_menus_recursive(bContext *C, const wmEvent *event, uiPopupB } } else { - retval = ui_handle_menu_event(C, event, menu, level, is_parent_inside, is_floating); + retval = ui_handle_menu_event(C, event, menu, level, is_parent_inside, is_parent_menu, is_floating); } } @@ -8363,7 +8366,7 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSE /* handle events for menus and their buttons recursively, * this will handle events from the top to the bottom menu */ if (data->menu) - retval = ui_handle_menus_recursive(C, event, data->menu, 0, false, false); + retval = ui_handle_menus_recursive(C, event, data->menu, 0, false, false, false); /* handle events for the activated button */ if ((data->menu && (retval == WM_UI_HANDLER_CONTINUE)) || @@ -8409,7 +8412,7 @@ static int ui_handler_popup(bContext *C, const wmEvent *event, void *userdata) retval = WM_UI_HANDLER_CONTINUE; } - ui_handle_menus_recursive(C, event, menu, 0, false, true); + ui_handle_menus_recursive(C, event, menu, 0, false, false, true); /* free if done, does not free handle itself */ if (menu->menuretval) { |