diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-06-24 09:26:00 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-06-24 10:55:43 +0300 |
commit | 8af1198998123f11f7e343685389d7ba76de24d5 (patch) | |
tree | 1fe774c382372b102516d968fbeb5efaf29957f7 /src/datavis3dqml2/declarativebars.cpp | |
parent | fb7efe0169401e49a8bbf8e4b2b495d98f26046a (diff) |
Crash fix to QML bars exit
Still possible to get crashing if datasets, rows and items are created
in reverse order.
Needs to be documented.
Change-Id: Ia35b54eb9652ba031da35dd37f9ef9cae9aca04d
Change-Id: Ia35b54eb9652ba031da35dd37f9ef9cae9aca04d
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavis3dqml2/declarativebars.cpp')
-rw-r--r-- | src/datavis3dqml2/declarativebars.cpp | 110 |
1 files changed, 87 insertions, 23 deletions
diff --git a/src/datavis3dqml2/declarativebars.cpp b/src/datavis3dqml2/declarativebars.cpp index 19fd8ee7..8c458be1 100644 --- a/src/datavis3dqml2/declarativebars.cpp +++ b/src/datavis3dqml2/declarativebars.cpp @@ -42,6 +42,8 @@ #include "declarativebars.h" #include "bars3dcontroller_p.h" #include "qdataset.h" +#include "qdataset_p.h" +#include "qdatarow_p.h" #include <QtQuick/QQuickWindow> #include <QtGui/QOpenGLFramebufferObject> @@ -61,9 +63,6 @@ DeclarativeBars::DeclarativeBars(QQuickItem *parent) setFlags(QQuickItem::ItemHasContents); setAcceptedMouseButtons(Qt::AllButtons); - // TODO: Note; this does not flip the render result correctly. It is in mirror image. - //setRotation(180.0); - // TODO: These seem to have no effect; find a way to activate anti-aliasing setAntialiasing(true); setSmooth(true); @@ -99,16 +98,6 @@ QSGNode *DeclarativeBars::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData m_cachedState->m_isSampleSpaceSet = false; } - if (m_cachedState->m_dataRow) { - m_shared->addDataRow(m_cachedState->m_dataRow); - m_cachedState->m_dataRow = 0; - } - - if (m_cachedState->m_dataSet) { - m_shared->addDataSet(m_cachedState->m_dataSet); - m_cachedState->m_dataSet = 0; - } - if (m_cachedState->m_isSelectionModeSet) { m_shared->setSelectionMode(m_cachedState->m_selectionMode); m_cachedState->m_isSelectionModeSet = false; @@ -129,6 +118,16 @@ QSGNode *DeclarativeBars::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData m_cachedState->m_isGridSet = false; } + if (m_cachedState->m_dataRow) { + m_shared->addDataRow(m_cachedState->m_dataRow); + m_cachedState->m_dataRow = 0; + } + + if (m_cachedState->m_dataSet) { + m_shared->addDataSet(m_cachedState->m_dataSet); + m_cachedState->m_dataSet = 0; + } + // If old node exists and has right size, reuse it. if (oldNode && m_initialisedSize == boundingRect().size().toSize()) { // Update bounding rectangle (that has same size as before). @@ -282,20 +281,42 @@ void DeclarativeBars::addDataRow(const QVector<float> &dataRow, const QString &l const QVector<QString> &labelsColumn) { qDebug() << "Enter DeclarativeBars::addDataRow(const QVector<float> &dataRow...)"; - m_shared->addDataRow(dataRow, labelRow, labelsColumn); + // TODO: Save labels to cachedstate + QDataItem *newItem; + delete m_cachedState->m_dataRow; + m_cachedState->m_dataRow = new QDataRow(); + for (int i = 0; i < dataRow.count(); i++) { + newItem = new QDataItem(dataRow.at(i)); + m_cachedState->m_dataRow->addItem(newItem); + } + update(); } -void DeclarativeBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labelRow, +void DeclarativeBars::addDataRow(const QVector<QDataItem *> &dataRow, const QString &labelRow, const QVector<QString> &labelsColumn) { qDebug() << "Enter DeclarativeBars::addDataRow(const QVector<QDataItem*> &dataRow...)"; - m_shared->addDataRow(dataRow, labelRow, labelsColumn); + // TODO: Save labels to cachedstate + QDataItem *newItem; + delete m_cachedState->m_dataRow; + m_cachedState->m_dataRow = new QDataRow(); + for (int i = 0; i < dataRow.count(); i++) { + newItem = new QDataItem(*dataRow.at(i)); + m_cachedState->m_dataRow->addItem(newItem); + } + update(); } void DeclarativeBars::addDataRow(QDataRow *dataRow) { qDebug() << "Enter DeclarativeBars::addDataRow(QDataRow *dataRow)"; - m_cachedState->m_dataRow = dataRow; + QDataItem *newItem; + delete m_cachedState->m_dataRow; + m_cachedState->m_dataRow = new QDataRow(); + for (int i = 0; i < dataRow->d_ptr->row().count(); i++) { + newItem = new QDataItem(*dataRow->d_ptr->getItem(i)); + m_cachedState->m_dataRow->addItem(newItem); + } update(); } @@ -303,19 +324,62 @@ void DeclarativeBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QString> &labelsRow, const QVector<QString> &labelsColumn) { - m_shared->addDataSet(data, labelsRow, labelsColumn); + qDebug() << "void DeclarativeBars::addDataSet(const QVector< QVector<float> >..."; + // TODO: Save labels to cachedstate + QDataItem *newItem; + QDataRow *newRow; + delete m_cachedState->m_dataSet; + m_cachedState->m_dataSet = new QDataSet(); + for (int row = 0; row < data.count(); row++) { + newRow = new QDataRow(); + for (int i = 0; i < data.at(row).count(); i++) { + newItem = new QDataItem(data.at(row).at(i)); + newRow->addItem(newItem); + } + m_cachedState->m_dataSet->addRow(newRow); + } + update(); } -void DeclarativeBars::addDataSet(const QVector< QVector<QDataItem*> > &data, +void DeclarativeBars::addDataSet(const QVector< QVector<QDataItem *> > &data, const QVector<QString> &labelsRow, const QVector<QString> &labelsColumn) { - m_shared->addDataSet(data, labelsRow, labelsColumn); + qDebug() << "void DeclarativeBars::addDataSet(const QVector< QVector<QDataItem *> >..."; + // TODO: Save labels to cachedstate + QDataItem *newItem; + QDataRow *newRow; + delete m_cachedState->m_dataSet; + m_cachedState->m_dataSet = new QDataSet(); + for (int row = 0; row < data.count(); row++) { + newRow = new QDataRow(); + for (int i = 0; i < data.at(row).count(); i++) { + newItem = new QDataItem(*data.at(row).at(i)); + newRow->addItem(newItem); + } + m_cachedState->m_dataSet->addRow(newRow); + } + update(); } -void DeclarativeBars::addDataSet(QDataSet* dataSet) -{ - m_cachedState->m_dataSet = dataSet; +void DeclarativeBars::addDataSet(QDataSet *dataSet) +{ + qDebug() << "void DeclarativeBars::addDataSet(QDataSet *dataSet)"; + // TODO: Handle labels? + QDataItem *newItem; + QDataRow *newRow; + delete m_cachedState->m_dataSet; + m_cachedState->m_dataSet = new QDataSet(); + for (int row = 0; row < dataSet->d_ptr->set().count(); row++) { + newRow = new QDataRow(); + for (int i = 0; i < dataSet->d_ptr->getRow(row)->d_ptr->row().count(); i++) { + newItem = new QDataItem(1.0f);//*dataSet->d_ptr->getRow(row)->d_ptr->getItem(i)); + qDebug() << "adding" << row << ":" << i << newRow << newItem; + newRow->addItem(newItem); + } + m_cachedState->m_dataSet->addRow(newRow); + } + update(); } void DeclarativeBars::setSelectionMode(DeclarativeBars::SelectionMode mode) |