summaryrefslogtreecommitdiffstats
path: root/plugins/declarative/declarativechart.cpp
diff options
context:
space:
mode:
authorHeikkinen Miikka <miikka.heikkinen@digia.com>2013-05-13 11:24:30 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-05-13 12:02:31 +0300
commit618c94f2228561f74ca75b2c5bcc17ee5d9a107d (patch)
tree49670713daad9fa1879a36f412170bd40b06f591 /plugins/declarative/declarativechart.cpp
parent54fd83ddb7eda05ebeb31cd9df033f57ab4bd13c (diff)
Fix quick2 support with multithreaded scenegraph rendering.
Change-Id: Ia9bf896e1fb2684e4272547704924e5035f78268 Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'plugins/declarative/declarativechart.cpp')
-rw-r--r--plugins/declarative/declarativechart.cpp46
1 files changed, 43 insertions, 3 deletions
diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp
index 2d2c9528..e692ad43 100644
--- a/plugins/declarative/declarativechart.cpp
+++ b/plugins/declarative/declarativechart.cpp
@@ -45,6 +45,7 @@
#include <QGraphicsSceneMouseEvent>
#include <QGraphicsSceneHoverEvent>
#include <QApplication>
+#include <QTimer>
#endif
QTCOMMERCIALCHART_BEGIN_NAMESPACE
@@ -263,6 +264,8 @@ DeclarativeChart::DeclarativeChart(QChart::ChartType type, QDECLARATIVE_ITEM *pa
void DeclarativeChart::initChart(QChart::ChartType type)
{
#ifdef CHARTS_FOR_QUICK2
+ m_currentSceneImage = 0;
+
if (type == QChart::ChartTypePolar)
m_chart = new QPolarChart();
else
@@ -272,7 +275,7 @@ void DeclarativeChart::initChart(QChart::ChartType type)
m_scene->addItem(m_chart);
setAntialiasing(QQuickItem::antialiasing());
- connect(m_scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(update()));
+ connect(m_scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(sceneChanged(QList<QRectF>)));
connect(this, SIGNAL(antialiasingChanged(bool)), this, SLOT(handleAntialiasingChanged(bool)));
setAcceptedMouseButtons(Qt::AllButtons);
@@ -314,6 +317,12 @@ void DeclarativeChart::changeMinimumMargins(int top, int bottom, int left, int r
DeclarativeChart::~DeclarativeChart()
{
delete m_chart;
+#ifdef CHARTS_FOR_QUICK2
+ m_sceneImageLock.lock();
+ delete m_currentSceneImage;
+ m_currentSceneImage = 0;
+ m_sceneImageLock.unlock();
+#endif
}
void DeclarativeChart::childEvent(QChildEvent *event)
@@ -416,10 +425,41 @@ void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &
}
#ifdef CHARTS_FOR_QUICK2
+void DeclarativeChart::sceneChanged(QList<QRectF> region)
+{
+ Q_UNUSED(region);
+
+ if (!m_updatePending) {
+ m_updatePending = true;
+ // Do async render to avoid some unnecessary renders.
+ QTimer::singleShot(0, this, SLOT(renderScene()));
+ }
+}
+
+void DeclarativeChart::renderScene()
+{
+ m_updatePending = false;
+ m_sceneImageLock.lock();
+ delete m_currentSceneImage;
+ m_currentSceneImage = new QImage(m_chart->size().toSize(), QImage::Format_ARGB32);
+ m_currentSceneImage->fill(Qt::transparent);
+ QPainter painter(m_currentSceneImage);
+ QRect renderRect(QPoint(0, 0), m_chart->size().toSize());
+ m_scene->render(&painter, renderRect, renderRect);
+ m_sceneImageLock.unlock();
+
+ update();
+}
+
void DeclarativeChart::paint(QPainter *painter)
{
- QRectF renderRect(QPointF(0, 0), m_chart->size());
- m_scene->render(painter, renderRect, renderRect);
+ m_sceneImageLock.lock();
+ if (m_currentSceneImage) {
+ QRect imageRect(QPoint(0, 0), m_currentSceneImage->size());
+ QRect itemRect(QPoint(0, 0), QSize(width(), height()));
+ painter->drawImage(itemRect, *m_currentSceneImage, imageRect);
+ }
+ m_sceneImageLock.unlock();
}
void DeclarativeChart::mousePressEvent(QMouseEvent *event)