From d3d96826aca44af2e223439a173051dec4875141 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Mon, 17 Sep 2012 16:27:06 +0200 Subject: [PATCH] pay attention to not emit 2 signals per event --- .../qtextracomponents/mouseeventlistener.cpp | 21 ++++++++++++++++++- .../qtextracomponents/mouseeventlistener.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/declarativeimports/qtextracomponents/mouseeventlistener.cpp b/declarativeimports/qtextracomponents/mouseeventlistener.cpp index 5e2149712..81de47413 100644 --- a/declarativeimports/qtextracomponents/mouseeventlistener.cpp +++ b/declarativeimports/qtextracomponents/mouseeventlistener.cpp @@ -28,7 +28,8 @@ MouseEventListener::MouseEventListener(QDeclarativeItem *parent) : QDeclarativeItem(parent), m_pressed(false), - m_pressAndHoldEvent(0) + m_pressAndHoldEvent(0), + m_lastEvent(0) { qmlRegisterType(); qmlRegisterType(); @@ -43,6 +44,10 @@ MouseEventListener::~MouseEventListener() void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me) { + if (m_lastEvent == me) { + return; + } + //FIXME: when a popup window is visible: a click anywhere hides it: but the old qgraphicswidget will continue to think it's under the mouse //doesn't seem to be any good way to properly reset this. //this msolution will still caused a missed click after the popup is gone, but gets the situation unblocked. @@ -63,12 +68,20 @@ void MouseEventListener::mousePressEvent(QGraphicsSceneMouseEvent *me) void MouseEventListener::mouseMoveEvent(QGraphicsSceneMouseEvent *me) { + if (m_lastEvent == me) { + return; + } + KDeclarativeMouseEvent dme(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers()); emit positionChanged(&dme); } void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me) { + if (m_lastEvent == me) { + return; + } + KDeclarativeMouseEvent dme(me->pos().x(), me->pos().y(), me->screenPos().x(), me->screenPos().y(), me->button(), me->buttons(), me->modifiers()); m_pressed = false; emit released(&dme); @@ -76,6 +89,10 @@ void MouseEventListener::mouseReleaseEvent(QGraphicsSceneMouseEvent *me) void MouseEventListener::wheelEvent(QGraphicsSceneWheelEvent *we) { + if (m_lastEvent == we) { + return; + } + KDeclarativeWheelEvent dwe(we->pos(), we->screenPos(), we->delta(), we->buttons(), we->modifiers(), we->orientation()); emit wheelMoved(&dwe); } @@ -98,6 +115,8 @@ bool MouseEventListener::sceneEventFilter(QGraphicsItem *item, QEvent *event) return false; } + m_lastEvent = event; + switch (event->type()) { case QEvent::GraphicsSceneMousePress: { QGraphicsSceneMouseEvent *me = static_cast(event); diff --git a/declarativeimports/qtextracomponents/mouseeventlistener.h b/declarativeimports/qtextracomponents/mouseeventlistener.h index 8dc17eb83..9f1ee513f 100644 --- a/declarativeimports/qtextracomponents/mouseeventlistener.h +++ b/declarativeimports/qtextracomponents/mouseeventlistener.h @@ -148,6 +148,8 @@ private: bool m_pressed; KDeclarativeMouseEvent* m_pressAndHoldEvent; QPointF m_pressAndHoldPosition; + //Important: used only for comparison. If you will ever need to access this pointer, make it a QWekapointer + QEvent *m_lastEvent; }; #endif