diff options
author | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2015-09-16 12:37:04 +0200 |
---|---|---|
committer | Paul Olav Tvete <paul.tvete@theqtcompany.com> | 2015-09-17 12:59:32 +0000 |
commit | dca52a541eaf61269c8e746555380a7aef942b1e (patch) | |
tree | a19d253ad35f0e00ea77afa799fbf0483d96aa10 /examples | |
parent | 69194916afd652d0282b23b0db06059fe30fd2ae (diff) |
New API for drag and drop
Let the compositor implementation keep all the GUI state.
Change-Id: I73a865fa3407340276d6765e10378b8e23a76fe2
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
Diffstat (limited to 'examples')
4 files changed, 87 insertions, 23 deletions
diff --git a/examples/wayland/qwindow-compositor/compositorwindow.cpp b/examples/wayland/qwindow-compositor/compositorwindow.cpp index b08a5b2a5..f59017824 100644 --- a/examples/wayland/qwindow-compositor/compositorwindow.cpp +++ b/examples/wayland/qwindow-compositor/compositorwindow.cpp @@ -52,8 +52,7 @@ CompositorWindow::CompositorWindow() : m_backgroundTexture(0) , m_compositor(0) - , m_moveState(false) - , m_resizeState(false) + , m_grabState(NoGrab) { } @@ -61,6 +60,7 @@ void CompositorWindow::setCompositor(WindowCompositor *comp) { m_compositor = comp; connect(m_compositor, &WindowCompositor::startMove, this, &CompositorWindow::startMove); connect(m_compositor, &WindowCompositor::startResize, this, &CompositorWindow::startResize); + connect(m_compositor, &WindowCompositor::dragStarted, this, &CompositorWindow::startDrag); connect(m_compositor, &WindowCompositor::frameOffset, this, &CompositorWindow::setFrameOffset); } @@ -125,6 +125,8 @@ WindowCompositorView *CompositorWindow::viewAt(const QPointF &point) { WindowCompositorView *ret = 0; Q_FOREACH (WindowCompositorView *view, m_compositor->views()) { + if (view == m_dragIconView) + continue; QPointF topLeft = view->position(); QWaylandSurface *surface = view->surface(); QRectF geo(topLeft, surface->size()); @@ -136,16 +138,23 @@ WindowCompositorView *CompositorWindow::viewAt(const QPointF &point) void CompositorWindow::startMove() { - m_moveState = true; + m_grabState = MoveGrab; } void CompositorWindow::startResize(int edge) { m_initialSize = m_mouseView->surface()->size(); - m_resizeState = true; + m_grabState = ResizeGrab; m_resizeEdge = edge; } +void CompositorWindow::startDrag(WindowCompositorView *dragIcon) +{ + m_grabState = DragGrab; + m_dragIconView = dragIcon; + m_compositor->raise(dragIcon); +} + void CompositorWindow::setFrameOffset(const QPoint &offset) { if (m_mouseView) @@ -161,11 +170,10 @@ void CompositorWindow::mousePressEvent(QMouseEvent *e) if (!m_mouseView) return; - if (m_mouseView && (e->modifiers() == Qt::AltModifier || - e->modifiers() == Qt::MetaModifier)) { - //start move - m_moveState = true; - } + if (e->modifiers() == Qt::AltModifier || e->modifiers() == Qt::MetaModifier) + m_grabState = MoveGrab; //start move + else + m_compositor->raise(m_mouseView); m_initialMousePos = e->localPos(); m_mouseOffset = e->localPos() - m_mouseView->position(); @@ -180,28 +188,45 @@ void CompositorWindow::mouseReleaseEvent(QMouseEvent *e) if (!mouseGrab()) sendMouseEvent(e, m_mouseView); if (e->buttons() == Qt::NoButton) { + if (m_grabState == DragGrab) { + WindowCompositorView *view = viewAt(e->localPos()); + m_compositor->handleDrag(view, e); + } m_mouseView = 0; - m_moveState = false; - m_resizeState = false; + m_grabState = NoGrab; } } void CompositorWindow::mouseMoveEvent(QMouseEvent *e) { - if (mouseGrab()) { - if (m_moveState) { - m_mouseView->setPosition(e->localPos() - m_mouseOffset); - update(); - } else if (m_resizeState) { - QPoint delta = (e->localPos() - m_initialMousePos).toPoint(); - m_compositor->handleResize(m_mouseView, m_initialSize, delta, m_resizeEdge); - } - } else { + switch (m_grabState) { + case NoGrab: { WindowCompositorView *view = m_mouseView ? m_mouseView.data() : viewAt(e->localPos()); sendMouseEvent(e, view); if (!view) setCursor(Qt::ArrowCursor); } + break; + case MoveGrab: { + m_mouseView->setPosition(e->localPos() - m_mouseOffset); + update(); + } + break; + case ResizeGrab: { + QPoint delta = (e->localPos() - m_initialMousePos).toPoint(); + m_compositor->handleResize(m_mouseView, m_initialSize, delta, m_resizeEdge); + } + break; + case DragGrab: { + WindowCompositorView *view = viewAt(e->localPos()); + m_compositor->handleDrag(view, e); + if (m_dragIconView) { + m_dragIconView->setPosition(e->localPos()); + update(); + } + } + break; + } } void CompositorWindow::sendMouseEvent(QMouseEvent *e, WindowCompositorView *target) diff --git a/examples/wayland/qwindow-compositor/compositorwindow.h b/examples/wayland/qwindow-compositor/compositorwindow.h index 4e6a25f74..720db5bc7 100644 --- a/examples/wayland/qwindow-compositor/compositorwindow.h +++ b/examples/wayland/qwindow-compositor/compositorwindow.h @@ -72,11 +72,14 @@ protected: private slots: void startMove(); void startResize(int edge); + void startDrag(WindowCompositorView *dragIcon); void setFrameOffset(const QPoint &offset); private: + enum GrabState { NoGrab, MoveGrab, ResizeGrab, DragGrab }; + WindowCompositorView *viewAt(const QPointF &point); - bool mouseGrab() const { return m_moveState || m_resizeState; } + bool mouseGrab() const { return m_grabState != NoGrab ;} void drawBackground(); void sendMouseEvent(QMouseEvent *e, WindowCompositorView *target); @@ -85,12 +88,12 @@ private: QOpenGLTexture *m_backgroundTexture; WindowCompositor *m_compositor; QPointer<WindowCompositorView> m_mouseView; - bool m_moveState; - bool m_resizeState; + GrabState m_grabState; QSize m_initialSize; int m_resizeEdge; QPointF m_mouseOffset; QPointF m_initialMousePos; + WindowCompositorView *m_dragIconView; }; QT_END_NAMESPACE diff --git a/examples/wayland/qwindow-compositor/windowcompositor.cpp b/examples/wayland/qwindow-compositor/windowcompositor.cpp index 761c6387d..951aadf07 100644 --- a/examples/wayland/qwindow-compositor/windowcompositor.cpp +++ b/examples/wayland/qwindow-compositor/windowcompositor.cpp @@ -47,6 +47,7 @@ #include <QtWaylandCompositor/QWaylandOutputSpace> #include <QtWaylandCompositor/QWaylandShellSurface> #include <QtWaylandCompositor/qwaylandinput.h> +#include <QtWaylandCompositor/qwaylanddrag.h> #include <QDebug> @@ -87,6 +88,7 @@ void WindowCompositor::create() connect(this, &QWaylandCompositor::surfaceCreated, this, &WindowCompositor::onSurfaceCreated); connect(defaultInputDevice(), &QWaylandInputDevice::cursorSurfaceRequest, this, &WindowCompositor::adjustCursorSurface); + connect(defaultInputDevice()->drag(), &QWaylandDrag::dragStarted, this, &WindowCompositor::startDrag); } void WindowCompositor::onSurfaceCreated(QWaylandSurface *surface) @@ -218,3 +220,32 @@ void WindowCompositor::handleResize(WindowCompositorView *target, const QSize &i QSize newSize = shellSurface->sizeForResize(initialSize, delta, edges); shellSurface->sendConfigure(newSize, edges); } + +void WindowCompositor::startDrag() +{ + QWaylandDrag *currentDrag = defaultInputDevice()->drag(); + Q_ASSERT(currentDrag); + WindowCompositorView *iconView = findView(currentDrag->icon()); + + emit dragStarted(iconView); +} + +void WindowCompositor::handleDrag(WindowCompositorView *target, QMouseEvent *me) +{ + QPointF pos = me->localPos(); + QWaylandSurface *surface = 0; + if (target) { + pos -= target->position(); + surface = target->surface(); + } + QWaylandDrag *currentDrag = defaultInputDevice()->drag(); + currentDrag->dragMove(surface, pos); + if (me->buttons() == Qt::NoButton) + currentDrag->drop(); +} + +void WindowCompositor::raise(WindowCompositorView *view) +{ + m_views.removeOne(view); + m_views.append(view); +} diff --git a/examples/wayland/qwindow-compositor/windowcompositor.h b/examples/wayland/qwindow-compositor/windowcompositor.h index 55d964cab..1b5329d89 100644 --- a/examples/wayland/qwindow-compositor/windowcompositor.h +++ b/examples/wayland/qwindow-compositor/windowcompositor.h @@ -81,9 +81,11 @@ public: void endRender(); QList<WindowCompositorView*> views() const { return m_views; } + void raise(WindowCompositorView *view); void handleMouseEvent(QWaylandView *target, QMouseEvent *me); void handleResize(WindowCompositorView *target, const QSize &initialSize, const QPoint &delta, int edge); + void handleDrag(WindowCompositorView *target, QMouseEvent *me); protected: void adjustCursorSurface(QWaylandSurface *surface, int hotspotX, int hotspotY); @@ -91,6 +93,7 @@ protected: signals: void startMove(); void startResize(int edge); + void dragStarted(WindowCompositorView *dragIcon); void frameOffset(const QPoint &offset); private slots: @@ -100,6 +103,8 @@ private slots: void viewSurfaceDestroyed(); void onStartResize(QWaylandInputDevice *inputDevice, QWaylandShellSurface::ResizeEdge edges); + void startDrag(); + void triggerRender(); void onSurfaceCreated(QWaylandSurface *surface); |