summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-05-02 09:20:48 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-05-02 10:13:17 +0300
commita5499c546bffba0a53fd36458e08c1ad5bd8b384 (patch)
tree19c4c3979754d39a1930d6b8a488831e27fd771d /plugins
parent232715f311f87d970af3224150a8687907c72071 (diff)
Fix mouse events for QtQuick2
Change-Id: Ibb6b80765c6433a47670046ca72e156c697b1f97 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/declarative/declarativechart.cpp82
-rw-r--r--plugins/declarative/declarativechart.h10
2 files changed, 91 insertions, 1 deletions
diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp
index 59109791..9d3fcd0e 100644
--- a/plugins/declarative/declarativechart.cpp
+++ b/plugins/declarative/declarativechart.cpp
@@ -41,6 +41,12 @@
#include "qdatetimeaxis.h"
#endif
+#ifdef CHARTS_FOR_QUICK2
+#include <QGraphicsSceneMouseEvent>
+#include <QGraphicsSceneHoverEvent>
+#include <QApplication>
+#endif
+
QTCOMMERCIALCHART_BEGIN_NAMESPACE
/*!
@@ -261,6 +267,9 @@ void DeclarativeChart::initChart(QChart::ChartType type)
setAntialiasing(QQuickItem::antialiasing());
connect(m_scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(update()));
connect(this, SIGNAL(antialiasingChanged(bool)), this, SLOT(handleAntialiasingChanged(bool)));
+
+ setAcceptedMouseButtons(Qt::AllButtons);
+ setAcceptHoverEvents(true);
#else
if (type == QChart::ChartTypePolar)
m_chart = new QPolarChart(this);
@@ -386,7 +395,6 @@ void DeclarativeChart::handleAxisYRightSet(QAbstractAxis *axis)
void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
{
-// qDebug() << "DeclarativeChart::geometryChanged" << newGeometry.width() << newGeometry.height();
if (newGeometry.isValid()) {
if (newGeometry.width() > 0 && newGeometry.height() > 0) {
m_chart->resize(newGeometry.width(), newGeometry.height());
@@ -407,6 +415,78 @@ void DeclarativeChart::paint(QPainter *painter)
m_scene->render(painter, renderRect, renderRect);
}
+void DeclarativeChart::mousePressEvent(QMouseEvent *event)
+{
+ m_mousePressScenePoint = event->pos();
+ m_mousePressScreenPoint = event->globalPos();
+ m_lastMouseMoveScenePoint = m_mousePressScenePoint;
+ m_lastMouseMoveScreenPoint = m_mousePressScreenPoint;
+ m_mousePressButton = event->button();
+ m_mousePressButtons = event->buttons();
+
+ QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMousePress);
+ mouseEvent.setWidget(0);
+ mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint);
+ mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint);
+ mouseEvent.setScenePos(m_mousePressScenePoint);
+ mouseEvent.setScreenPos(m_mousePressScreenPoint);
+ mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint);
+ mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint);
+ mouseEvent.setButtons(m_mousePressButtons);
+ mouseEvent.setButton(m_mousePressButton);
+ mouseEvent.setModifiers(event->modifiers());
+ mouseEvent.setAccepted(false);
+
+ QApplication::sendEvent(m_scene, &mouseEvent);
+}
+
+void DeclarativeChart::mouseReleaseEvent(QMouseEvent *event)
+{
+ QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseRelease);
+ mouseEvent.setWidget(0);
+ mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint);
+ mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint);
+ mouseEvent.setScenePos(event->pos());
+ mouseEvent.setScreenPos(event->globalPos());
+ mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint);
+ mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint);
+ mouseEvent.setButtons(event->buttons());
+ mouseEvent.setButton(event->button());
+ mouseEvent.setModifiers(event->modifiers());
+ mouseEvent.setAccepted(false);
+
+ QApplication::sendEvent(m_scene, &mouseEvent);
+
+ m_mousePressButtons = event->buttons();
+ m_mousePressButton = Qt::NoButton;
+}
+
+void DeclarativeChart::hoverMoveEvent(QHoverEvent *event)
+{
+ // Convert hover move to mouse move, since we don't seem to get actual mouse move events.
+ // QGraphicsScene generates hover events from mouse move events, so we don't need
+ // to pass hover events there.
+ QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove);
+ mouseEvent.setWidget(0);
+ mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint);
+ mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint);
+ mouseEvent.setScenePos(event->pos());
+ // Hover events do not have global pos in them, and the screen position doesn't seem to
+ // matter anyway in this use case, so just pass event pos instead of trying to
+ // calculate the real screen position.
+ mouseEvent.setScreenPos(event->pos());
+ mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint);
+ mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint);
+ mouseEvent.setButtons(m_mousePressButtons);
+ mouseEvent.setButton(m_mousePressButton);
+ mouseEvent.setModifiers(event->modifiers());
+ m_lastMouseMoveScenePoint = mouseEvent.scenePos();
+ m_lastMouseMoveScreenPoint = mouseEvent.screenPos();
+ mouseEvent.setAccepted(false);
+
+ QApplication::sendEvent(m_scene, &mouseEvent);
+}
+
void DeclarativeChart::handleAntialiasingChanged(bool enable)
{
setAntialiasing(enable);
diff --git a/plugins/declarative/declarativechart.h b/plugins/declarative/declarativechart.h
index c02434e4..9fa45546 100644
--- a/plugins/declarative/declarativechart.h
+++ b/plugins/declarative/declarativechart.h
@@ -111,6 +111,10 @@ public: // From parent classes
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
#ifdef CHARTS_FOR_QUICK2
void paint(QPainter *painter);
+protected:
+ void mousePressEvent(QMouseEvent *event);
+ void mouseReleaseEvent(QMouseEvent *event);
+ void hoverMoveEvent(QHoverEvent *event);
private Q_SLOTS:
void handleAntialiasingChanged(bool enable);
#endif
@@ -198,6 +202,12 @@ private:
QChart *m_chart;
#ifdef CHARTS_FOR_QUICK2
QGraphicsScene *m_scene;
+ QPointF m_mousePressScenePoint;
+ QPoint m_mousePressScreenPoint;
+ QPointF m_lastMouseMoveScenePoint;
+ QPoint m_lastMouseMoveScreenPoint;
+ Qt::MouseButton m_mousePressButton;
+ Qt::MouseButtons m_mousePressButtons;
#endif
DeclarativeMargins *m_margins;
};