summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/data/qsurface3dseries.cpp6
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.cpp108
-rw-r--r--src/datavisualization/data/qsurfacedataproxy.h11
-rw-r--r--src/datavisualization/data/qsurfacedataproxy_p.h5
-rw-r--r--src/datavisualization/engine/surface3dcontroller.cpp31
-rw-r--r--src/datavisualization/engine/surface3dcontroller_p.h3
-rw-r--r--tests/surfacetest/graphmodifier.cpp135
-rw-r--r--tests/surfacetest/graphmodifier.h8
-rw-r--r--tests/surfacetest/main.cpp30
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);