[Bf-blender-cvs] [f7c13f2d761] master: Revert "UI: remove checks for other popovers when switching menu"

Sebastian Parborg noreply at git.blender.org
Wed Jul 31 19:16:34 CEST 2019


Commit: f7c13f2d761a1938a96c6435055c4308504527ff
Author: Sebastian Parborg
Date:   Wed Jul 31 19:10:44 2019 +0200
Branches: master
https://developer.blender.org/rBf7c13f2d761a1938a96c6435055c4308504527ff

Revert "UI: remove checks for other popovers when switching menu"

This reverts commit 77616571292ab1eeb9805797bfdd4525cc306923.

This commit broke overlapping popovers. For example in the color
management tab it would be impossible to select and of the popover
alternatives as it would switch to the menu button under the cursor.

===================================================================

M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_query.c

===================================================================

diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index d48d674f7a3..245277c8d22 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -10112,6 +10112,7 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSE
   but = ui_region_find_active_but(ar);
 
   if (but) {
+    bScreen *screen = CTX_wm_screen(C);
     uiBut *but_other;
     uiHandleButtonData *data;
 
@@ -10122,6 +10123,8 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void *UNUSE
         /* Make sure this popup isn't dragging a button.
          * can happen with popovers (see T67882). */
         (ui_region_find_active_but(data->menu->region) == NULL) &&
+        /* make sure mouse isn't inside another menu (see T43247) */
+        (ui_screen_region_find_mouse_over(screen, event) == NULL) &&
         (ELEM(but->type, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER, UI_BTYPE_MENU)) &&
         (but_other = ui_but_find_mouse_over(ar, event)) && (but != but_other) &&
         (ELEM(but_other->type, UI_BTYPE_PULLDOWN, UI_BTYPE_POPOVER, UI_BTYPE_MENU))) {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index fc65129ebf7..a5d9d35e2fe 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -938,6 +938,9 @@ uiBut *ui_region_find_active_but(struct ARegion *ar) ATTR_WARN_UNUSED_RESULT;
 bool ui_region_contains_point_px(const struct ARegion *ar, int x, int y) ATTR_WARN_UNUSED_RESULT;
 bool ui_region_contains_rect_px(const struct ARegion *ar, const rcti *rect_px);
 
+ARegion *ui_screen_region_find_mouse_over_ex(bScreen *screen, int x, int y);
+ARegion *ui_screen_region_find_mouse_over(bScreen *screen, const struct wmEvent *event);
+
 /* interface_context_menu.c */
 bool ui_popup_context_menu_for_button(struct bContext *C, uiBut *but);
 void ui_popup_context_menu_for_panel(struct bContext *C, struct ARegion *ar, struct Panel *pa);
diff --git a/source/blender/editors/interface/interface_query.c b/source/blender/editors/interface/interface_query.c
index 462183b4245..d0efb3714bc 100644
--- a/source/blender/editors/interface/interface_query.c
+++ b/source/blender/editors/interface/interface_query.c
@@ -570,3 +570,29 @@ bool ui_region_contains_rect_px(const ARegion *ar, const rcti *rect_px)
 }
 
 /** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Screen (#bScreen) Spatial
+ * \{ */
+
+/** Check if the cursor is over any popups. */
+ARegion *ui_screen_region_find_mouse_over_ex(bScreen *screen, int x, int y)
+{
+  for (ARegion *ar = screen->regionbase.first; ar; ar = ar->next) {
+    rcti winrct;
+
+    ui_region_winrct_get_no_margin(ar, &winrct);
+
+    if (BLI_rcti_isect_pt(&winrct, x, y)) {
+      return ar;
+    }
+  }
+  return NULL;
+}
+
+ARegion *ui_screen_region_find_mouse_over(bScreen *screen, const wmEvent *event)
+{
+  return ui_screen_region_find_mouse_over_ex(screen, event->x, event->y);
+}
+
+/** \} */



More information about the Bf-blender-cvs mailing list