diff options
-rw-r--r-- | src/datavisualization/data/qsurface3dseries.cpp | 6 | ||||
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy.cpp | 108 | ||||
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy.h | 11 | ||||
-rw-r--r-- | src/datavisualization/data/qsurfacedataproxy_p.h | 5 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller.cpp | 31 | ||||
-rw-r--r-- | src/datavisualization/engine/surface3dcontroller_p.h | 3 | ||||
-rw-r--r-- | tests/surfacetest/graphmodifier.cpp | 135 | ||||
-rw-r--r-- | tests/surfacetest/graphmodifier.h | 8 | ||||
-rw-r--r-- | tests/surfacetest/main.cpp | 30 |
9 files changed, 334 insertions, 3 deletions
diff --git a/src/datavisualization/data/qsurface3dseries.cpp b/src/datavisualization/data/qsurface3dseries.cpp index deb12f44..19462af4 100644 --- a/src/datavisualization/data/qsurface3dseries.cpp +++ b/src/datavisualization/data/qsurface3dseries.cpp @@ -330,8 +330,14 @@ void QSurface3DSeriesPrivate::connectControllerAndProxy(Abstract3DController *ne QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::arrayReset, controller, &Surface3DController::handleArrayReset); + QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::rowsAdded, controller, + &Surface3DController::handleRowsAdded); QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::rowsChanged, controller, &Surface3DController::handleRowsChanged); + QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::rowsRemoved, controller, + &Surface3DController::handleRowsRemoved); + QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::rowsInserted, controller, + &Surface3DController::handleRowsInserted); QObject::connect(surfaceDataProxy, &QSurfaceDataProxy::itemChanged, controller, &Surface3DController::handleItemChanged); } diff --git a/src/datavisualization/data/qsurfacedataproxy.cpp b/src/datavisualization/data/qsurfacedataproxy.cpp index 49553036..678ffd8d 100644 --- a/src/datavisualization/data/qsurfacedataproxy.cpp +++ b/src/datavisualization/data/qsurfacedataproxy.cpp @@ -172,6 +172,66 @@ void QSurfaceDataProxy::setItem(int rowIndex, int columnIndex, const QSurfaceDat } /*! + * Adds a new \a row to the end of array. The new \a row must have + * the same number of columns as the rows at the initial array. + * + * \return index of the added row. + */ +int QSurfaceDataProxy::addRow(QSurfaceDataRow *row) +{ + int addIndex = dptr()->addRow(row); + emit rowsAdded(addIndex, 1); + return addIndex; +} + +/*! + * Adds new \a rows to the end of array. The new rows must have the same number of columns + * as the rows at the initial array. + * + * \return index of the first added row. + */ +int QSurfaceDataProxy::addRows(const QSurfaceDataArray &rows) +{ + int addIndex = dptr()->addRows(rows); + emit rowsAdded(addIndex, rows.size()); + return addIndex; +} + +/*! + * Inserts a new \a row into \a rowIndex. + * If rowIndex is equal to array size, rows are added to end of the array. The new \a row must have + * the same number of columns as the rows at the initial array. + */ +void QSurfaceDataProxy::insertRow(int rowIndex, QSurfaceDataRow *row) +{ + dptr()->insertRow(rowIndex, row); + emit rowsInserted(rowIndex, 1); +} + +/*! + * Inserts new \a rows into \a rowIndex. + * If rowIndex is equal to array size, rows are added to end of the array. The new \a rows must have + * the same number of columns as the rows at the initial array. + */ +void QSurfaceDataProxy::insertRows(int rowIndex, const QSurfaceDataArray &rows) +{ + dptr()->insertRows(rowIndex, rows); + emit rowsInserted(rowIndex, rows.size()); +} + +/*! + * Removes \a removeCount rows staring at \a rowIndex. Attempting to remove rows past the end of the + * array does nothing. + */ +void QSurfaceDataProxy::removeRows(int rowIndex, int removeCount) +{ + if (rowIndex < rowCount() && removeCount >= 1) { + dptr()->removeRows(rowIndex, removeCount); + emit rowsRemoved(rowIndex, removeCount); + } +} + +/*! * \return pointer to the data array. */ const QSurfaceDataArray *QSurfaceDataProxy::array() const @@ -276,9 +336,9 @@ void QSurfaceDataProxyPrivate::setRows(int rowIndex, const QSurfaceDataArray &ro { QSurfaceDataArray &dataArray = *m_dataArray; Q_ASSERT(rowIndex >= 0 && (rowIndex + rows.size()) <= dataArray.size()); - Q_ASSERT(m_dataArray->at(rowIndex)->size() == rows.at(0)->size()); for (int i = 0; i < rows.size(); i++) { + Q_ASSERT(m_dataArray->at(rowIndex)->size() == rows.at(i)->size()); if (rows.at(i) != dataArray.at(rowIndex)) { clearRow(rowIndex); dataArray[rowIndex] = rows.at(i); @@ -295,6 +355,52 @@ void QSurfaceDataProxyPrivate::setItem(int rowIndex, int columnIndex, const QSur row[columnIndex] = item; } +int QSurfaceDataProxyPrivate::addRow(QSurfaceDataRow *row) +{ + Q_ASSERT(m_dataArray->at(0)->size() == row->size()); + int currentSize = m_dataArray->size(); + m_dataArray->append(row); + return currentSize; +} + +int QSurfaceDataProxyPrivate::addRows(const QSurfaceDataArray &rows) +{ + int currentSize = m_dataArray->size(); + for (int i = 0; i < rows.size(); i++) { + Q_ASSERT(m_dataArray->at(0)->size() == rows.at(i)->size()); + m_dataArray->append(rows.at(i)); + } + return currentSize; +} + +void QSurfaceDataProxyPrivate::insertRow(int rowIndex, QSurfaceDataRow *row) +{ + Q_ASSERT(rowIndex >= 0 && rowIndex <= m_dataArray->size()); + Q_ASSERT(m_dataArray->at(0)->size() == row->size()); + m_dataArray->insert(rowIndex, row); +} + +void QSurfaceDataProxyPrivate::insertRows(int rowIndex, const QSurfaceDataArray &rows) +{ + Q_ASSERT(rowIndex >= 0 && rowIndex <= m_dataArray->size()); + + for (int i = 0; i < rows.size(); i++) { + Q_ASSERT(m_dataArray->at(0)->size() == rows.at(i)->size()); + m_dataArray->insert(rowIndex++, rows.at(i)); + } +} + +void QSurfaceDataProxyPrivate::removeRows(int rowIndex, int removeCount) +{ + Q_ASSERT(rowIndex >= 0); + int maxRemoveCount = m_dataArray->size() - rowIndex; + removeCount = qMin(removeCount, maxRemoveCount); + for (int i = 0; i < removeCount; i++) { + clearRow(rowIndex); + m_dataArray->removeAt(rowIndex); + } +} + QSurfaceDataProxy *QSurfaceDataProxyPrivate::qptr() { return static_cast<QSurfaceDataProxy *>(q_ptr); diff --git a/src/datavisualization/data/qsurfacedataproxy.h b/src/datavisualization/data/qsurfacedataproxy.h index 4533f4c5..c2a0fef2 100644 --- a/src/datavisualization/data/qsurfacedataproxy.h +++ b/src/datavisualization/data/qsurfacedataproxy.h @@ -55,9 +55,20 @@ public: void setItem(int rowIndex, int columnIndex, const QSurfaceDataItem &item); + int addRow(QSurfaceDataRow *row); + int addRows(const QSurfaceDataArray &rows); + + void insertRow(int rowIndex, QSurfaceDataRow *row); + void insertRows(int rowIndex, const QSurfaceDataArray &rows); + + void removeRows(int rowIndex, int removeCount); + signals: void arrayReset(); + void rowsAdded(int startIndex, int count); void rowsChanged(int startIndex, int count); + void rowsRemoved(int startIndex, int count); + void rowsInserted(int startIndex, int count); void itemChanged(int rowIndex, int columnIndex); void seriesChanged(QSurface3DSeries *series); diff --git a/src/datavisualization/data/qsurfacedataproxy_p.h b/src/datavisualization/data/qsurfacedataproxy_p.h index 3125a40a..1fda354c 100644 --- a/src/datavisualization/data/qsurfacedataproxy_p.h +++ b/src/datavisualization/data/qsurfacedataproxy_p.h @@ -47,6 +47,11 @@ public: void setRow(int rowIndex, QSurfaceDataRow *row); void setRows(int rowIndex, const QSurfaceDataArray &rows); void setItem(int rowIndex, int columnIndex, const QSurfaceDataItem &item); + int addRow(QSurfaceDataRow *row); + int addRows(const QSurfaceDataArray &rows); + void insertRow(int rowIndex, QSurfaceDataRow *row); + void insertRows(int rowIndex, const QSurfaceDataArray &rows); + void removeRows(int rowIndex, int removeCount); void limitValues(QVector3D &minValues, QVector3D &maxValues) const; virtual void setSeries(QAbstract3DSeries *series); diff --git a/src/datavisualization/engine/surface3dcontroller.cpp b/src/datavisualization/engine/surface3dcontroller.cpp index a9c5f508..0a1bdc4e 100644 --- a/src/datavisualization/engine/surface3dcontroller.cpp +++ b/src/datavisualization/engine/surface3dcontroller.cpp @@ -379,6 +379,37 @@ void Surface3DController::handleItemChanged(int rowIndex, int columnIndex) } } +void Surface3DController::handleRowsAdded(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + adjustValueAxisRange(); + m_isDataDirty = true; + emitNeedRender(); +} + +void Surface3DController::handleRowsInserted(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + adjustValueAxisRange(); + m_isDataDirty = true; + emitNeedRender(); +} + +void Surface3DController::handleRowsRemoved(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + adjustValueAxisRange(); + m_isDataDirty = true; + + // Clear selection unless still valid + setSelectedPoint(m_selectedPoint, m_selectedSeries); + + emitNeedRender(); +} + void Surface3DController::adjustValueAxisRange() { if (m_seriesList.size()) { diff --git a/src/datavisualization/engine/surface3dcontroller_p.h b/src/datavisualization/engine/surface3dcontroller_p.h index c7496c18..1dfd9dc2 100644 --- a/src/datavisualization/engine/surface3dcontroller_p.h +++ b/src/datavisualization/engine/surface3dcontroller_p.h @@ -101,7 +101,10 @@ public: public slots: void handleArrayReset(); + void handleRowsAdded(int startIndex, int count); void handleRowsChanged(int startIndex, int count); + void handleRowsRemoved(int startIndex, int count); + void handleRowsInserted(int startIndex, int count); void handleItemChanged(int rowIndex, int columnIndex); // Renderer callback handlers diff --git a/tests/surfacetest/graphmodifier.cpp b/tests/surfacetest/graphmodifier.cpp index 11e651a3..3bf90981 100644 --- a/tests/surfacetest/graphmodifier.cpp +++ b/tests/surfacetest/graphmodifier.cpp @@ -48,6 +48,9 @@ GraphModifier::GraphModifier(Q3DSurface *graph) m_rangeZ(16.0), m_minX(-8.0), m_minZ(-8.0), + m_addRowCounter(m_zCount), + m_insertTestZPos(0), + m_insertTestIndexPos(1), m_planeArray(0), m_theSeries(new QSurface3DSeries) { @@ -410,9 +413,9 @@ void GraphModifier::changeRow() float i = float(rand() % m_zCount); QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = qMin(maxZ, (i * stepZ + minZ)); for (float j = 0; j < m_xCount; j++) { float x = qMin(maxX, (j * stepX + minX)); - float z = qMin(maxZ, (i * stepZ + minZ)); float R = qSqrt(x * x + z * z) + 0.01f; float y = (qSin(R) / R + 0.24f) * 1.61f + 1.2f; (*newRow)[j].setPosition(QVector3D(x, y, z)); @@ -494,6 +497,135 @@ void GraphModifier::changeMultipleItem() changeItem(); } +void GraphModifier::addRow() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Adding a new row"; + + float minX = -10.0f; + float maxX = 10.0f; + float minZ = -10.0f; + float maxZ = 10.0f; + float stepX = (maxX - minX) / float(m_xCount - 1); + float stepZ = (maxZ - minZ) / float(m_zCount - 1); + + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = float(m_addRowCounter) * stepZ + minZ; + for (float j = 0; j < m_xCount; j++) { + float x = qMin(maxX, (j * stepX + minX)); + float R = qSqrt(x * x + z * z) + 0.01f; + float y = (qSin(R) / R + 0.24f) * 1.61f + 1.0f; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + m_addRowCounter++; + + m_theSeries->dataProxy()->addRow(newRow); + } else { + qDebug() << "Change row function active only for SqrtSin"; + } +} + +void GraphModifier::addRows() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Adding few new row"; + + float minX = -10.0f; + float maxX = 10.0f; + float minZ = -10.0f; + float maxZ = 10.0f; + float stepX = (maxX - minX) / float(m_xCount - 1); + float stepZ = (maxZ - minZ) / float(m_zCount - 1); + + QSurfaceDataArray dataArray; + + for (int i = 0; i < 3; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = m_addRowCounter * stepZ + minZ; + for (float j = 0; j < m_xCount; j++) { + float x = qMin(maxX, (j * stepX + minX)); + float R = qSqrt(x * x + z * z) + 0.01f; + float y = (qSin(R) / R + 0.24f) * 1.61f + 1.0f; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + dataArray.append(newRow); + m_addRowCounter++; + } + + m_theSeries->dataProxy()->addRows(dataArray); + } else { + qDebug() << "Change row function active only for SqrtSin"; + } +} + +void GraphModifier::insertRow() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Inserting a row"; + float minX = -10.0f; + float maxX = 10.0f; + float minZ = -10.0f; + float maxZ = 10.0f; + float stepX = (maxX - minX) / float(m_xCount - 1); + float stepZ = (maxZ - minZ) / float(m_zCount - 1); + + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = qMin(maxZ, (float(m_insertTestZPos) * stepZ + minZ + (stepZ / 2.0f))); + for (float j = 0; j < m_xCount; j++) { + float x = qMin(maxX, (j * stepX + minX)); + float R = qSqrt(x * x + z * z) + 0.01f; + float y = (qSin(R) / R + 0.24f) * 1.61f + 1.3f; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + m_insertTestZPos++; + + m_theSeries->dataProxy()->insertRow(m_insertTestIndexPos, newRow); + m_insertTestIndexPos += 2; + } else { + qDebug() << "Change row function active only for SqrtSin"; + } +} + +void GraphModifier::insertRows() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Inserting 3 rows"; + float minX = -10.0f; + float maxX = 10.0f; + float minZ = -10.0f; + float maxZ = 10.0f; + float stepX = (maxX - minX) / float(m_xCount - 1); + float stepZ = (maxZ - minZ) / float(m_zCount - 1); + + QSurfaceDataArray dataArray; + for (int i = 0; i < 3; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = qMin(maxZ, (float(m_insertTestZPos) * stepZ + minZ + i * (stepZ / 4.0f))); + for (float j = 0; j < m_xCount; j++) { + float x = qMin(maxX, (j * stepX + minX)); + float R = qSqrt(x * x + z * z) + 0.01f; + float y = (qSin(R) / R + 0.24f) * 1.61f + 1.3f; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + dataArray.append(newRow); + } + m_insertTestZPos++; + + m_theSeries->dataProxy()->insertRows(m_insertTestIndexPos, dataArray); + m_insertTestIndexPos += 4; + } else { + qDebug() << "Change row function active only for SqrtSin"; + } +} + +void GraphModifier::removeRow() +{ + qDebug() << "Remove an arbitrary row"; + int row = rand() % m_zCount; + m_theSeries->dataProxy()->removeRows(row, 1); + m_zCount--; +} + void GraphModifier::changeMesh() { static int model = 0; @@ -559,4 +691,3 @@ void GraphModifier::updateSamples() break; } } - diff --git a/tests/surfacetest/graphmodifier.h b/tests/surfacetest/graphmodifier.h index be1f6de7..8269962a 100644 --- a/tests/surfacetest/graphmodifier.h +++ b/tests/surfacetest/graphmodifier.h @@ -73,6 +73,11 @@ public: void changeItem(); void changeMultipleItem(); void changeMultipleRows(); + void addRow(); + void addRows(); + void insertRow(); + void insertRows(); + void removeRow(); public slots: void changeShadowQuality(int quality); @@ -101,6 +106,9 @@ private: float m_rangeZ; float m_minX; float m_minZ; + int m_addRowCounter; + int m_insertTestZPos; + int m_insertTestIndexPos; QTimer m_timer; QSurfaceDataArray *m_planeArray; QLabel *m_selectionInfoLabel; diff --git a/tests/surfacetest/main.cpp b/tests/surfacetest/main.cpp index 6db05718..d2cafae9 100644 --- a/tests/surfacetest/main.cpp +++ b/tests/surfacetest/main.cpp @@ -228,6 +228,21 @@ int main(int argc, char *argv[]) QPushButton *changeMultipleRowsButton = new QPushButton(widget); changeMultipleRowsButton->setText(QStringLiteral("Change many rows")); + QPushButton *addRowButton = new QPushButton(widget); + addRowButton->setText(QStringLiteral("Add a row")); + + QPushButton *addRowsButton = new QPushButton(widget); + addRowsButton->setText(QStringLiteral("Add 3 rows")); + + QPushButton *insertRowButton = new QPushButton(widget); + insertRowButton->setText(QStringLiteral("Insert a row")); + + QPushButton *insertRowsButton = new QPushButton(widget); + insertRowsButton->setText(QStringLiteral("Insert 3 rows")); + + QPushButton *removeRowButton = new QPushButton(widget); + removeRowButton->setText(QStringLiteral("Remove a row")); + // Add controls to the layout vLayout->addWidget(smoothCB); vLayout->addWidget(surfaceGridCB); @@ -266,6 +281,11 @@ int main(int argc, char *argv[]) vLayout2->addWidget(changeMultipleRowsButton); vLayout2->addWidget(changeItemButton); vLayout2->addWidget(changeMultipleItemButton); + vLayout2->addWidget(addRowButton); + vLayout2->addWidget(addRowsButton); + vLayout2->addWidget(insertRowButton); + vLayout2->addWidget(insertRowsButton); + vLayout2->addWidget(removeRowButton); widget->show(); @@ -326,6 +346,16 @@ int main(int argc, char *argv[]) modifier, &GraphModifier::changeMultipleItem); QObject::connect(changeMultipleRowsButton,&QPushButton::clicked, modifier, &GraphModifier::changeMultipleRows); + QObject::connect(addRowButton,&QPushButton::clicked, + modifier, &GraphModifier::addRow); + QObject::connect(addRowsButton,&QPushButton::clicked, + modifier, &GraphModifier::addRows); + QObject::connect(insertRowButton,&QPushButton::clicked, + modifier, &GraphModifier::insertRow); + QObject::connect(insertRowsButton,&QPushButton::clicked, + modifier, &GraphModifier::insertRows); + QObject::connect(removeRowButton,&QPushButton::clicked, + modifier, &GraphModifier::removeRow); modifier->setGridSliderZ(gridSliderZ); modifier->setGridSliderX(gridSliderX); |