diff --git a/source/blender/editors/include/UI_interface_c.hh b/source/blender/editors/include/UI_interface_c.hh index d58acf13281..bd5ffdb2436 100644 --- a/source/blender/editors/include/UI_interface_c.hh +++ b/source/blender/editors/include/UI_interface_c.hh @@ -726,6 +726,13 @@ bool UI_block_can_add_separator(const uiBlock *block); */ bool UI_block_has_active_default_button(const uiBlock *block); +/** + * Find a button under the mouse cursor, ignoring non-interactive ones (like labels). Holding Ctrl + * over a label button that can be Ctrl-Clicked to turn into an edit button will return that. + * Labels that are only interactive for the sake of displaying a tooltip are ignored too. + */ +uiBut *UI_but_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT; + uiList *UI_list_find_mouse_over(const ARegion *region, const wmEvent *event); /* `interface_region_menu_popup.cc` */ diff --git a/source/blender/editors/interface/eyedroppers/interface_eyedropper.cc b/source/blender/editors/interface/eyedroppers/interface_eyedropper.cc index f8e0f1421d8..f7842b335c9 100644 --- a/source/blender/editors/interface/eyedroppers/interface_eyedropper.cc +++ b/source/blender/editors/interface/eyedroppers/interface_eyedropper.cc @@ -117,7 +117,7 @@ uiBut *eyedropper_get_property_button_under_mouse(bContext *C, const wmEvent *ev ScrArea *area = BKE_screen_find_area_xy(screen, SPACE_TYPE_ANY, event->xy); const ARegion *region = BKE_area_find_region_xy(area, RGN_TYPE_ANY, event->xy); - uiBut *but = ui_but_find_mouse_over(region, event); + uiBut *but = UI_but_find_mouse_over(region, event); if (ELEM(nullptr, but, but->rnapoin.data, but->rnaprop)) { return nullptr; diff --git a/source/blender/editors/interface/interface_handlers.cc b/source/blender/editors/interface/interface_handlers.cc index afdb51ebea0..b88a09fd810 100644 --- a/source/blender/editors/interface/interface_handlers.cc +++ b/source/blender/editors/interface/interface_handlers.cc @@ -9708,7 +9708,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) } #endif case MOUSEMOVE: { - uiBut *but_other = ui_but_find_mouse_over(region, event); + uiBut *but_other = UI_but_find_mouse_over(region, event); bool exit = false; /* always deactivate button for pie menus, @@ -9870,7 +9870,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) } } - bt = ui_but_find_mouse_over(region, event); + bt = UI_but_find_mouse_over(region, event); if (bt && bt->active != data) { if (but->type != ButType::Color) { /* exception */ @@ -9882,7 +9882,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) } case RIGHTMOUSE: { if (event->val == KM_PRESS) { - uiBut *bt = ui_but_find_mouse_over(region, event); + uiBut *bt = UI_but_find_mouse_over(region, event); if (bt && bt->active == data) { button_activate_state(C, bt, BUTTON_STATE_HIGHLIGHT); } @@ -9951,7 +9951,7 @@ static int ui_handle_button_event(bContext *C, const wmEvent *event, uiBut *but) * it stays active while the mouse is over it. * This avoids adding mouse-moves, see: #33466. */ if (ELEM(state_orig, BUTTON_STATE_INIT, BUTTON_STATE_HIGHLIGHT, BUTTON_STATE_WAIT_DRAG)) { - if (ui_but_find_mouse_over(region, event) == but) { + if (UI_but_find_mouse_over(region, event) == but) { button_activate_init(C, region, but, BUTTON_ACTIVATE_OVER); } } @@ -12127,7 +12127,7 @@ static int ui_handler_region_menu(bContext *C, const wmEvent *event, void * /*us (ui_region_find_active_but(data->menu->region) == nullptr) && /* make sure mouse isn't inside another menu (see #43247) */ (ui_screen_region_find_mouse_over(screen, event) == nullptr) && - (but_other = ui_but_find_mouse_over(region, event)) && + (but_other = UI_but_find_mouse_over(region, event)) && ui_can_activate_other_menu(but, but_other, event) && /* Hover-opening menu's doesn't work well for buttons over one another * along the same axis the menu is opening on (see #71719). */ diff --git a/source/blender/editors/interface/interface_intern.hh b/source/blender/editors/interface/interface_intern.hh index 5636d899f65..880fc8604e8 100644 --- a/source/blender/editors/interface/interface_intern.hh +++ b/source/blender/editors/interface/interface_intern.hh @@ -1549,7 +1549,6 @@ uiBut *ui_but_find_mouse_over_ex(const ARegion *region, const uiButFindPollFn find_poll, const void *find_custom_data) ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT; -uiBut *ui_but_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT; uiBut *ui_but_find_rect_over(const ARegion *region, const rcti *rect_px) ATTR_WARN_UNUSED_RESULT; uiBut *ui_list_find_mouse_over_ex(const ARegion *region, const int xy[2]) diff --git a/source/blender/editors/interface/interface_query.cc b/source/blender/editors/interface/interface_query.cc index bd09f2354b9..689e8b8113c 100644 --- a/source/blender/editors/interface/interface_query.cc +++ b/source/blender/editors/interface/interface_query.cc @@ -368,7 +368,7 @@ uiBut *ui_but_find_mouse_over_ex(const ARegion *region, return butover; } -uiBut *ui_but_find_mouse_over(const ARegion *region, const wmEvent *event) +uiBut *UI_but_find_mouse_over(const ARegion *region, const wmEvent *event) { return ui_but_find_mouse_over_ex( region, event->xy, event->modifier & KM_CTRL, false, nullptr, nullptr); diff --git a/source/blender/editors/space_node/node_group.cc b/source/blender/editors/space_node/node_group.cc index e12469df2b4..55f6e83f15c 100644 --- a/source/blender/editors/space_node/node_group.cc +++ b/source/blender/editors/space_node/node_group.cc @@ -231,6 +231,11 @@ static wmOperatorStatus node_group_enter_exit_invoke(bContext *C, SpaceNode &snode = *CTX_wm_space_node(C); ARegion ®ion = *CTX_wm_region(C); + /* Don't interfer when the mouse is interacting with some button. See #147282. */ + if (ISMOUSE_BUTTON(event->type) && UI_but_find_mouse_over(®ion, event)) { + return OPERATOR_PASS_THROUGH | OPERATOR_CANCELLED; + } + float2 cursor; UI_view2d_region_to_view(®ion.v2d, event->mval[0], event->mval[1], &cursor.x, &cursor.y); bNode *node = node_under_mouse_get(snode, cursor);