summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-08-29 16:06:05 +0200
committerQt by Nokia <qt-info@nokia.com>2012-08-31 16:10:25 +0200
commit1e34d3525f175340f03bad83600306c23703a92b (patch)
tree40bb433d6cabc6c37d1248e9547b1db822333364 /src/widgets/kernel
parent9aa67cf0c48ff8e9e73fc19c4dcd950961b5ad54 (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.cpp115
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa_p.h4
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);