diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2011-05-21 18:02:52 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@nokia.com> | 2011-05-22 13:51:00 +0200 |
commit | 121cc4d955fe4aa3b0f9de0d61bf1ff9f6e944ab (patch) | |
tree | 2ca76f62cf0298bfb74bea9d831d59e393bf1540 /src/widgets/kernel/qwidgetwindow_qpa.cpp | |
parent | d671acd5b296b83440db9836a92189c501c87ff3 (diff) |
re-add in-process DnD implementation
Get in-process DnD working again. QDragManager
only cares about QWindow's now, and QWidgetWindow
maps this to DnD events inside the widget hierachy.
Diffstat (limited to 'src/widgets/kernel/qwidgetwindow_qpa.cpp')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index 510614e5e3..6b890fb941 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -44,6 +44,8 @@ #include "private/qwidget_p.h" #include "private/qapplication_p.h" +#include <qdebug.h> + QT_BEGIN_NAMESPACE QWidget *qt_button_down = 0; // widget got last button-down @@ -94,6 +96,12 @@ bool QWidgetWindow::event(QEvent *event) handleWheelEvent(static_cast<QWheelEvent *>(event)); return true; + case QEvent::DragEnter: + case QEvent::DragLeave: + case QEvent::DragMove: + case QEvent::Drop: + handleDragEvent(event); + default: break; } @@ -270,4 +278,63 @@ void QWidgetWindow::handleWheelEvent(QWheelEvent *event) QGuiApplication::sendSpontaneousEvent(widget, &translated); } +void QWidgetWindow::handleDragEvent(QEvent *event) +{ + switch (event->type()) { + case QEvent::DragEnter: + Q_ASSERT(!m_dragTarget); + // fall through + case QEvent::DragMove: + { + QDragMoveEvent *de = static_cast<QDragMoveEvent *>(event); + QWidget *widget = m_widget->childAt(de->pos()); + if (!widget) + widget = m_widget; + + if (widget != m_dragTarget.data()) { + if (m_dragTarget.data()) { + QDragLeaveEvent le; + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), &le); + } + m_dragTarget = widget; + QPoint mapped = widget->mapFrom(m_widget, de->pos()); + QDragEnterEvent translated(mapped, de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + QGuiApplication::sendSpontaneousEvent(widget, &translated); + if (translated.isAccepted()) + event->accept(); + de->setDropAction(translated.dropAction()); + } else { + Q_ASSERT(event->type() == QEvent::DragMove); + QPoint mapped = widget->mapFrom(m_widget, de->pos()); + QDragMoveEvent translated(mapped, de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + translated.setDropAction(de->dropAction()); + QGuiApplication::sendSpontaneousEvent(widget, &translated); + if (translated.isAccepted()) + event->accept(); + de->setDropAction(translated.dropAction()); + } + break; + } + case QEvent::DragLeave: + if (m_dragTarget) + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), event); + m_dragTarget = (QWidget *)0; + break; + case QEvent::Drop: + { + QDropEvent *de = static_cast<QDropEvent *>(event); + QPoint mapped = m_dragTarget.data()->mapFrom(m_widget, de->pos()); + QDropEvent translated(mapped, de->possibleActions(), de->mimeData(), de->mouseButtons(), de->keyboardModifiers()); + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), &translated); + if (translated.isAccepted()) + event->accept(); + de->setDropAction(translated.dropAction()); + m_dragTarget = (QWidget *)0; + } + default: + break; + } +} + + QT_END_NAMESPACE |