Fix T36976: drag and drop tooltip not working with retina and drawing off

screen near top of the window.

The code here was not updated for retina / DPI changes yet. The tooltip also
could draw off screen when dragging to a button at the top of the window, now
it places the tooltip lower in such cases.

Offscreen drawing fix is based on patch by Antony Riakiotakis.
This commit is contained in:
Brecht Van Lommel 2013-11-26 21:36:53 +01:00
parent c16f751475
commit 8a54336ff7
Notes: blender-bot 2023-02-14 11:46:06 +01:00
Referenced by issue #36976, Drag'n'Drop Tooltip off-screen (dragging screen to scene name)
1 changed files with 30 additions and 17 deletions

View File

@ -217,9 +217,11 @@ static const char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event)
static void wm_drop_operator_options(bContext *C, wmDrag *drag, wmEvent *event)
{
wmWindow *win = CTX_wm_window(C);
int winsizex = WM_window_pixels_x(win);
int winsizey = WM_window_pixels_y(win);
/* for multiwin drags, we only do this if mouse inside */
if (event->x < 0 || event->y < 0 || event->x > win->sizex || event->y > win->sizey)
if (event->x < 0 || event->y < 0 || event->x > winsizex || event->y > winsizey)
return;
drag->opname[0] = 0;
@ -257,14 +259,15 @@ void wm_drags_check_ops(bContext *C, wmEvent *event)
static void wm_drop_operator_draw(const char *name, int x, int y)
{
int width = UI_GetStringWidth(name);
int padding = 4 * UI_DPI_FAC;
glColor4ub(0, 0, 0, 50);
uiSetRoundBox(UI_CNR_ALL | UI_RB_ALPHA);
uiRoundBox(x, y, x + width + 8, y + 15, 4);
uiRoundBox(x, y, x + width + 2 * padding, y + 4 * padding, padding);
glColor4ub(255, 255, 255, 255);
UI_DrawString(x + 4, y + 4, name);
UI_DrawString(x + padding, y + padding, name);
}
static const char *wm_drag_name(wmDrag *drag)
@ -301,6 +304,7 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmDrag *drag;
int winsizey = WM_window_pixels_y(win);
int cursorx, cursory, x, y;
cursorx = win->eventstate->x;
@ -313,6 +317,8 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
/* XXX todo, multiline drag draws... but maybe not, more types mixed wont work well */
glEnable(GL_BLEND);
for (drag = wm->drags.first; drag; drag = drag->next) {
int iconsize = 16 * UI_DPI_FAC; /* assumed to be 16 pixels */
int padding = 4 * UI_DPI_FAC;
/* image or icon */
if (drag->imb) {
@ -327,29 +333,28 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
}
}
else {
x = cursorx - 8;
y = cursory - 2;
x = cursorx - 2 * padding;
y = cursory - 2 * UI_DPI_FAC;
/* icons assumed to be 16 pixels */
if (rect)
drag_rect_minmax(rect, x, y, x + 16, y + 16);
drag_rect_minmax(rect, x, y, x + iconsize, y + iconsize);
else
UI_icon_draw_aspect(x, y, drag->icon, 1.0, 0.8);
UI_icon_draw_aspect(x, y, drag->icon, 1.0f / UI_DPI_FAC, 0.8);
}
/* item name */
if (drag->imb) {
x = cursorx - drag->sx / 2;
y = cursory - drag->sy / 2 - 16;
y = cursory - drag->sy / 2 - iconsize;
}
else {
x = cursorx + 10;
y = cursory + 1;
x = cursorx + 10 * UI_DPI_FAC;
y = cursory + 1 * UI_DPI_FAC;
}
if (rect) {
int w = UI_GetStringWidth(wm_drag_name(drag));
drag_rect_minmax(rect, x, y, x + w, y + 16);
drag_rect_minmax(rect, x, y, x + w, y + iconsize);
}
else {
glColor4ub(255, 255, 255, 255);
@ -360,16 +365,24 @@ void wm_drags_draw(bContext *C, wmWindow *win, rcti *rect)
if (drag->opname[0]) {
if (drag->imb) {
x = cursorx - drag->sx / 2;
y = cursory + drag->sy / 2 + 4;
if (cursory + drag->sy / 2 + padding + iconsize < winsizey)
y = cursory + drag->sy / 2 + padding;
else
y = cursory - drag->sy / 2 - padding - iconsize - padding - iconsize;
}
else {
x = cursorx - 8;
y = cursory + 16;
x = cursorx - 2 * padding;
if (cursory + iconsize + iconsize < winsizey)
y = cursory + iconsize;
else
y = cursory - iconsize - 2 * UI_DPI_FAC;
}
if (rect) {
int w = UI_GetStringWidth(wm_drag_name(drag));
drag_rect_minmax(rect, x, y, x + w, y + 16);
drag_rect_minmax(rect, x, y, x + w, y + iconsize);
}
else
wm_drop_operator_draw(drag->opname, x, y);