From d5c155a9f3ff38e28ac073f6df43175724ebc290 Mon Sep 17 00:00:00 2001 From: Dmitry Kalinkin Date: Mon, 7 Dec 2020 12:32:34 -0500 Subject: [PATCH 4/6] Revert "QCocoaDrag - avoid using the deprecated API if possible" This reverts commit 8481a9fc974a1f1dd44a9f82decb18fe2290689f. --- src/plugins/platforms/cocoa/qcocoadrag.h | 6 -- src/plugins/platforms/cocoa/qcocoadrag.mm | 90 ------------------- .../platforms/cocoa/qnsview_dragging.mm | 9 +- 3 files changed, 1 insertion(+), 104 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoadrag.h b/src/plugins/platforms/cocoa/qcocoadrag.h index 975741c270..5a5b985c6e 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.h +++ b/src/plugins/platforms/cocoa/qcocoadrag.h @@ -48,8 +48,6 @@ #include #include -#include - QT_BEGIN_NAMESPACE class QCocoaDrag : public QPlatformDrag @@ -71,15 +69,11 @@ public: void setLastMouseEvent(NSEvent *event, NSView *view); void setAcceptedAction(Qt::DropAction act); - void exitDragLoop(); private: QDrag *m_drag; NSEvent *m_lastEvent; NSView *m_lastView; Qt::DropAction m_executed_drop_action; - QEventLoop internalDragLoop; - - bool maybeDragMultipleItems(); QPixmap dragPixmap(QDrag *drag, QPoint &hotSpot) const; }; diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm index ab6863a432..b4a16ab912 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -44,9 +44,6 @@ #include #endif #include -#include - -#include QT_BEGIN_NAMESPACE @@ -131,9 +128,6 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) m_drag = o; m_executed_drop_action = Qt::IgnoreAction; - if (maybeDragMultipleItems()) - return m_executed_drop_action; - QPoint hotSpot = m_drag->hotSpot(); QPixmap pm = dragPixmap(m_drag, hotSpot); NSImage *dragImage = [NSImage imageFromQImage:pm.toImage()]; @@ -164,95 +158,11 @@ Qt::DropAction QCocoaDrag::drag(QDrag *o) return m_executed_drop_action; } -bool QCocoaDrag::maybeDragMultipleItems() -{ - Q_ASSERT(m_drag && m_drag->mimeData()); - Q_ASSERT(m_executed_drop_action == Qt::IgnoreAction); - - if (QOperatingSystemVersion::current() < QOperatingSystemVersion::MacOSMojave) { - // -dragImage: stopped working in 10.14 first. - return false; - } - - const QMacAutoReleasePool pool; - - NSWindow *theWindow = [m_lastEvent window]; - Q_ASSERT(theWindow); - - if (![theWindow.contentView respondsToSelector:@selector(draggingSession:sourceOperationMaskForDraggingContext:)]) - return false; - - auto *sourceView = static_cast*>(theWindow.contentView); - - const auto &qtUrls = m_drag->mimeData()->urls(); - NSPasteboard *dragBoard = [NSPasteboard pasteboardWithName:NSPasteboardNameDrag]; - - if (int(dragBoard.pasteboardItems.count) == 1 && qtUrls.size() <= 1) { - // Good old -dragImage: works perfectly for this ... - return false; - } - - std::vector nonUrls; - for (NSPasteboardItem *item in dragBoard.pasteboardItems) { - bool isUrl = false; - for (NSPasteboardType type in item.types) { - using NSStringRef = NSString *; - if ([type isEqualToString:NSStringRef(kUTTypeFileURL)]) { - isUrl = true; - break; - } - } - - if (!isUrl) - nonUrls.push_back(item); - } - - QPoint hotSpot = m_drag->hotSpot(); - const auto pixmap = dragPixmap(m_drag, hotSpot); - NSImage *dragImage = [NSImage imageFromQImage:pixmap.toImage()]; - Q_ASSERT(dragImage); - - NSMutableArray *dragItems = [[[NSMutableArray alloc] init] autorelease]; - const NSPoint itemLocation = m_drag->hotSpot().toCGPoint(); - // 0. We start from URLs, which can be actually in a list (thus technically - // only ONE item in the pasteboard. The fact it's only one does not help, we are - // still getting an exception because of the number of items/images mismatch ... - for (const auto &qtUrl : qtUrls) { - NSURL *nsUrl = qtUrl.toNSURL(); - auto *newItem = [[[NSDraggingItem alloc] initWithPasteboardWriter:nsUrl] autorelease]; - const NSRect itemFrame = NSMakeRect(itemLocation.x, itemLocation.y, - dragImage.size.width, - dragImage.size.height); - [newItem setDraggingFrame:itemFrame contents:dragImage]; - [dragItems addObject:newItem]; - } - // 1. Repeat for non-url items, if any: - for (auto *pbItem : nonUrls) { - auto *newItem = [[[NSDraggingItem alloc] initWithPasteboardWriter:pbItem] autorelease]; - const NSRect itemFrame = NSMakeRect(itemLocation.x, itemLocation.y, - dragImage.size.width, - dragImage.size.height); - [newItem setDraggingFrame:itemFrame contents:dragImage]; - [dragItems addObject:newItem]; - } - - [sourceView beginDraggingSessionWithItems:dragItems event:m_lastEvent source:sourceView]; - internalDragLoop.exec(); - return true; -} - void QCocoaDrag::setAcceptedAction(Qt::DropAction act) { m_executed_drop_action = act; } -void QCocoaDrag::exitDragLoop() -{ - if (internalDragLoop.isRunning()) - internalDragLoop.exit(); -} - - QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const { const QMimeData* data = drag->mimeData(); diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm index 978d73f7d9..463e3c5579 100644 --- a/src/plugins/platforms/cocoa/qnsview_dragging.mm +++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm @@ -232,10 +232,6 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin if (!target) return; - auto *nativeDrag = QCocoaIntegration::instance()->drag(); - Q_ASSERT(nativeDrag); - nativeDrag->exitDragLoop(); - QPoint windowPoint = QPointF::fromCGPoint([self convertPoint:sender.draggingLocation fromView:nil]).toPoint(); qCDebug(lcQpaMouse) << QEvent::DragLeave << self << "at" << windowPoint; @@ -294,10 +290,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin if (!target) return; - QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); - Q_ASSERT(nativeDrag); - nativeDrag->exitDragLoop(); - nativeDrag->setAcceptedAction(qt_mac_mapNSDragOperation(operation)); + QCocoaIntegration::instance()->drag(); // Qt starts drag-and-drop on a mouse button press event. Cococa in // this case won't send the matching release event, so we have to -- 2.21.0