void GraphicalModelViewDragController::CancelDrag(const QPoint& pos) { // As there is no public API for cancelling a drag-and-drop operation, which needs to // happen as we want pick up the actual graphics object now, we need to simulate an event // that would cause the drag-and-drop operation to stop. // On Windows, this is a Escape key press and release, and needs to be a Windows event // as Qt lets Windows handle the drag-and-drop. // On Linux, it is simply sending in a mouse release event using Qt mechanisms #if defined(Q_OS_WIN) // As Windows has some shortcuts involving the Escape key (e.g. Ctrl+Escape opening the start menu), // we'll have to fake releasing any pressed modifier keys, and pressing them again after hitting Escape std::vector modifierKeys; modifierKeys.push_back(VK_SHIFT); modifierKeys.push_back(VK_CONTROL); modifierKeys.push_back(VK_MENU); INPUT releaseModifiers[3]; INPUT pressModifiers[3]; memset(releaseModifiers, 0, sizeof(releaseModifiers)); memset(pressModifiers, 0, sizeof(pressModifiers)); int modifiersPressedCount = 0; for (std::vector::const_iterator it = modifierKeys.begin(); it != modifierKeys.end(); ++it) { if (GetAsyncKeyState(*it) < 0) { releaseModifiers[modifiersPressedCount].type = INPUT_KEYBOARD; releaseModifiers[modifiersPressedCount].ki.wScan = 0; releaseModifiers[modifiersPressedCount].ki.time = 0; releaseModifiers[modifiersPressedCount].ki.dwExtraInfo = 0; releaseModifiers[modifiersPressedCount].ki.wVk = (*it); releaseModifiers[modifiersPressedCount].ki.dwFlags = KEYEVENTF_KEYUP; pressModifiers[modifiersPressedCount].type = INPUT_KEYBOARD; pressModifiers[modifiersPressedCount].ki.wScan = 0; pressModifiers[modifiersPressedCount].ki.time = 0; pressModifiers[modifiersPressedCount].ki.dwExtraInfo = 0; pressModifiers[modifiersPressedCount].ki.wVk = (*it); pressModifiers[modifiersPressedCount].ki.dwFlags = 0; ++modifiersPressedCount; } } INPUT escapeKey[2]; memset(escapeKey, 0, sizeof(escapeKey)); // Press the "Escape" key escapeKey[0].type = INPUT_KEYBOARD; escapeKey[0].ki.wScan = 0; escapeKey[0].ki.time = 0; escapeKey[0].ki.dwExtraInfo = 0; escapeKey[0].ki.wVk = VK_ESCAPE; escapeKey[0].ki.dwFlags = 0; // Release the "Escape" key escapeKey[1].type = INPUT_KEYBOARD; escapeKey[1].ki.wScan = 0; escapeKey[1].ki.time = 0; escapeKey[1].ki.dwExtraInfo = 0; escapeKey[1].ki.wVk = VK_ESCAPE; escapeKey[1].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(modifiersPressedCount, releaseModifiers, sizeof(INPUT)); SendInput(2, escapeKey, sizeof(INPUT)); SendInput(modifiersPressedCount, pressModifiers, sizeof(INPUT)); #else QMouseEvent mouseReleaseEvent(QEvent::MouseButtonRelease, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QApplication::sendEvent(graphical_model_view, &mouseReleaseEvent); #endif }