diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2011-05-22 14:01:33 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@nokia.com> | 2011-05-22 14:01:33 +0200 |
commit | 610769ca8a18247f4c2a9e50a491ecbaa35cf2b8 (patch) | |
tree | 192006474fb5f749a440d51a67931d01fca8f136 | |
parent | fd7bfc618430bbd5e9d4118d264179c22abf3f4a (diff) |
implement dragging between top levels
Correctly make use of the topLevelAt()
functionality to determine which
QWindow should get the drag events.
-rw-r--r-- | src/gui/kernel/qdnd_qpa.cpp | 51 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa.cpp | 2 |
2 files changed, 23 insertions, 30 deletions
diff --git a/src/gui/kernel/qdnd_qpa.cpp b/src/gui/kernel/qdnd_qpa.cpp index 88a98caeaf..5818a16fd5 100644 --- a/src/gui/kernel/qdnd_qpa.cpp +++ b/src/gui/kernel/qdnd_qpa.cpp @@ -50,6 +50,7 @@ #include "qpainter.h" #include "qdnd_p.h" #include "qwindow.h" +#include <qdebug.h> QT_BEGIN_NAMESPACE @@ -193,8 +194,7 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e) } - QWindow *window = qobject_cast<QWindow *>(o); - if (!window) + if (!qobject_cast<QWindow *>(o)) return false; switch(e->type()) { @@ -218,30 +218,23 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e) return true; // Eat all key events } - case QEvent::Enter: - { - // don't do anything here, it's the first move event inside the window that - // will be used - break; - } - case QEvent::Leave: - { - currentWindow = 0; - QDragLeaveEvent dle; - QCoreApplication::sendEvent(o, &dle); - break; - } case QEvent::MouseButtonPress: case QEvent::MouseMove: { + QMouseEvent *me = (QMouseEvent *)e; + QWindow *window = QGuiApplication::topLevelAt(me->globalPos()); + QPoint pos; + if (window) + pos = me->globalPos() - window->geometry().topLeft(); + qDebug() << window << o; + QMimeData *dropData = object ? dragPrivate()->data : this->dropData; if (object) possible_actions = dragPrivate()->possible_actions; else possible_actions = Qt::IgnoreAction; - QMouseEvent *me = (QMouseEvent *)e; if (me->buttons()) { Qt::DropAction prevAction = global_accepted_action; @@ -251,19 +244,19 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e) QCoreApplication::sendEvent(currentWindow, &dle); willDrop = false; global_accepted_action = Qt::IgnoreAction; - updateCursor(); - restoreCursor = true; } currentWindow = window; - QDragEnterEvent dee(me->pos(), possible_actions, dropData, me->buttons(), me->modifiers()); - QCoreApplication::sendEvent(currentWindow, &dee); - willDrop = dee.isAccepted() && dee.dropAction() != Qt::IgnoreAction; - global_accepted_action = willDrop ? dee.dropAction() : Qt::IgnoreAction; + if (currentWindow) { + QDragEnterEvent dee(pos, possible_actions, dropData, me->buttons(), me->modifiers()); + QCoreApplication::sendEvent(currentWindow, &dee); + willDrop = dee.isAccepted() && dee.dropAction() != Qt::IgnoreAction; + global_accepted_action = willDrop ? dee.dropAction() : Qt::IgnoreAction; + } updateCursor(); restoreCursor = true; - } else { + } else if (window) { Q_ASSERT(currentWindow); - QDragMoveEvent dme(me->pos(), possible_actions, dropData, me->buttons(), me->modifiers()); + QDragMoveEvent dme(pos, possible_actions, dropData, me->buttons(), me->modifiers()); if (global_accepted_action != Qt::IgnoreAction) { dme.setDropAction(global_accepted_action); dme.accept(); @@ -290,13 +283,15 @@ bool QDragManager::eventFilter(QObject *o, QEvent *e) #endif restoreCursor = false; } - if (currentWindow) { - QMouseEvent *me = (QMouseEvent *)e; + QMouseEvent *me = (QMouseEvent *)e; + QWindow *window = QGuiApplication::topLevelAt(me->globalPos()); + if (window) { + QPoint pos = me->globalPos() - window->geometry().topLeft(); QMimeData *dropData = object ? dragPrivate()->data : this->dropData; - QDropEvent de(me->pos(), possible_actions, dropData, me->buttons(), me->modifiers()); - QCoreApplication::sendEvent(currentWindow, &de); + QDropEvent de(pos, possible_actions, dropData, me->buttons(), me->modifiers()); + QCoreApplication::sendEvent(window, &de); if (de.isAccepted()) global_accepted_action = de.dropAction(); else diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index 6b890fb941..4bee0f2523 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -44,8 +44,6 @@ #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 |