From ead7a881a5ac7cd198492e576d6adfe217f4c288 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 28 Feb 2025 19:04:22 +0100 Subject: [PATCH] Fix: Constrain Docking Hint to Window Bounds While joining and docking areas there is hint shown near the mouse that describes the potential operation. But it is cut off if your mouse is at the extreme right or bottom edge of the window. This PR just clamps the position so it is always visible. Co-authored-by: Jonas Holzman Pull Request: https://projects.blender.org/blender/blender/pulls/135211 --- source/blender/editors/screen/screen_draw.cc | 22 +++++++++++++------ .../blender/editors/screen/screen_intern.hh | 9 ++++++-- source/blender/editors/screen/screen_ops.cc | 4 ++-- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/screen/screen_draw.cc b/source/blender/editors/screen/screen_draw.cc index a605bd8c824..052c0a30091 100644 --- a/source/blender/editors/screen/screen_draw.cc +++ b/source/blender/editors/screen/screen_draw.cc @@ -308,7 +308,8 @@ void screen_draw_move_highlight(bScreen *screen, eScreenAxis dir_axis) &rect, inner, nullptr, 1.0f, outline, 2.0f * U.pixelsize, 2.5f * U.pixelsize); } -static void screen_draw_area_drag_tip(int x, int y, const ScrArea *source, const std::string &hint) +static void screen_draw_area_drag_tip( + const wmWindow *win, int x, int y, const ScrArea *source, const std::string &hint) { const char *area_name = IFACE_(ED_area_name(source).c_str()); const uiFontStyle *fstyle = UI_FSTYLE_TOOLTIP; @@ -333,8 +334,9 @@ static void screen_draw_area_drag_tip(int x, int y, const ScrArea *source, const const float height = margin + lheight + line_gap + lheight + margin; /* Position of this hint relative to the mouse position. */ - const int left = x + int(5.0f * UI_SCALE_FAC); - const int top = y - int(7.0f * UI_SCALE_FAC); + const int left = std::min(x + int(5.0f * UI_SCALE_FAC), + WM_window_native_pixel_x(win) - int(width)); + const int top = std::max(y - int(7.0f * UI_SCALE_FAC), int(height)); rctf rect; rect.xmin = left; @@ -447,7 +449,7 @@ void screen_draw_join_highlight(const wmWindow *win, ScrArea *sa1, ScrArea *sa2, UI_draw_roundbox_4fv_ex(&combined, inner, nullptr, 1.0f, outline, U.pixelsize, 6 * U.pixelsize); screen_draw_area_drag_tip( - win->eventstate->xy[0], win->eventstate->xy[1], sa1, IFACE_("Join Areas")); + win, win->eventstate->xy[0], win->eventstate->xy[1], sa1, IFACE_("Join Areas")); } static void rounded_corners(rctf rect, float color[4], int corners) @@ -517,8 +519,13 @@ static void rounded_corners(rctf rect, float color[4], int corners) immUnbindProgram(); } -void screen_draw_dock_preview( - ScrArea *source, ScrArea *target, AreaDockTarget dock_target, float factor, int x, int y) +void screen_draw_dock_preview(const wmWindow *win, + ScrArea *source, + ScrArea *target, + AreaDockTarget dock_target, + float factor, + int x, + int y) { if (dock_target == AreaDockTarget::None) { return; @@ -584,7 +591,8 @@ void screen_draw_dock_preview( UI_draw_roundbox_4fv(&dest, true, 0.0f, border); } - screen_draw_area_drag_tip(x, + screen_draw_area_drag_tip(win, + x, y, source, dock_target == AreaDockTarget::Center ? IFACE_("Replace this area") : diff --git a/source/blender/editors/screen/screen_intern.hh b/source/blender/editors/screen/screen_intern.hh index 96de9aa1924..16d24fb384f 100644 --- a/source/blender/editors/screen/screen_intern.hh +++ b/source/blender/editors/screen/screen_intern.hh @@ -92,8 +92,13 @@ void region_toggle_hidden(bContext *C, ARegion *region, bool do_fade); * \param sa2: Target area that will be replaced. */ void screen_draw_join_highlight(const wmWindow *win, ScrArea *sa1, ScrArea *sa2, eScreenDir dir); -void screen_draw_dock_preview( - ScrArea *source, ScrArea *target, AreaDockTarget dock_target, float factor, int x, int y); +void screen_draw_dock_preview(const wmWindow *win, + ScrArea *source, + ScrArea *target, + AreaDockTarget dock_target, + float factor, + int x, + int y); void screen_draw_split_preview(ScrArea *area, eScreenAxis dir_axis, float factor); void screen_draw_move_highlight(bScreen *screen, eScreenAxis dir_axis); diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index 60dcf5dfa28..dc6f464e310 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -3627,7 +3627,7 @@ static void area_join_draw_cb(const wmWindow *win, void *userdata) } } -static void area_join_dock_cb(const wmWindow * /*win*/, void *userdata) +static void area_join_dock_cb(const wmWindow *win, void *userdata) { const wmOperator *op = static_cast(userdata); sAreaJoinData *jd = static_cast(op->customdata); @@ -3635,7 +3635,7 @@ static void area_join_dock_cb(const wmWindow * /*win*/, void *userdata) return; } screen_draw_dock_preview( - jd->sa1, jd->sa2, jd->dock_target, jd->factor, jd->current_x, jd->current_y); + win, jd->sa1, jd->sa2, jd->dock_target, jd->factor, jd->current_x, jd->current_y); } static void area_join_dock_cb_window(sAreaJoinData *jd, wmOperator *op)