6@implementation QNSView (Dragging)
12 NSString *
const mimeTypeGeneric =
@"com.trolltech.qt.MimeTypeName";
13 NSMutableArray<NSString *> *supportedTypes = [NSMutableArray<NSString *> arrayWithArray:@[
14 NSPasteboardTypeColor, NSPasteboardTypeString,
15 NSPasteboardTypeFileURL, @"com.adobe.encapsulated-postscript", NSPasteboardTypeTIFF,
16 NSPasteboardTypeRTF, NSPasteboardTypeTabularText, NSPasteboardTypeFont,
17 NSPasteboardTypeRuler, NSFileContentsPboardType,
18 NSPasteboardTypeRTFD , NSPasteboardTypeHTML,
19 NSPasteboardTypeURL, NSPasteboardTypePDF, (NSString *)kUTTypeVCard,
20 (NSString *)kPasteboardTypeFileURLPromise, (NSString *)kUTTypeInkText,
21 NSPasteboardTypeMultipleTextSelection, mimeTypeGeneric]];
25 [supportedTypes addObject:customType.toNSString()];
27 [
self registerForDraggedTypes:supportedTypes];
35 candidate = candidate->parent();
42 return target->mapFromGlobal(
source->mapToGlobal(point));
45- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context
54- (BOOL)ignoreModifierKeysForDraggingSession:(NSDraggingSession *)session
71- (BOOL)wantsPeriodicDraggingUpdates
85- (BOOL)wantsPeriodicDraggingUpdates:(
void *)dummy
99 NSCursor *nativeCursor = nil;
101 if (pixmapCursor.
isNull()) {
104 nativeCursor = [NSCursor dragCopyCursor];
107 nativeCursor = [NSCursor dragLinkCursor];
115 nativeCursor = [NSCursor arrowCursor];
119 auto *nsimage = [NSImage imageFromQImage:pixmapCursor.toImage()];
120 nativeCursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSZeroPoint];
136 nullptr, kCGEventMouseMoved,
QCursor::pos().toCGPoint(),
139 CGEventPost(kCGHIDEventTap, moveEvent);
142- (NSDragOperation)draggingEntered:(
id<NSDraggingInfo>)sender
144 return [
self handleDrag:(QEvent::DragEnter) sender:sender];
147- (NSDragOperation)draggingUpdated:(
id<NSDraggingInfo>)sender
150 return [
self handleDrag:(QEvent::DragMove) sender:sender];
154- (NSDragOperation)handleDrag:(
QEvent::
Type)dragType sender:(
id<NSDraggingInfo>)sender
156 if (!m_platformWindow)
157 return NSDragOperationNone;
159 QPoint windowPoint = QPointF::fromCGPoint([self convertPoint:sender.draggingLocation fromView:nil]).toPoint();
163 QWindow *
target = findEventTargetWindow(m_platformWindow->window());
165 return NSDragOperationNone;
167 const auto modifiers = QAppleKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
169 const auto point = mapWindowCoordinates(m_platformWindow->window(),
target, windowPoint);
172 qCDebug(lcQpaMouse) << dragType <<
self <<
"at" << windowPoint;
174 qCDebug(lcQpaMouse) << dragType <<
"at" << windowPoint <<
"with" << buttons;
182 [
self updateCursorFromDragResponse:response drag:nativeDrag];
192- (
void)draggingExited:(
id<NSDraggingInfo>)sender
194 if (!m_platformWindow)
197 QWindow *
target = findEventTargetWindow(m_platformWindow->window());
205 QPoint windowPoint = QPointF::fromCGPoint([self convertPoint:sender.draggingLocation fromView:nil]).toPoint();
210 QWindowSystemInterface::handleDrag(
target,
nullptr,
211 mapWindowCoordinates(m_platformWindow->window(),
target, windowPoint),
216- (BOOL)performDragOperation:(
id<NSDraggingInfo>)sender
218 if (!m_platformWindow)
221 QWindow *
target = findEventTargetWindow(m_platformWindow->window());
225 QPoint windowPoint = QPointF::fromCGPoint([self convertPoint:sender.draggingLocation fromView:nil]).toPoint();
231 const auto modifiers = QAppleKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
233 const auto point = mapWindowCoordinates(m_platformWindow->window(),
target, windowPoint);
250- (
void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation
258 if (!m_platformWindow)
261 QWindow *
target = findEventTargetWindow(m_platformWindow->window());
276 const auto modifiers = QAppleKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
278 NSPoint windowPoint = [
self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin;
279 NSPoint nsViewPoint = [
self convertPoint: windowPoint fromView: nil];
281 QPoint qtWindowPoint(nsViewPoint.x, nsViewPoint.y);
286 mapWindowCoordinates(m_platformWindow->window(),
target, qtWindowPoint),
293 qCDebug(lcQpaMouse) <<
"Drag session" << session <<
"ended, with" <<
m_buttons;
void setAcceptedAction(Qt::DropAction act)
QMimeData * dragMimeData()
static QCocoaIntegration * instance()
QCocoaDrag * drag() const override
static QPointF mapFromNative(CGPoint pos, QCocoaScreen *screen=QCocoaScreen::primaryScreen())
static QPoint pos()
Returns the position of the cursor (hot spot) of the primary screen in global screen coordinates.
QPixmap dragCursor(Qt::DropAction action) const
Returns the drag cursor for the action.
Qt::DropActions supportedActions() const
Returns the set of possible drop actions for this drag operation.
static constexpr QOperatingSystemVersionBase MacOSMojave
\variable QOperatingSystemVersion::MacOSMojave
static QOperatingSystemVersion current()
[0]
Returns a copy of the pixmap that is transformed using the given transformation transform and transfo...
bool isNull() const
Returns true if this is a null pixmap; otherwise returns false.
constexpr QPoint toPoint() const
Rounds the coordinates of this point to the nearest integer, and returns a QPoint object with the rou...
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
static bool handleMouseEvent(QWindow *window, const QPointF &local, const QPointF &global, Qt::MouseButtons state, Qt::MouseButton button, QEvent::Type type, Qt::KeyboardModifiers mods=Qt::NoModifier, Qt::MouseEventSource source=Qt::MouseEventNotSynthesized)
Qt::WindowFlags flags
the window flags of the window
EGLImageKHR int int EGLuint64KHR * modifiers
const QStringList & enabledDraggedTypes()
@ WindowTransparentForInput
Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions)
NSDragOperation qt_mac_mapDropActions(Qt::DropActions actions)
Qt::DropAction qt_mac_mapNSDragOperation(NSDragOperation nsActions)
NSDragOperation qt_mac_mapDropAction(Qt::DropAction action)
Qt::MouseButtons currentlyPressedMouseButtons()
Returns the Qt::MouseButtons that corresponds to an NSEvent.pressedMouseButtons.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qCDebug(category,...)
Qt::MouseButtons m_buttons
NSDraggingContext m_lastSeenContext
GLsizei GLsizei GLchar * source