Add drag and drop events to QWindowSystemInterface.
For non-desktop platforms these are better suited and are more QPA style than relying purely on QDragManager/QSimpleDrag/sending drag events directly to the windows. Change-Id: Id466830cf83427b3d86925602086a858e8f713e5 Reviewed-on: http://codereview.qt.nokia.com/2084 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>bb10
parent
ec984bdd3e
commit
43f2246995
|
|
@ -62,6 +62,7 @@
|
|||
#include "private/qwindow_p.h"
|
||||
#include "private/qkeymapper_p.h"
|
||||
#include "private/qcursor_p.h"
|
||||
#include "private/qdnd_p.h"
|
||||
#ifndef QT_NO_CURSOR
|
||||
#include "qplatformcursor_qpa.h"
|
||||
#endif
|
||||
|
|
@ -755,6 +756,51 @@ void QGuiApplicationPrivate::processExposeEvent(QWindowSystemInterfacePrivate::E
|
|||
QCoreApplication::sendSpontaneousEvent(e->exposed.data(), &event);
|
||||
}
|
||||
|
||||
Qt::DropAction QGuiApplicationPrivate::processDrag(QWindow *w, QMimeData *dropData, const QPoint &p)
|
||||
{
|
||||
static QPointer<QWindow> currentDragWindow;
|
||||
QDragManager *manager = QDragManager::self();
|
||||
if (!dropData) {
|
||||
if (currentDragWindow.data() == w)
|
||||
currentDragWindow = 0;
|
||||
QDragLeaveEvent e;
|
||||
QGuiApplication::sendEvent(w, &e);
|
||||
manager->global_accepted_action = Qt::IgnoreAction;
|
||||
return Qt::IgnoreAction;
|
||||
}
|
||||
QDragMoveEvent me(p, manager->possible_actions, dropData,
|
||||
QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
|
||||
if (w != currentDragWindow) {
|
||||
if (currentDragWindow) {
|
||||
QDragLeaveEvent e;
|
||||
QGuiApplication::sendEvent(currentDragWindow, &e);
|
||||
manager->global_accepted_action = Qt::IgnoreAction;
|
||||
}
|
||||
currentDragWindow = w;
|
||||
QDragEnterEvent e(p, manager->possible_actions, dropData,
|
||||
QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
|
||||
QGuiApplication::sendEvent(w, &e);
|
||||
manager->global_accepted_action = e.isAccepted() ? e.dropAction() : Qt::IgnoreAction;
|
||||
if (manager->global_accepted_action != Qt::IgnoreAction) {
|
||||
me.setDropAction(manager->global_accepted_action);
|
||||
me.accept();
|
||||
}
|
||||
}
|
||||
QGuiApplication::sendEvent(w, &me);
|
||||
manager->global_accepted_action = me.isAccepted() ? me.dropAction() : Qt::IgnoreAction;
|
||||
return manager->global_accepted_action;
|
||||
}
|
||||
|
||||
Qt::DropAction QGuiApplicationPrivate::processDrop(QWindow *w, QMimeData *dropData, const QPoint &p)
|
||||
{
|
||||
QDragManager *manager = QDragManager::self();
|
||||
QDropEvent de(p, manager->possible_actions, dropData,
|
||||
QGuiApplication::mouseButtons(), QGuiApplication::keyboardModifiers());
|
||||
QGuiApplication::sendEvent(w, &de);
|
||||
manager->global_accepted_action = de.isAccepted() ? de.dropAction() : Qt::IgnoreAction;
|
||||
return manager->global_accepted_action;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
QClipboard * QGuiApplication::clipboard()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -125,6 +125,9 @@ public:
|
|||
|
||||
static void processExposeEvent(QWindowSystemInterfacePrivate::ExposeEvent *e);
|
||||
|
||||
static Qt::DropAction processDrag(QWindow *w, QMimeData *dropData, const QPoint &p);
|
||||
static Qt::DropAction processDrop(QWindow *w, QMimeData *dropData, const QPoint &p);
|
||||
|
||||
static inline Qt::Alignment visualAlignment(Qt::LayoutDirection direction, Qt::Alignment alignment)
|
||||
{
|
||||
if (!(alignment & Qt::AlignHorizontal_Mask))
|
||||
|
|
|
|||
|
|
@ -308,4 +308,14 @@ int QWindowSystemInterface::windowSystemEventsQueued()
|
|||
return QWindowSystemInterfacePrivate::windowSystemEventsQueued();
|
||||
}
|
||||
|
||||
Qt::DropAction QWindowSystemInterface::handleDrag(QWindow *w, QMimeData *dropData, const QPoint &p)
|
||||
{
|
||||
return QGuiApplicationPrivate::processDrag(w, dropData, p);
|
||||
}
|
||||
|
||||
Qt::DropAction QWindowSystemInterface::handleDrop(QWindow *w, QMimeData *dropData, const QPoint &p)
|
||||
{
|
||||
return QGuiApplicationPrivate::processDrop(w, dropData, p);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ QT_BEGIN_HEADER
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
class QMimeData;
|
||||
|
||||
QT_MODULE(Gui)
|
||||
|
||||
class Q_GUI_EXPORT QWindowSystemInterface
|
||||
|
|
@ -103,6 +105,10 @@ public:
|
|||
|
||||
static void handleExposeEvent(QWindow *w, const QRegion ®ion);
|
||||
|
||||
// Drag and drop. These events are sent immediately.
|
||||
static Qt::DropAction handleDrag(QWindow *w, QMimeData *dropData, const QPoint &p);
|
||||
static Qt::DropAction handleDrop(QWindow *w, QMimeData *dropData, const QPoint &p);
|
||||
|
||||
// Changes to the screen
|
||||
static void handleScreenGeometryChange(int screenIndex);
|
||||
static void handleScreenAvailableGeometryChange(int screenIndex);
|
||||
|
|
|
|||
Loading…
Reference in New Issue