QNSView: Implement custom cursors for drag and drop.

The change has been made so it support possible future change
for QTBUG-26724

Task-number: QTBUG-40346
Change-Id: Ia52835f1a882289a2a22a0b755c943a12b8d3aa3
Reviewed-by: Christoph Schleifenbaum <christoph.schleifenbaum@kdab.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
This commit is contained in:
Filipe Azevedo 2015-03-16 14:07:17 +01:00 committed by Timur Pocheptsov
parent d370878aa0
commit 939f21be53

View File

@ -1883,6 +1883,48 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
response = QWindowSystemInterface::handleDrag(target, &mimeData, mapWindowCoordinates(m_window, target, qt_windowPoint), qtAllowed);
}
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
const QPixmap pixmapCursor = nativeDrag->currentDrag()->dragCursor(response.acceptedAction());
NSCursor *nativeCursor = nil;
if (pixmapCursor.isNull()) {
switch (response.acceptedAction()) {
case Qt::CopyAction:
nativeCursor = [NSCursor dragCopyCursor];
break;
case Qt::LinkAction:
nativeCursor = [NSCursor dragLinkCursor];
break;
case Qt::IgnoreAction:
// Uncomment the next lines if forbiden cursor wanted on non droppable targets.
/*nativeCursor = [NSCursor operationNotAllowedCursor];
break;*/
case Qt::MoveAction:
default:
nativeCursor = [NSCursor arrowCursor];
break;
}
}
else {
NSImage *nsimage = qt_mac_create_nsimage(pixmapCursor);
nativeCursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSZeroPoint];
[nsimage release];
}
// change the cursor
[nativeCursor set];
// Make sure the cursor is updated correctly if the mouse does not move and window is under cursor
// by creating a fake move event
const QPoint mousePos(QCursor::pos());
CGEventRef moveEvent(CGEventCreateMouseEvent(
NULL, kCGEventMouseMoved,
CGPointMake(mousePos.x(), mousePos.y()),
kCGMouseButtonLeft // ignored
));
CGEventPost(kCGHIDEventTap, moveEvent);
CFRelease(moveEvent);
return qt_mac_mapDropAction(response.acceptedAction());
}