diff options
Diffstat (limited to 'src/quick/items/qquickmousearea.cpp')
-rw-r--r-- | src/quick/items/qquickmousearea.cpp | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 609666d32b..6bd83dd808 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -40,10 +40,10 @@ #include "qquickmousearea_p.h" #include "qquickmousearea_p_p.h" #include "qquickwindow.h" -#include "qquickevents_p_p.h" #include "qquickdrag_p.h" #include <private/qqmldata_p.h> +#include <private/qsgadaptationlayer_p.h> #include <QtGui/private/qguiapplication_p.h> #include <QtGui/qevent.h> @@ -55,6 +55,8 @@ QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(qmlVisualTouchDebugging, QML_VISUAL_TOUCH_DEBUGGING) +Q_DECLARE_LOGGING_CATEGORY(DBG_HOVER_TRACE) + QQuickMouseAreaPrivate::QQuickMouseAreaPrivate() : enabled(true), scrollGestureEnabled(true), hovered(false), longPress(false), moved(false), stealMouse(false), doubleClick(false), preventStealing(false), @@ -404,8 +406,7 @@ bool QQuickMouseAreaPrivate::propagateHelper(QQuickMouseEvent *ev, QQuickItem *i /*! \qmlsignal QtQuick::MouseArea::canceled() - This signal is emitted when mouse events have been canceled, either because an event was not accepted, or - because another item stole the mouse event handling. + This signal is emitted when mouse events have been canceled, because another item stole the mouse event handling. This signal is for advanced use: it is useful when there is more than one MouseArea that is handling input, or when there is a MouseArea inside a \l Flickable. In the latter @@ -765,7 +766,8 @@ void QQuickMouseArea::mouseMoveEvent(QMouseEvent *event) } #endif - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress); me.setSource(event->source()); emit mouseXChanged(&me); me.setPosition(d->lastPos); @@ -807,7 +809,8 @@ void QQuickMouseArea::mouseDoubleClickEvent(QMouseEvent *event) Q_D(QQuickMouseArea); if (d->enabled) { d->saveEvent(event); - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true, false); me.setSource(event->source()); me.setAccepted(d->isDoubleClickConnected()); emit this->doubleClicked(&me); @@ -827,7 +830,8 @@ void QQuickMouseArea::hoverEnterEvent(QHoverEvent *event) d->lastPos = event->posF(); d->lastModifiers = event->modifiers(); setHovered(true); - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); emit mouseXChanged(&me); me.setPosition(d->lastPos); emit mouseYChanged(&me); @@ -840,10 +844,11 @@ void QQuickMouseArea::hoverMoveEvent(QHoverEvent *event) Q_D(QQuickMouseArea); if (!d->enabled && !d->pressed) { QQuickItem::hoverMoveEvent(event); - } else { + } else if (d->lastPos != event->posF()) { d->lastPos = event->posF(); d->lastModifiers = event->modifiers(); - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false); emit mouseXChanged(&me); me.setPosition(d->lastPos); emit mouseYChanged(&me); @@ -870,8 +875,9 @@ void QQuickMouseArea::wheelEvent(QWheelEvent *event) return; } - QQuickWheelEvent we(event->posF().x(), event->posF().y(), event->angleDelta(), - event->pixelDelta(), event->buttons(), event->modifiers()); + QQuickWheelEvent &we = d->quickWheelEvent; + we.reset(event->posF().x(), event->posF().y(), event->angleDelta(), event->pixelDelta(), + event->buttons(), event->modifiers(), event->inverted()); we.setAccepted(d->isWheelConnected()); emit wheel(&we); if (!we.isAccepted()) @@ -1004,7 +1010,8 @@ void QQuickMouseArea::timerEvent(QTimerEvent *event) #endif if (d->pressed && dragged == false && d->hovered == true) { d->longPress = true; - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress); me.setSource(Qt::MouseEventSynthesizedByQt); me.setAccepted(d->isPressAndHoldConnected()); emit pressAndHold(&me); @@ -1085,8 +1092,7 @@ void QQuickMouseArea::setHoverEnabled(bool h) \qmlproperty bool QtQuick::MouseArea::containsMouse This property holds whether the mouse is currently inside the mouse area. - \warning This property is not updated if the area moves under the mouse: \e containsMouse will not change. - In addition, if hoverEnabled is false, containsMouse will only be valid + \warning If hoverEnabled is false, containsMouse will only be valid when the mouse is pressed while the mouse cursor is inside the MouseArea. */ bool QQuickMouseArea::hovered() const @@ -1127,6 +1133,7 @@ void QQuickMouseArea::setHovered(bool h) { Q_D(QQuickMouseArea); if (d->hovered != h) { + qCDebug(DBG_HOVER_TRACE) << this << d->hovered << "->" << h; d->hovered = h; emit hoveredChanged(); d->hovered ? emit entered() : emit exited(); @@ -1182,7 +1189,8 @@ bool QQuickMouseArea::setPressed(Qt::MouseButton button, bool p, Qt::MouseEventS Qt::MouseButtons oldPressed = d->pressed; if (wasPressed != p) { - QQuickMouseEvent me(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress); + QQuickMouseEvent &me = d->quickMouseEvent; + me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress); me.setSource(source); if (p) { d->pressed |= button; @@ -1192,6 +1200,11 @@ bool QQuickMouseArea::setPressed(Qt::MouseButton button, bool p, Qt::MouseEventS emit mouseXChanged(&me); me.setPosition(d->lastPos); emit mouseYChanged(&me); + + if (!me.isAccepted()) { + d->pressed = Qt::NoButton; + } + if (!oldPressed) { emit pressedChanged(); emit containsPressChanged(); @@ -1348,8 +1361,8 @@ QSGNode *QQuickMouseArea::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData if (!qmlVisualTouchDebugging()) return 0; - QSGRectangleNode *rectangle = static_cast<QSGRectangleNode *>(oldNode); - if (!rectangle) rectangle = d->sceneGraphContext()->createRectangleNode(); + QSGInternalRectangleNode *rectangle = static_cast<QSGInternalRectangleNode *>(oldNode); + if (!rectangle) rectangle = d->sceneGraphContext()->createInternalRectangleNode(); rectangle->setRect(QRectF(0, 0, width(), height())); rectangle->setColor(QColor(255, 0, 0, 50)); |