diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2012-08-29 16:06:05 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-31 16:10:25 +0200 |
commit | 1e34d3525f175340f03bad83600306c23703a92b (patch) | |
tree | 40bb433d6cabc6c37d1248e9547b1db822333364 /src/widgets/kernel | |
parent | 9aa67cf0c48ff8e9e73fc19c4dcd950961b5ad54 (diff) |
Fix updating of drag icons.
Try to find a target widget that accepts drops; ignore the event
if none can be found. Split the handleDrag*() functions
to reduce indentation.
Add an autotest.
Task-number: QTBUG-22987
Change-Id: I516ac5f0c002caaf83c52ac16f821246e565230f
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 115 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa_p.h | 4 |
2 files changed, 66 insertions, 53 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 66313424a0..81a341c78c 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -165,10 +165,14 @@ bool QWidgetWindow::event(QEvent *event) #ifndef QT_NO_DRAGANDDROP case QEvent::DragEnter: - case QEvent::DragLeave: case QEvent::DragMove: + handleDragEnterMoveEvent(static_cast<QDragMoveEvent *>(event)); + return true; + case QEvent::DragLeave: + handleDragLeaveEvent(static_cast<QDragLeaveEvent *>(event)); + return true; case QEvent::Drop: - handleDragEvent(event); + handleDropEvent(static_cast<QDropEvent *>(event)); return true; #endif @@ -426,62 +430,69 @@ void QWidgetWindow::handleWheelEvent(QWheelEvent *event) #ifndef QT_NO_DRAGANDDROP -void QWidgetWindow::handleDragEvent(QEvent *event) +void QWidgetWindow::handleDragEnterMoveEvent(QDragMoveEvent *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()); + Q_ASSERT(event->type() ==QEvent::DragMove || !m_dragTarget); + // Find a target widget under mouse that accepts drops (QTBUG-22987). + QWidget *widget = m_widget->childAt(event->pos()); + if (!widget) + widget = m_widget; + for ( ; widget && widget != m_widget && !widget->acceptDrops(); widget = widget->parentWidget()) ; + if (widget && !widget->acceptDrops()) + widget = 0; + // Target widget unchanged: DragMove + if (widget && widget == m_dragTarget.data()) { + Q_ASSERT(event->type() == QEvent::DragMove); + const QPoint mapped = widget->mapFrom(m_widget, event->pos()); + QDragMoveEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); + translated.setDropAction(event->dropAction()); + QGuiApplication::sendSpontaneousEvent(widget, &translated); + if (translated.isAccepted()) { + event->accept(); } 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()); + event->ignore(); } - break; + event->setDropAction(translated.dropAction()); + return; } - 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; + // Target widget changed: Send DragLeave to previous, DragEnter to new if there is any + if (m_dragTarget.data()) { + QDragLeaveEvent le; + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), &le); + m_dragTarget = 0; } - default: - break; + if (!widget) { + event->ignore(); + return; + } + m_dragTarget = widget; + const QPoint mapped = widget->mapFrom(m_widget, event->pos()); + QDragEnterEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); + QGuiApplication::sendSpontaneousEvent(widget, &translated); + if (translated.isAccepted()) { + event->accept(); + } else { + event->ignore(); } + event->setDropAction(translated.dropAction()); +} + +void QWidgetWindow::handleDragLeaveEvent(QDragLeaveEvent *event) +{ + if (m_dragTarget) + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), event); + m_dragTarget = 0; +} + +void QWidgetWindow::handleDropEvent(QDropEvent *event) +{ + const QPoint mapped = m_dragTarget.data()->mapFrom(m_widget, event->pos()); + QDropEvent translated(mapped, event->possibleActions(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers()); + QGuiApplication::sendSpontaneousEvent(m_dragTarget.data(), &translated); + if (translated.isAccepted()) + event->accept(); + event->setDropAction(translated.dropAction()); + m_dragTarget = 0; } #endif // QT_NO_DRAGANDDROP diff --git a/src/widgets/kernel/qwidgetwindow_qpa_p.h b/src/widgets/kernel/qwidgetwindow_qpa_p.h index 5750a05d40..f9cd539dbc 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa_p.h +++ b/src/widgets/kernel/qwidgetwindow_qpa_p.h @@ -80,7 +80,9 @@ protected: void handleResizeEvent(QResizeEvent *); void handleWheelEvent(QWheelEvent *); #ifndef QT_NO_DRAGANDDROP - void handleDragEvent(QEvent *); + void handleDragEnterMoveEvent(QDragMoveEvent *); + void handleDragLeaveEvent(QDragLeaveEvent *); + void handleDropEvent(QDropEvent *); #endif void handleExposeEvent(QExposeEvent *); void handleWindowStateChangedEvent(QWindowStateChangeEvent *event); |