diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-04-04 09:51:56 +0300 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-04-04 10:09:52 +0300 |
commit | 8f4ea5395e70408a27bdd9514b4d7ab3cf10b1f4 (patch) | |
tree | 7c7db703acb105e6ca1793b8922932c44a82e651 /src | |
parent | 2176f5c3d0c27857c6d5487c7322136f3e6a335b (diff) |
Implemented deletion of QDataItems
Change-Id: I0b7021afbf188491efe795bebd0db9de05382fd8
Change-Id: I0b7021afbf188491efe795bebd0db9de05382fd8
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/datavis3d/engine/q3dbars.cpp | 76 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.h | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars_p.h | 5 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataitem.cpp | 4 |
4 files changed, 71 insertions, 16 deletions
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp index 472ff4e4..f8c51d50 100644 --- a/src/datavis3d/engine/q3dbars.cpp +++ b/src/datavis3d/engine/q3dbars.cpp @@ -766,11 +766,12 @@ void Q3DBars::setupSampleSpace(QPoint sampleCount, const QString &labelRow d_ptr->m_sampleCount = sampleCount; // Initialize data set QVector<QDataItem*> row; - for (int columns = 0; columns < sampleCount.x(); columns ++) { - row.append(new QDataItem()); - } for (int rows = 0; rows < sampleCount.y(); rows++) { + for (int columns = 0; columns < sampleCount.x(); columns ++) { + row.append(new QDataItem()); + } d_ptr->m_dataSet.append(row); + row.clear(); } // TODO: Invent "idiotproof" max scene size formula.. // This seems to work ok if spacing is not negative @@ -1108,7 +1109,7 @@ void Q3DBars::addDataRow(const QVector<float> &dataRow, const QString &labelRow d_ptr->m_dataSet.prepend(sampleRow); // if the added data pushed us over sample space, remove the oldest data set if (d_ptr->m_dataSet.size() > d_ptr->m_sampleCount.y()) - d_ptr->m_dataSet.resize(d_ptr->m_sampleCount.y()); + d_ptr->resizeDataSet(); } void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labelRow @@ -1117,7 +1118,7 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe QVector<QDataItem*> row = dataRow; // Check that the input data fits into sample space, and resize if it doesn't if (row.size() > d_ptr->m_sampleCount.x()) { - row.resize(d_ptr->m_sampleCount.x()); + d_ptr->resizeDataRow(&row); qWarning("Data set too large for sample space"); } d_ptr->findHighestValue(row); @@ -1127,16 +1128,17 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe d_ptr->m_dataSet.prepend(row); // if the added data pushed us over sample space, remove the oldest data set if (d_ptr->m_dataSet.size() > d_ptr->m_sampleCount.y()) - d_ptr->m_dataSet.resize(d_ptr->m_sampleCount.y()); + d_ptr->resizeDataSet(); } void Q3DBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QString> &labelsRow , const QVector<QString> &labelsColumn) { - d_ptr->m_dataSet.clear(); + d_ptr->clearDataSet(); // Check sizes if (data.at(0).size() > d_ptr->m_sampleCount.x()) { qCritical("Too much data per row, aborting"); + // TODO: Implement a function that goes through all rows and crops the column count return; } for (int i = 0; i < data.size(); i++) @@ -1148,13 +1150,15 @@ void Q3DBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QS } } -void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data, const QVector<QString> &labelsRow - , const QVector<QString> &labeslsColumn) +void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data + , const QVector<QString> &labelsRow + , const QVector<QString> &labelsColumn) { - d_ptr->m_dataSet.clear(); + d_ptr->clearDataSet(); // Check sizes if (data.at(0).size() > d_ptr->m_sampleCount.x()) { qCritical("Too much data per row, aborting"); + // TODO: Implement a function that goes through all rows and crops the column count return; } @@ -1162,7 +1166,7 @@ void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data, const QVect if (d_ptr->m_dataSet.size() > d_ptr->m_sampleCount.y()) { qWarning("Data set too large for sample space. Cropping it to fit."); - d_ptr->m_dataSet.resize(d_ptr->m_sampleCount.y()); + d_ptr->resizeDataSet(); } for (int i = 0; i < d_ptr->m_dataSet.size(); i++) @@ -1220,10 +1224,10 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) Q3DBarsPrivate::~Q3DBarsPrivate() { qDebug() << "Destroying Q3DBarsPrivate"; + clearDataSet(); delete m_barShader; delete m_selectionShader; delete m_backgroundShader; - delete m_selectedBar; delete m_barObj; delete m_backgroundObj; @@ -1244,6 +1248,54 @@ void Q3DBarsPrivate::findHighestValue(const QVector<QDataItem*> &row) } } +void Q3DBarsPrivate::resizeDataSet() +{ + qDebug("resizeDataSet"); + // QVector's resize doesn't delete data contained in it + // Delete contents of rows to be removed + int nbrToBeRemoved = m_dataSet.size() - m_sampleCount.y(); + for (int rowCount = 0; rowCount < nbrToBeRemoved; rowCount++) { + int rowToBeRemoved = m_dataSet.size() - rowCount - 1; // -1 to compensate index 0 + QVector<QDataItem*> row = m_dataSet.at(rowToBeRemoved); + for (int itemCount = 0; itemCount < row.size(); itemCount++) { + delete row.at(itemCount); + } + row.clear(); + } + // Resize vector + m_dataSet.resize(m_sampleCount.y()); +} + +void Q3DBarsPrivate::resizeDataRow(QVector<QDataItem *> *row) +{ + qDebug("resizeDataRow"); + // QVector's resize doesn't delete data contained in it + // Delete contents of items to be removed + int nbrToBeRemoved = row->size() - m_sampleCount.x(); + for (int itemCount = 0; itemCount < nbrToBeRemoved; itemCount++) { + int itemToBeRemoved = row->size() - itemCount - 1; // -1 to compensate index 0 + delete row->at(itemToBeRemoved); + } + // Resize vector + row->resize(m_sampleCount.x()); +} + +void Q3DBarsPrivate::clearDataSet() +{ + qDebug("clearDataSet"); + // QVector's clear doesn't delete data contained in it + // Delete contents + for (int rowCount = 0; rowCount < m_dataSet.size(); rowCount++) { + QVector<QDataItem*> row = m_dataSet.at(rowCount); + for (int itemCount = 0; itemCount < row.size(); itemCount++) { + delete row.at(itemCount); + } + row.clear(); + } + // Clear vector + m_dataSet.clear(); +} + void Q3DBarsPrivate::loadBarMesh() { if (m_barObj) diff --git a/src/datavis3d/engine/q3dbars.h b/src/datavis3d/engine/q3dbars.h index b5c0ac22..f4c03f1a 100644 --- a/src/datavis3d/engine/q3dbars.h +++ b/src/datavis3d/engine/q3dbars.h @@ -132,7 +132,7 @@ public: // TODO: Replace QVector<QVector<..>> with a data set class (QDataSet)? Move labels to class. void addDataSet(const QVector< QVector<QDataItem*> > &data , const QVector<QString> &labelsRow = QVector<QString>() - , const QVector<QString> &labeslsColumn = QVector<QString>()); + , const QVector<QString> &labelsColumn = QVector<QString>()); // bar thickness, spacing between bars, and is spacing relative to thickness or absolute // y -component sets the thickness/spacing of z -direction diff --git a/src/datavis3d/engine/q3dbars_p.h b/src/datavis3d/engine/q3dbars_p.h index b434693b..5d2d3d20 100644 --- a/src/datavis3d/engine/q3dbars_p.h +++ b/src/datavis3d/engine/q3dbars_p.h @@ -70,7 +70,10 @@ public: Q3DBarsPrivate(Q3DBars *q); ~Q3DBarsPrivate(); - void findHighestValue(const QVector<QDataItem*> &row); + void findHighestValue(const QVector<QDataItem*> &row); // TODO: Move to QDataSet class when it's done + void resizeDataSet(); // TODO: Move to QDataSet class when it's done + void resizeDataRow(QVector<QDataItem*> *row); // TODO: Move to QDataSet class when it's done + void clearDataSet(); // TODO: Move to QDataSet class when it's done void loadBarMesh(); void loadBackgroundMesh(); void initShaders(const QString &vertexShader, const QString &fragmentShader); diff --git a/src/datavis3d/engine/qdataitem.cpp b/src/datavis3d/engine/qdataitem.cpp index f24d1055..8cdd9b8b 100644 --- a/src/datavis3d/engine/qdataitem.cpp +++ b/src/datavis3d/engine/qdataitem.cpp @@ -50,12 +50,12 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE QDataItem::QDataItem(float value, const QString &label) : d_ptr(new QDataItemPrivate(this, value, label)) { - qDebug("QDataItem"); + //qDebug("QDataItem"); } QDataItem::~QDataItem() { - qDebug("~QDataItem"); + //qDebug("~QDataItem"); delete d_ptr; } |