[Bf-blender-cvs] [8a54336] master: Fix T36976: drag and drop tooltip not working with retina and drawing off screen near top of the window.

Brecht Van Lommel noreply at git.blender.org
Tue Nov 26 21:41:12 CET 2013


Commit: 8a54336ff7cf8a0b3b3ec4ae353b65716924d313
Author: Brecht Van Lommel
Date:   Tue Nov 26 21:36:53 2013 +0100
http://developer.blender.org/rB8a54336ff7cf8a0b3b3ec4ae353b65716924d313

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.

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

M	source/blender/windowmanager/intern/wm_dragdrop.c

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

diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 4c58089..53d846b 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -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);




More information about the Bf-blender-cvs mailing list