diff options
author | Heikkinen Miikka <miikka.heikkinen@digia.com> | 2013-05-13 11:24:30 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-05-13 12:02:31 +0300 |
commit | 618c94f2228561f74ca75b2c5bcc17ee5d9a107d (patch) | |
tree | 49670713daad9fa1879a36f412170bd40b06f591 /plugins/declarative/declarativechart.cpp | |
parent | 54fd83ddb7eda05ebeb31cd9df033f57ab4bd13c (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.cpp | 46 |
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) |