void DragAndDropHandler::dragLeave(GdkDragContext* context) { DroppingContext* droppingContext = m_droppingContexts.get(context); if (!droppingContext) return; // During a drop GTK+ will fire a drag-leave signal right before firing // the drag-drop signal. We want the actions for drag-leave to happen after // those for drag-drop, so schedule them to happen asynchronously here. #if 0 //ZRL replace this. GMainLoopSource::scheduleAndDeleteOnDestroy("[WebKit] handleDragLeaveLater", [this, droppingContext]() { auto it = m_droppingContexts.find(droppingContext->gdkContext); if (it == m_droppingContexts.end()) return; // If the view doesn't know about the drag yet (there are still pending data requests), // don't update it with information about the drag. if (droppingContext->pendingDataRequests) return; if (!droppingContext->dropHappened) { // Don't call dragExited if we have just received a drag-drop signal. This // happens in the case of a successful drop onto the view. const IntPoint& position = droppingContext->lastMotionPosition; DragData dragData(droppingContext->dataObject.get(), position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), DragOperationNone); m_page.dragExited(dragData); m_page.resetCurrentDragInformation(); } m_droppingContexts.remove(it); }); #else GMainLoopSource::scheduleAndDeleteOnDestroy("[WebKit] handleDragLeaveLater", std::function<void()>([this, droppingContext]() { auto it = m_droppingContexts.find(droppingContext->gdkContext); if (it == m_droppingContexts.end()) return; // If the view doesn't know about the drag yet (there are still pending data requests), // don't update it with information about the drag. if (droppingContext->pendingDataRequests) return; if (!droppingContext->dropHappened) { // Don't call dragExited if we have just received a drag-drop signal. This // happens in the case of a successful drop onto the view. const IntPoint& position = droppingContext->lastMotionPosition; DragData dragData(droppingContext->dataObject.get(), position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), DragOperationNone); m_page.dragExited(dragData); m_page.resetCurrentDragInformation(); } m_droppingContexts.remove(it); })); #endif }
void DragClientImpl::startDrag(DragImage* dragImage, const IntPoint& dragImageOrigin, const IntPoint& eventPos, Clipboard* clipboard, LocalFrame* frame, bool isLinkDrag) { // Add a ref to the frame just in case a load occurs mid-drag. RefPtr<LocalFrame> frameProtector = frame; WebDragData dragData(clipboard->dataObject()); WebDragOperationsMask dragOperationMask = static_cast<WebDragOperationsMask>(clipboard->sourceOperation()); WebImage image; IntSize offsetSize(eventPos - dragImageOrigin); WebPoint offsetPoint(offsetSize.width(), offsetSize.height()); if (dragImage) { float resolutionScale = dragImage->resolutionScale(); if (m_webView->deviceScaleFactor() != resolutionScale) { ASSERT(resolutionScale > 0); float scale = m_webView->deviceScaleFactor() / resolutionScale; dragImage->scale(scale, scale); } image = dragImage->bitmap(); } m_webView->startDragging(frame, dragData, dragOperationMask, image, offsetPoint); }
void DragEffectBitmapButton::OnMouseLeftDown (wxMouseEvent& event) { if (mEffect == nullptr) { return; } wxString data; wxTextDataObject dragData(data); //unselect any running effect to make sure the notebook change won't effect it wxCommandEvent unselectEffect(EVT_UNSELECTED_EFFECT); wxPostEvent(GetParent(), unselectEffect); int id = mEffect->GetId(); // Change the Choicebook to correct page wxCommandEvent eventEffectChanged(EVT_SELECTED_EFFECT_CHANGED); eventEffectChanged.SetInt(id); // We are only changing choicebook not populating effect panel with settings eventEffectChanged.SetClientData(nullptr); wxPostEvent(GetParent(), eventEffectChanged); #ifdef __linux__ wxIcon dragCursor; dragCursor.CopyFromBitmap(mEffect->GetEffectIcon(16, true)); #else wxCursor dragCursor(mEffect->GetEffectIcon(16, true).ConvertToImage()); #endif wxDropSource dragSource(this,dragCursor,dragCursor,dragCursor ); dragSource.SetData( dragData ); dragSource.DoDragDrop( wxDragMove ); }
void QtWebPageEventHandler::handleDragEnterEvent(QDragEnterEvent* ev) { m_webPageProxy->resetDragOperation(); QTransform fromItemTransform = m_webPage->transformFromItem(); // FIXME: Should not use QCursor::pos() DragData dragData(ev->mimeData(), fromItemTransform.map(ev->pos()), QCursor::pos(), dropActionToDragOperation(ev->possibleActions())); m_webPageProxy->dragEntered(&dragData); ev->acceptProposedAction(); }
void QtWebPageEventHandler::handleDragLeaveEvent(QDragLeaveEvent* ev) { bool accepted = ev->isAccepted(); // FIXME: Should not use QCursor::pos() DragData dragData(0, IntPoint(), QCursor::pos(), DragOperationNone); m_webPageProxy->dragExited(&dragData); m_webPageProxy->resetDragOperation(); ev->setAccepted(accepted); }
void DragAndDropHandler::dragMotion(GdkDragContext* context, const IntPoint& position, unsigned time) { DataObjectGtk* dataObject = requestDragData(context, position, time); if (!dataObject) return; DragData dragData(dataObject, position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); m_page.dragUpdated(dragData); DragOperation operation = m_page.currentDragOperation(); gdk_drag_status(context, dragOperationToSingleGdkDragAction(operation), time); }
void DragAndDropHandler::dragEntered(GdkDragContext* context, GtkSelectionData* selectionData, unsigned info, unsigned time) { IntPoint position; DataObjectGtk* dataObject = dataObjectForDropData(context, selectionData, info, position); if (!dataObject) return; DragData dragData(dataObject, position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); m_page.resetCurrentDragInformation(); m_page.dragEntered(dragData); DragOperation operation = m_page.currentDragOperation(); gdk_drag_status(context, dragOperationToSingleGdkDragAction(operation), time); }
void QtWebPageEventHandler::handleDropEvent(QDropEvent* ev) { bool accepted = ev->isAccepted(); QTransform fromItemTransform = m_webPage->transformFromItem(); // FIXME: Should not use QCursor::pos() DragData dragData(ev->mimeData(), fromItemTransform.map(ev->pos()), QCursor::pos(), dropActionToDragOperation(ev->possibleActions())); SandboxExtension::Handle handle; SandboxExtension::HandleArray sandboxExtensionForUpload; m_webPageProxy->performDrag(&dragData, String(), handle, sandboxExtensionForUpload); ev->setDropAction(dragOperationToDropAction(m_webPageProxy->dragSession().operation)); ev->accept(); ev->setAccepted(accepted); }
void QtWebPageEventHandler::handleDragMoveEvent(QDragMoveEvent* ev) { bool accepted = ev->isAccepted(); QTransform fromItemTransform = m_webPage->transformFromItem(); // FIXME: Should not use QCursor::pos() DragData dragData(ev->mimeData(), fromItemTransform.map(ev->pos()), QCursor::pos(), dropActionToDragOperation(ev->possibleActions())); m_webPageProxy->dragUpdated(&dragData); ev->setDropAction(dragOperationToDropAction(m_webPageProxy->dragSession().operation)); if (m_webPageProxy->dragSession().operation != DragOperationNone) ev->accept(); ev->setAccepted(accepted); }
void WebDragClient::startDrag(DragImageRef dragImage, const IntPoint& clientPosition, const IntPoint& globalPosition, Clipboard* clipboard, Frame*, bool) { QMimeData* clipboardData = clipboard->pasteboard().clipboardData(); DragOperation dragOperationMask = clipboard->sourceOperation(); clipboard->pasteboard().invalidateWritableData(); DragData dragData(clipboardData, clientPosition, globalPosition, dragOperationMask); RefPtr<ShareableBitmap> bitmap = convertQPixmapToShareableBitmap(dragImage); ShareableBitmap::Handle handle; if (bitmap && !bitmap->createHandle(handle)) return; m_page->send(Messages::WebPageProxy::StartDrag(dragData, handle)); }
bool DragAndDropHandler::drop(GdkDragContext* context, const IntPoint& position, unsigned time) { DroppingContext* droppingContext = m_droppingContexts.get(context); if (!droppingContext) return false; droppingContext->dropHappened = true; DragData dragData(droppingContext->selectionData.ptr(), position, convertWidgetPointToScreenPoint(m_page.viewWidget(), position), gdkDragActionToDragOperation(gdk_drag_context_get_actions(context))); SandboxExtension::Handle handle; SandboxExtension::HandleArray sandboxExtensionForUpload; m_page.performDragOperation(dragData, String(), handle, sandboxExtensionForUpload); gtk_drag_finish(context, TRUE, FALSE, time); return true; }
void GtkDragAndDropHelper::handleDragLeaveLater(DroppingContext* context) { auto iterator = m_droppingContexts.find(context->gdkContext); if (iterator == m_droppingContexts.end()) return; // If the view doesn't know about the drag yet (there are still pending data) // requests, don't update it with information about the drag. if (context->pendingDataRequests) return; const IntPoint& position = context->lastMotionPosition; DragData dragData(context->dataObject.get(), position, convertWidgetPointToScreenPoint(m_widget, position), DragOperationNone); context->exitedCallback(m_widget, dragData, context->dropHappened); m_droppingContexts.remove(iterator); }
void ProjectWindow::OnTreeDrag(wxTreeEvent& evt) { if (evt.GetId() == ASSET_LIST) { AssetTreeItemData* data = dynamic_cast<AssetTreeItemData*>(mAssetsTab->assetList->GetItemData(evt.GetItem())); if (data) { const AssetDefinition* asset = data->objPtr; wxString command("Asset->"); command.Append(asset->mAssetType); command.Append("->"); command.Append(asset->mAssetId); wxTextDataObject dragData(command); wxDropSource dragSource(mProjectPanel); dragSource.SetData(dragData); wxDragResult result = dragSource.DoDragDrop(TRUE); return; } } }