summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa.cpp67
-rw-r--r--src/widgets/kernel/qwidgetwindow_qpa_p.h2
2 files changed, 69 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
diff --git a/src/widgets/kernel/qwidgetwindow_qpa_p.h b/src/widgets/kernel/qwidgetwindow_qpa_p.h
index 9eb1e4f60e..e32a6ed001 100644
--- a/src/widgets/kernel/qwidgetwindow_qpa_p.h
+++ b/src/widgets/kernel/qwidgetwindow_qpa_p.h
@@ -70,10 +70,12 @@ protected:
void handleMoveEvent(QMoveEvent *);
void handleResizeEvent(QResizeEvent *);
void handleWheelEvent(QWheelEvent *);
+ void handleDragEvent(QEvent *);
private:
QWidget *m_widget;
QWeakPointer<QWidget> m_implicit_mouse_grabber;
+ QWeakPointer<QWidget> m_dragTarget;
};
QT_END_NAMESPACE