summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-09-16 12:37:04 +0200
committerPaul Olav Tvete <paul.tvete@theqtcompany.com>2015-09-17 12:59:32 +0000
commitdca52a541eaf61269c8e746555380a7aef942b1e (patch)
treea19d253ad35f0e00ea77afa799fbf0483d96aa10 /examples
parent69194916afd652d0282b23b0db06059fe30fd2ae (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')
-rw-r--r--examples/wayland/qwindow-compositor/compositorwindow.cpp65
-rw-r--r--examples/wayland/qwindow-compositor/compositorwindow.h9
-rw-r--r--examples/wayland/qwindow-compositor/windowcompositor.cpp31
-rw-r--r--examples/wayland/qwindow-compositor/windowcompositor.h5
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);