From 31f9c57bc50ae053cfaf039a1dfdb128e2494458 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 20 Oct 2015 13:18:59 +0300 Subject: Fix issues with COIN builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -Fix miscellaneous compile errors -Move manual tests to manual folder and enable export of autotests -Added widgets requirement -Fixed autotests -Fixed renderer and controller synchronization in QML case -Treat fallback Mesa as ES2 similar to setting AA_UseSoftwareOpenGL Change-Id: If6619733725d079e339bef16262e5ea1450ab20f Reviewed-by: Tomi Korpipää --- tests/manual/surfacetest/Heightmap.png | Bin 0 -> 71764 bytes tests/manual/surfacetest/graphmodifier.cpp | 1682 ++++++++++++++++++++++++++++ tests/manual/surfacetest/graphmodifier.h | 204 ++++ tests/manual/surfacetest/main.cpp | 748 +++++++++++++ tests/manual/surfacetest/mapimage.png | Bin 0 -> 159540 bytes tests/manual/surfacetest/surfacetest.pro | 14 + tests/manual/surfacetest/surfacetest.qrc | 6 + 7 files changed, 2654 insertions(+) create mode 100644 tests/manual/surfacetest/Heightmap.png create mode 100644 tests/manual/surfacetest/graphmodifier.cpp create mode 100644 tests/manual/surfacetest/graphmodifier.h create mode 100644 tests/manual/surfacetest/main.cpp create mode 100644 tests/manual/surfacetest/mapimage.png create mode 100644 tests/manual/surfacetest/surfacetest.pro create mode 100644 tests/manual/surfacetest/surfacetest.qrc (limited to 'tests/manual/surfacetest') diff --git a/tests/manual/surfacetest/Heightmap.png b/tests/manual/surfacetest/Heightmap.png new file mode 100644 index 00000000..2a860111 Binary files /dev/null and b/tests/manual/surfacetest/Heightmap.png differ diff --git a/tests/manual/surfacetest/graphmodifier.cpp b/tests/manual/surfacetest/graphmodifier.cpp new file mode 100644 index 00000000..8db7e07c --- /dev/null +++ b/tests/manual/surfacetest/graphmodifier.cpp @@ -0,0 +1,1682 @@ +/****************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Data Visualization module. +** +** $QT_BEGIN_LICENSE:COMM$ +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** $QT_END_LICENSE$ +** +******************************************************************************/ + +#include "graphmodifier.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifndef QT_NO_CURSOR +#include +#endif +using namespace QtDataVisualization; + +//#define JITTER_PLANE +//#define WONKY_PLANE + +GraphModifier::GraphModifier(Q3DSurface *graph, QWidget *parentWidget) + : m_graph(graph), + m_series1(new QSurface3DSeries), + m_series2(new QSurface3DSeries), + m_series3(new QSurface3DSeries), + m_series4(new QSurface3DSeries), + m_gridSliderX(0), + m_gridSliderZ(0), + m_axisRangeSliderX(0), + m_axisRangeSliderZ(0), + m_axisMinSliderX(0), + m_axisMinSliderZ(0), + m_xCount(24), + m_zCount(24), + m_activeSample(0), + m_fontSize(40), + m_rangeX(34.0), + m_rangeY(16.0), + m_rangeZ(34.0), + m_minX(-17.0), + m_minY(-8.0), + m_minZ(-17.0), + m_addRowCounter(m_zCount), + m_insertTestZPos(0), + m_insertTestIndexPos(1), + m_planeArray(0), + m_theSeries(new QSurface3DSeries), + m_drawMode(QSurface3DSeries::DrawSurfaceAndWireframe), + m_drawMode2(QSurface3DSeries::DrawSurfaceAndWireframe), + m_drawMode3(QSurface3DSeries::DrawSurfaceAndWireframe), + m_drawMode4(QSurface3DSeries::DrawSurfaceAndWireframe), + m_offset(4.0f), + m_parentWidget(parentWidget), + m_ascendingX(true), + m_ascendingZ(true) +{ + m_graph->setAxisX(new QValue3DAxis); + m_graph->axisX()->setTitle("X-Axis"); + m_graph->setAxisY(new QValue3DAxis); + m_graph->axisY()->setTitle("Value Axis"); + m_graph->setAxisZ(new QValue3DAxis); + m_graph->axisZ()->setTitle("Z-Axis"); +#ifdef MULTI_SERIES + m_limitX = float(m_xCount) / 2.0f; + m_limitZ = float(m_zCount) / 2.0f; + // Series 1 + m_multiSampleOffsetX[0] = -m_offset; + m_multiSampleOffsetZ[0] = -m_offset; + // Series 2 + m_multiSampleOffsetX[1] = -m_offset; + m_multiSampleOffsetZ[1] = m_offset; + // Series 3 + m_multiSampleOffsetX[2] = m_offset; + m_multiSampleOffsetZ[2] = -m_offset; + // Series 4 + m_multiSampleOffsetX[3] = m_offset; + m_multiSampleOffsetZ[3] = m_offset; + +// m_graph->axisX()->setRange(-m_limitX - m_offset, m_limitX + m_offset); +// m_graph->axisY()->setRange(-1.0f, 4.5f); +// m_graph->axisZ()->setRange(-m_limitZ - m_offset, m_limitZ + m_offset); +#else + m_graph->addSeries(m_theSeries); +#endif + m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX); + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ); + + static_cast(m_graph->activeInputHandler())->setZoomAtTargetEnabled(true); + + for (int i = 0; i < 4; i++) { + m_multiseries[i] = new QSurface3DSeries; + m_multiseries[i]->setName(QStringLiteral("Series %1").arg(i+1)); + m_multiseries[i]->setItemLabelFormat(QStringLiteral("@seriesName: (@xLabel, @zLabel): @yLabel")); + } + + fillSeries(); + changeStyle(); + + m_theSeries->setItemLabelFormat(QStringLiteral("@seriesName: (@xLabel, @zLabel): @yLabel")); + + connect(&m_timer, &QTimer::timeout, this, &GraphModifier::timeout); + connect(&m_graphPositionQueryTimer, &QTimer::timeout, this, &GraphModifier::graphQueryTimeout); + connect(m_theSeries, &QSurface3DSeries::selectedPointChanged, this, &GraphModifier::selectedPointChanged); + + QObject::connect(m_graph, &Q3DSurface::axisXChanged, this, + &GraphModifier::handleAxisXChanged); + QObject::connect(m_graph, &Q3DSurface::axisYChanged, this, + &GraphModifier::handleAxisYChanged); + QObject::connect(m_graph, &Q3DSurface::axisZChanged, this, + &GraphModifier::handleAxisZChanged); + QObject::connect(m_graph, &QAbstract3DGraph::currentFpsChanged, this, + &GraphModifier::handleFpsChange); + + //m_graphPositionQueryTimer.start(100); +} + +GraphModifier::~GraphModifier() +{ + delete m_graph; +} + +void GraphModifier::fillSeries() +{ + float full = m_limitX * m_limitZ; + + QSurfaceDataArray *dataArray1 = new QSurfaceDataArray; + dataArray1->reserve(m_zCount); + QSurfaceDataArray *dataArray2 = new QSurfaceDataArray; + dataArray2->reserve(m_zCount); + QSurfaceDataArray *dataArray3 = new QSurfaceDataArray; + dataArray3->reserve(m_zCount); + QSurfaceDataArray *dataArray4 = new QSurfaceDataArray; + dataArray4->reserve(m_zCount); + + + for (int i = 0; i < m_zCount; i++) { + QSurfaceDataRow *newRow[4]; + float zAdjust = 0.0f; + if (i == 2) + zAdjust = 0.7f; + + for (int s = 0; s < 4; s++) { + newRow[s] = new QSurfaceDataRow(m_xCount); + float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[s] + zAdjust; + for (int j = 0; j < m_xCount; j++) { + float xAdjust = 0.0f; + if (j == 4) + xAdjust = 0.7f; + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[s] + xAdjust; + float angle = (z * x) / full * 1.57f; + float y = (qSin(angle * float(qPow(1.3f, s))) + 1.1f * s) * 3.0f - 5.0f + xAdjust + zAdjust; + (*newRow[s])[j].setPosition(QVector3D(x, y, z)); + } + } + *dataArray1 << newRow[0]; + *dataArray2 << newRow[1]; + *dataArray3 << newRow[2]; + *dataArray4 << newRow[3]; + } + + m_multiseries[0]->dataProxy()->resetArray(dataArray1); + m_multiseries[1]->dataProxy()->resetArray(dataArray2); + m_multiseries[2]->dataProxy()->resetArray(dataArray3); + m_multiseries[3]->dataProxy()->resetArray(dataArray4); +} + +void GraphModifier::toggleSeries1(bool enabled) +{ + qDebug() << __FUNCTION__ << " enabled = " << enabled; + + if (enabled) { + m_graph->addSeries(m_multiseries[0]); + } else { + m_graph->removeSeries(m_multiseries[0]); + } +} + +void GraphModifier::toggleSeries2(bool enabled) +{ + qDebug() << __FUNCTION__ << " enabled = " << enabled; + + if (enabled) { + m_graph->addSeries(m_multiseries[1]); + } else { + m_graph->removeSeries(m_multiseries[1]); + } +} + +void GraphModifier::toggleSeries3(bool enabled) +{ + qDebug() << __FUNCTION__ << " enabled = " << enabled; + + if (enabled) { + m_graph->addSeries(m_multiseries[2]); + } else { + m_graph->removeSeries(m_multiseries[2]); + } +} + +void GraphModifier::toggleSeries4(bool enabled) +{ + qDebug() << __FUNCTION__ << " enabled = " << enabled; + + if (enabled) { + m_graph->addSeries(m_multiseries[3]); + } else { + m_graph->removeSeries(m_multiseries[3]); + } +} + +void GraphModifier::toggleSmooth(bool enabled) +{ + qDebug() << "GraphModifier::toggleSmooth " << enabled; + m_theSeries->setFlatShadingEnabled(enabled); +#ifdef MULTI_SERIES + m_multiseries[0]->setFlatShadingEnabled(enabled); +#endif +} + +void GraphModifier::toggleSurfaceGrid(bool enable) +{ + qDebug() << "GraphModifier::toggleSurfaceGrid" << enable; + if (enable) + m_drawMode |= QSurface3DSeries::DrawWireframe; + else + m_drawMode &= ~QSurface3DSeries::DrawWireframe; + + m_theSeries->setDrawMode(m_drawMode); +#ifdef MULTI_SERIES + m_multiseries[0]->setDrawMode(m_drawMode); +#endif +} + +void GraphModifier::toggleSurface(bool enable) +{ + qDebug() << "GraphModifier::toggleSurface" << enable; + if (enable) + m_drawMode |= QSurface3DSeries::DrawSurface; + else + m_drawMode &= ~QSurface3DSeries::DrawSurface; + + m_theSeries->setDrawMode(m_drawMode); +#ifdef MULTI_SERIES + m_multiseries[0]->setDrawMode(m_drawMode); +#endif +} + +void GraphModifier::toggleSeriesVisible(bool enable) +{ + m_theSeries->setVisible(enable); +#ifdef MULTI_SERIES + m_multiseries[0]->setVisible(enable); +#endif +} + +void GraphModifier::toggleSmoothS2(bool enabled) +{ + qDebug() << __FUNCTION__ << enabled; + m_multiseries[1]->setFlatShadingEnabled(enabled); +} + +void GraphModifier::toggleSurfaceGridS2(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode2 |= QSurface3DSeries::DrawWireframe; + else + m_drawMode2 &= ~QSurface3DSeries::DrawWireframe; + + m_multiseries[1]->setDrawMode(m_drawMode2); +} + +void GraphModifier::toggleSurfaceS2(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode2 |= QSurface3DSeries::DrawSurface; + else + m_drawMode2 &= ~QSurface3DSeries::DrawSurface; + + m_multiseries[1]->setDrawMode(m_drawMode2); +} + +void GraphModifier::toggleSeries2Visible(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + m_multiseries[1]->setVisible(enable); +} + +void GraphModifier::toggleSmoothS3(bool enabled) +{ + qDebug() << __FUNCTION__ << enabled; + m_multiseries[2]->setFlatShadingEnabled(enabled); +} + +void GraphModifier::toggleSurfaceGridS3(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode3 |= QSurface3DSeries::DrawWireframe; + else + m_drawMode3 &= ~QSurface3DSeries::DrawWireframe; + + m_multiseries[2]->setDrawMode(m_drawMode3); +} + +void GraphModifier::toggleSurfaceS3(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode3 |= QSurface3DSeries::DrawSurface; + else + m_drawMode3 &= ~QSurface3DSeries::DrawSurface; + + m_multiseries[2]->setDrawMode(m_drawMode3); +} + +void GraphModifier::toggleSeries3Visible(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + m_multiseries[2]->setVisible(enable); +} + +void GraphModifier::toggleSmoothS4(bool enabled) +{ + qDebug() << __FUNCTION__ << enabled; + m_multiseries[3]->setFlatShadingEnabled(enabled); +} + +void GraphModifier::toggleSurfaceGridS4(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode4 |= QSurface3DSeries::DrawWireframe; + else + m_drawMode4 &= ~QSurface3DSeries::DrawWireframe; + + m_multiseries[3]->setDrawMode(m_drawMode4); +} + +void GraphModifier::toggleSurfaceS4(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + if (enable) + m_drawMode4 |= QSurface3DSeries::DrawSurface; + else + m_drawMode4 &= ~QSurface3DSeries::DrawSurface; + + m_multiseries[3]->setDrawMode(m_drawMode4); +} + +void GraphModifier::toggleSeries4Visible(bool enable) +{ + qDebug() << __FUNCTION__ << enable; + m_multiseries[3]->setVisible(enable); +} + +void GraphModifier::toggleSqrtSin(bool enable) +{ + if (enable) { + qDebug() << "Create Sqrt&Sin surface, (" << m_xCount << ", " << m_zCount << ")"; + + 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 = new QSurfaceDataArray; + dataArray->reserve(m_zCount); + for (float i = 0; i < m_zCount; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + // Keep values within range bounds, since just adding step can cause minor drift due + // to the rounding errors. + float z = qMin(maxZ, (i * 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 << newRow; + } + + m_graph->axisY()->setRange(1.0, 3.0); + m_graph->axisX()->setLabelFormat("%.2f"); + m_graph->axisZ()->setLabelFormat("%.2f"); + + m_theSeries->setName("Sqrt & Sin"); + + resetArrayAndSliders(dataArray, minZ, maxZ, minX, maxX); + + m_activeSample = GraphModifier::SqrtSin; + } else { + qDebug() << "Remove surface"; + } +} + +void GraphModifier::togglePlane(bool enable) +{ + qDebug() << "GraphModifier::togglePlane " << enable; + + if (enable) { + m_planeArray = new QSurfaceDataArray; + +#ifdef JITTER_PLANE + m_timer.start(0); +#endif + m_graph->axisY()->setRange(0.0, 1.0); + m_graph->axisX()->setLabelFormat("%.2f"); + m_graph->axisZ()->setLabelFormat("%.2f"); + + m_planeArray->reserve(m_zCount); + float minX = -10.0f; + float maxX = 20.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); +#ifdef WONKY_PLANE + float halfZ = m_zCount / 2; + float wonkyFactor = 0.01f; + float maxStepX = 0.0f; + float add = 0.0f; + for (float i = 0; i < m_zCount; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + if (i < halfZ) { + stepX += wonkyFactor; + maxStepX = stepX; + } else { + stepX -= wonkyFactor; + } + add = 0.0f; + for (float j = 0; j < m_xCount; j++) { + (*newRow)[j].setPosition(QVector3D(j * stepX + minX, -0.04f, + i * stepZ + minZ + add)); + add += 0.5f; + + } + *m_planeArray << newRow; + } + + m_theSeries->setName("Wonky Plane"); + + resetArrayAndSliders(m_planeArray, minZ, maxZ + add, minX, m_xCount * maxStepX + minX); +#else + for (float i = 0; i < m_zCount; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + // Keep values within range bounds, since just adding step can cause minor drift due + // to the rounding errors. + float zVal; + if (i == (m_zCount - 1)) + zVal = maxZ; + else + zVal = i * stepZ + minZ; + + float j = 0; + for (; j < m_xCount - 1; j++) + (*newRow)[j].setPosition(QVector3D(j * stepX + minX, -0.04f, zVal)); + (*newRow)[j].setPosition(QVector3D(maxX, -0.04f, zVal)); + + *m_planeArray << newRow; + } + + m_theSeries->setName("Plane"); + + resetArrayAndSliders(m_planeArray, minZ, maxZ, minX, maxX); +#endif + + m_activeSample = GraphModifier::Plane; + } +#ifdef JITTER_PLANE + else { + m_timer.stop(); + } +#endif +} + +void GraphModifier::setHeightMapData(bool enable) +{ + if (enable) { + // Do the height map the hard way. + // Easier alternative would be to use the QHeightMapSurfaceDataProxy. + QImage image(":/maps/map"); + + QSurfaceDataArray *dataArray = new QSurfaceDataArray; + uchar *bits = image.bits(); + + int p = image.width() * 4 * (image.height() - 1); + dataArray->reserve(image.height()); + float minX = 34.0; + float maxX = 40.0; + float minZ = 18.0; + float maxZ = 24.0; + float xMul = (maxX - minX) / float(image.width() - 1); + float zMul = (maxZ - minZ) / float(image.height() - 1); + for (int i = 0; i < image.height(); i++, p -= image.width() * 4) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(image.width()); + for (int j = 0; j < image.width(); j++) { + (*newRow)[j].setPosition(QVector3D((float(j) * xMul) + minX, + (float(bits[p + (j * 4)]) + 1.0f) / 1.0f, + (float(i) * zMul) + minZ)); + } + *dataArray << newRow; + } + + m_graph->axisY()->setAutoAdjustRange(true); + m_graph->axisX()->setLabelFormat("%.1f N"); + m_graph->axisZ()->setLabelFormat("%.1f E"); + + m_theSeries->setName("Height Map"); + + resetArrayAndSliders(dataArray, minZ, maxZ, minX, maxX); + + m_activeSample = GraphModifier::Map; + } +} + +void GraphModifier::toggleGridSliderLock(bool enable) +{ + m_gridSlidersLocked = enable; + if (m_gridSlidersLocked) { + m_gridSliderZ->setEnabled(false); + m_gridSliderZ->setValue(m_gridSliderX->value()); + } else { + m_gridSliderZ->setEnabled(true); + } +} + +void GraphModifier::adjustXCount(int count) +{ + m_xCount = count; + if (m_gridSlidersLocked) + m_gridSliderZ->setValue(count); + + updateSamples(); + + qDebug() << "X count =" << count; +} + +void GraphModifier::adjustZCount(int count) +{ + m_zCount = count; + + updateSamples(); + + qDebug() << "Z count =" << count; +} + +void GraphModifier::adjustXRange(int range) +{ + m_rangeX = range; + m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX); + + qDebug() << "X Range =" << range; +} + +void GraphModifier::adjustYRange(int range) +{ + m_rangeY = range; + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + + qDebug() << "Y Range =" << range; +} + +void GraphModifier::adjustZRange(int range) +{ + m_rangeZ = range; + m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ); + + qDebug() << "Z Range =" << range; +} + +void GraphModifier::adjustXMin(int min) +{ + m_minX = min; + m_graph->axisX()->setRange(m_minX, m_minX + m_rangeX); + + qDebug() << "X Minimum =" << min; +} + +void GraphModifier::adjustYMin(int min) +{ + m_minY = min; + m_graph->axisY()->setRange(m_minY, m_minY + m_rangeY); + + qDebug() << "Y Minimum =" << min; +} + +void GraphModifier::adjustZMin(int min) +{ + m_minZ = min; + m_graph->axisZ()->setRange(m_minZ, m_minZ + m_rangeZ); + + qDebug() << "Z Minimum =" << min; +} + +void GraphModifier::gradientPressed() +{ + static Q3DTheme::ColorStyle colorStyle = Q3DTheme::ColorStyleUniform; + + if (colorStyle == Q3DTheme::ColorStyleRangeGradient) { + colorStyle = Q3DTheme::ColorStyleObjectGradient; + qDebug() << "Color style: ColorStyleObjectGradient"; + } else if (colorStyle == Q3DTheme::ColorStyleObjectGradient) { + colorStyle = Q3DTheme::ColorStyleUniform; + qDebug() << "Color style: ColorStyleUniform"; + } else { + colorStyle = Q3DTheme::ColorStyleRangeGradient; + qDebug() << "Color style: ColorStyleRangeGradient"; + } + + QLinearGradient gradient; + gradient.setColorAt(0.0, Qt::black); + gradient.setColorAt(0.33, Qt::blue); + gradient.setColorAt(0.67, Qt::red); + gradient.setColorAt(1.0, Qt::yellow); + + QList gradients; + gradients << gradient; + m_graph->activeTheme()->setBaseGradients(gradients); + m_graph->activeTheme()->setColorStyle(colorStyle); + +} + +void GraphModifier::changeFont(const QFont &font) +{ + QFont newFont = font; + newFont.setPointSizeF(m_fontSize); + m_graph->activeTheme()->setFont(newFont); +} + +void GraphModifier::changeStyle() +{ + m_graph->activeTheme()->setLabelBackgroundEnabled(!m_graph->activeTheme()->isLabelBackgroundEnabled()); +} + +void GraphModifier::selectButtonClicked() +{ + QSurfaceDataProxy *proxy = m_theSeries->dataProxy(); + int row = rand() % proxy->rowCount(); + int col = rand() % proxy->columnCount(); + + m_theSeries->setSelectedPoint(QPoint(row, col)); +} + +void GraphModifier::selectedPointChanged(const QPoint &point) +{ + QString labelText = QStringLiteral("Selected row: %1, column: %2").arg(point.x()).arg(point.y()); + m_selectionInfoLabel->setText(labelText); +} + +void GraphModifier::changeTheme(int theme) +{ + m_graph->activeTheme()->setType(Q3DTheme::Theme(theme)); +} + + +void GraphModifier::flipViews() +{ + m_graph->scene()->setSecondarySubviewOnTop(!m_graph->scene()->isSecondarySubviewOnTop()); +} + +void GraphModifier::timeout() +{ + int rows = m_planeArray->size(); + int columns = m_planeArray->at(0)->size(); + + // Induce minor random jitter to the existing plane array + for (int i = 0; i < rows; i++) { + for (int j = 0; j < columns; j++) { + (*m_planeArray->at(i))[j].setX(m_planeArray->at(i)->at(j).x() + * ((float((rand() % 10) + 5.0f) / 10000.0f) + 0.999f)); + (*m_planeArray->at(i))[j].setY(m_planeArray->at(i)->at(j).y() + * ((float((rand() % 10) + 5.0f) / 1000.0f) + 0.99f) + 0.0001f); + (*m_planeArray->at(i))[j].setZ(m_planeArray->at(i)->at(j).z() + * ((float((rand() % 10) + 5.0f) / 10000.0f) + 0.999f)); + } + } + + // Reset same array to make it redraw + m_theSeries->dataProxy()->resetArray(m_planeArray); +} + +void GraphModifier::graphQueryTimeout() +{ +#ifndef QT_NO_CURSOR + m_graph->scene()->setGraphPositionQuery(m_parentWidget->mapFromGlobal(QCursor::pos())); + qDebug() << "pos: " << (m_parentWidget->mapFromGlobal(QCursor::pos())); +#else + m_graph->scene()->setGraphPositionQuery(QPoint(100, 100)); +#endif +} + +void GraphModifier::handleAxisXChanged(QValue3DAxis *axis) +{ + qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_graph->axisX()); +} + +void GraphModifier::handleAxisYChanged(QValue3DAxis *axis) +{ + qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_graph->axisY()); +} + +void GraphModifier::handleAxisZChanged(QValue3DAxis *axis) +{ + qDebug() << __FUNCTION__ << axis << axis->orientation() << (axis == m_graph->axisZ()); +} + +void GraphModifier::handleFpsChange(qreal fps) +{ + qDebug() << "FPS:" << fps; +} + +void GraphModifier::changeLabelRotation(int rotation) +{ + m_graph->axisX()->setLabelAutoRotation(float(rotation)); + m_graph->axisY()->setLabelAutoRotation(float(rotation)); + m_graph->axisZ()->setLabelAutoRotation(float(rotation)); +} + +void GraphModifier::toggleAxisTitleVisibility(bool enabled) +{ + m_graph->axisX()->setTitleVisible(enabled); + m_graph->axisY()->setTitleVisible(enabled); + m_graph->axisZ()->setTitleVisible(enabled); +} + +void GraphModifier::toggleAxisTitleFixed(bool enabled) +{ + m_graph->axisX()->setTitleFixed(enabled); + m_graph->axisY()->setTitleFixed(enabled); + m_graph->axisZ()->setTitleFixed(enabled); +} + +void GraphModifier::toggleXAscending(bool enabled) +{ + m_ascendingX = enabled; + + // Flip data array contents if necessary + foreach (QSurface3DSeries *series, m_graph->seriesList()) { + QSurfaceDataArray *array = const_cast(series->dataProxy()->array()); + const int rowCount = array->size(); + const int columnCount = array->at(0)->size(); + const bool dataAscending = array->at(0)->at(0).x() < array->at(0)->at(columnCount - 1).x(); + if (dataAscending != enabled) { + // Create new array of equal size + QSurfaceDataArray *newArray = new QSurfaceDataArray; + newArray->reserve(rowCount); + for (int i = 0; i < rowCount; i++) + newArray->append(new QSurfaceDataRow(columnCount)); + + // Flip each row + for (int i = 0; i < rowCount; i++) { + QSurfaceDataRow *oldRow = array->at(i); + QSurfaceDataRow *newRow = newArray->at(i); + for (int j = 0; j < columnCount; j++) + (*newRow)[j] = oldRow->at(columnCount - 1 - j); + } + + series->dataProxy()->resetArray(newArray); + } + } +} + +void GraphModifier::toggleZAscending(bool enabled) +{ + m_ascendingZ = enabled; + + // Flip data array contents if necessary + foreach (QSurface3DSeries *series, m_graph->seriesList()) { + QSurfaceDataArray *array = const_cast(series->dataProxy()->array()); + const int rowCount = array->size(); + const int columnCount = array->at(0)->size(); + const bool dataAscending = array->at(0)->at(0).z() < array->at(rowCount - 1)->at(0).z(); + if (dataAscending != enabled) { + // Create new array of equal size + QSurfaceDataArray *newArray = new QSurfaceDataArray; + newArray->reserve(rowCount); + for (int i = 0; i < rowCount; i++) + newArray->append(new QSurfaceDataRow(columnCount)); + + // Flip each column + for (int i = 0; i < rowCount; i++) { + QSurfaceDataRow *oldRow = array->at(rowCount - 1 - i); + QSurfaceDataRow *newRow = newArray->at(i); + for (int j = 0; j < columnCount; j++) + (*newRow)[j] = oldRow->at(j); + } + + series->dataProxy()->resetArray(newArray); + } + } +} + +void GraphModifier::togglePolar(bool enabled) +{ + m_graph->setPolar(enabled); +} + +void GraphModifier::setCameraTargetX(int value) +{ + // Value is (-100, 100), normalize + m_cameraTarget.setX(float(value) / 100.0f); + m_graph->scene()->activeCamera()->setTarget(m_cameraTarget); + qDebug() << "m_cameraTarget:" << m_cameraTarget; +} + +void GraphModifier::setCameraTargetY(int value) +{ + // Value is (-100, 100), normalize + m_cameraTarget.setY(float(value) / 100.0f); + m_graph->scene()->activeCamera()->setTarget(m_cameraTarget); + qDebug() << "m_cameraTarget:" << m_cameraTarget; +} + +void GraphModifier::setCameraTargetZ(int value) +{ + // Value is (-100, 100), normalize + m_cameraTarget.setZ(float(value) / 100.0f); + m_graph->scene()->activeCamera()->setTarget(m_cameraTarget); + qDebug() << "m_cameraTarget:" << m_cameraTarget; +} + +void GraphModifier::setGraphMargin(int value) +{ + m_graph->setMargin(qreal(value) / 100.0); + qDebug() << "Setting margin:" << m_graph->margin() << value; +} + +void GraphModifier::resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, float maxX) +{ + m_axisMinSliderX->setValue(minX); + m_axisMinSliderZ->setValue(minZ); + m_axisRangeSliderX->setValue(maxX - minX); + m_axisRangeSliderZ->setValue(maxZ - minZ); + + m_theSeries->dataProxy()->resetArray(array); +} + +void GraphModifier::changeShadowQuality(int quality) +{ + QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality); + m_graph->setShadowQuality(sq); +} + +void GraphModifier::changeSelectionMode(int mode) +{ + QComboBox *comboBox = qobject_cast(sender()); + if (comboBox) { + int flags = comboBox->itemData(mode).toInt(); + m_graph->setSelectionMode(QAbstract3DGraph::SelectionFlags(flags)); + } +} + +void GraphModifier::changeRow() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Generating new values to a row at random pos"; + 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); + 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 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)); + } + + m_theSeries->dataProxy()->setRow(int(i), newRow); + } else { +#ifdef MULTI_SERIES + static int changeRowSeries = 0; + qDebug() << "Generating new values to a row at random pos for series " << changeRowSeries; + + int row = rand() % m_zCount; + QSurfaceDataRow *newRow = createMultiRow(row, changeRowSeries, true); + if (m_ascendingZ) + m_multiseries[changeRowSeries]->dataProxy()->setRow(row, newRow); + else + m_multiseries[changeRowSeries]->dataProxy()->setRow((m_zCount - 1) - row, newRow); + + changeRowSeries++; + if (changeRowSeries > 3) + changeRowSeries = 0; +#else + qDebug() << "Change row function active only for SqrtSin"; +#endif + } +} + +QSurfaceDataRow *GraphModifier::createMultiRow(int row, int series, bool change) +{ + int full = m_limitX * m_limitZ; + float i = float(row); + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[series]; + if (m_ascendingX) { + for (int j = 0; j < m_xCount; j++) { + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[series]; + float angle = (z * x) / float(full) * 1.57f; + float y = qSin(angle * float(qPow(1.3f, series))) + 0.2f * float(change) + 1.1f *series; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + } else { + for (int j = m_xCount - 1; j >= 0 ; j--) { + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[series]; + float angle = (z * x) / float(full) * 1.57f; + float y = qSin(angle * float(qPow(1.3f, series))) + 0.2f * float(change) + 1.1f *series; + (*newRow)[(m_xCount - 1) - j].setPosition(QVector3D(x, y, z)); + } + } + + return newRow; +} + +void GraphModifier::populateRisingSeries(QSurface3DSeries *series, int rows, int columns, + float minValue, float maxValue, bool ascendingX, + bool ascendingZ) +{ + QSurfaceDataArray *dataArray = new QSurfaceDataArray; + dataArray->reserve(rows); + float range = maxValue - minValue; + int arraySize = rows * columns; + for (int i = 0; i < rows; i++) { + QSurfaceDataRow *dataRow = new QSurfaceDataRow(columns); + for (int j = 0; j < columns; j++) { + float xValue = ascendingX ? float(j) : float(columns - j - 1); + float yValue = minValue + (range * i * j / arraySize); + float zValue = ascendingZ ? float(i) : float(rows - i - 1); + (*dataRow)[j].setPosition(QVector3D(xValue, yValue, zValue)); + } + dataArray->append(dataRow); + } + series->dataProxy()->resetArray(dataArray); + +} + +void GraphModifier::changeRows() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Generating new values to 3 rows from random pos"; + + 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); + float start = float(rand() % (m_zCount - 3)); + + QSurfaceDataArray dataArray; + + for (float i = start; i < (start + 3.0f); i++) { + 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 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)); + } + dataArray.append(newRow); + } + + m_theSeries->dataProxy()->setRows(int(start), dataArray); + } else { +#ifdef MULTI_SERIES + static int changeRowSeries = 0; + qDebug() << "Generating new values for 3 rows at random pos for series " << changeRowSeries; + + int row = rand() % (m_zCount - 3); + QSurfaceDataArray dataArray; + for (int i = 0; i < 3; i++) { + QSurfaceDataRow *newRow = createMultiRow(row + i, changeRowSeries, true); + dataArray.append(newRow); + } + m_multiseries[changeRowSeries]->dataProxy()->setRows(row, dataArray); + + changeRowSeries++; + if (changeRowSeries > 3) + changeRowSeries = 0; +#else + qDebug() << "Change row function active only for SqrtSin"; +#endif + } +} + +void GraphModifier::changeItem() +{ + if (m_activeSample == GraphModifier::SqrtSin) { + qDebug() << "Generating new values for an item at random pos"; + 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); + float i = float(rand() % m_zCount); + float j = float(rand() % m_xCount); + + 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; + QSurfaceDataItem newItem(QVector3D(x, y, z)); + + m_theSeries->dataProxy()->setItem(int(i), int(j), newItem); + } else { +#ifdef MULTI_SERIES + static int changeItemSeries = 0; + int full = m_limitX * m_limitZ; + float i = float(rand() % m_zCount); + float j = float(rand() % m_xCount); + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[changeItemSeries]; + float z = float(i) - m_limitZ + 0.5f + m_multiSampleOffsetZ[changeItemSeries]; + float angle = (z * x) / float(full) * 1.57f; + float y = qSin(angle * float(qPow(1.3f, changeItemSeries))) + 0.2f + 1.1f *changeItemSeries; + QSurfaceDataItem newItem(QVector3D(x, y, z)); + + if (m_ascendingZ && m_ascendingX) + m_multiseries[changeItemSeries]->dataProxy()->setItem(int(i), int(j), newItem); + else if (!m_ascendingZ && m_ascendingX) + m_multiseries[changeItemSeries]->dataProxy()->setItem(m_zCount - 1 - int(i), int(j), newItem); + else if (m_ascendingZ && !m_ascendingX) + m_multiseries[changeItemSeries]->dataProxy()->setItem(int(i), m_xCount - 1 - int(j), newItem); + else + m_multiseries[changeItemSeries]->dataProxy()->setItem(m_zCount - 1 - int(i), m_xCount - 1 - int(j), newItem); + //m_multiseries[changeItemSeries]->setSelectedPoint(QPoint(i, j)); + changeItemSeries++; + if (changeItemSeries > 3) + changeItemSeries = 0; +#else + qDebug() << "Change item function active only for SqrtSin"; +#endif + } +} + +void GraphModifier::changeMultipleRows() +{ + for (int i = 0; i < 30; i++) + changeRow(); +} + +void GraphModifier::changeMultipleItem() +{ + for (int i = 0; i < 30; i++) + 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 { +#ifdef MULTI_SERIES + qDebug() << "Adding a row into series 3"; + int full = m_limitX * m_limitZ; + int series = 2; + + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = float(m_addRowCounter) - m_limitZ + 0.5f + m_multiSampleOffsetZ[series]; + for (int j = 0; j < m_xCount; j++) { + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[series]; + float angle = float(z * x) / float(full) * 1.57f; + (*newRow)[j].setPosition(QVector3D(x, qSin(angle *float(qPow(1.3f, series))) + 1.1f * series, z)); + } + m_addRowCounter++; + + m_multiseries[series]->dataProxy()->addRow(newRow); +#else + qDebug() << "Add row function active only for SqrtSin"; +#endif + } +} + +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 { +#ifdef MULTI_SERIES + qDebug() << "Adding 3 rows into series 3"; + int changedSeries = 2; + + QSurfaceDataArray dataArray; + for (int i = 0; i < 3; i++) { + QSurfaceDataRow *newRow = createMultiRow(m_addRowCounter, changedSeries, false); + dataArray.append(newRow); + m_addRowCounter++; + } + + m_multiseries[changedSeries]->dataProxy()->addRows(dataArray); +#else + qDebug() << "Add rows function active only for SqrtSin"; +#endif + } +} + +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 { +#ifdef MULTI_SERIES + qDebug() << "Inserting a row into series 3"; + int full = m_limitX * m_limitZ; + int changedSeries = 2; + + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = float(m_insertTestZPos) - m_limitZ + m_multiSampleOffsetZ[changedSeries]; + for (int j = 0; j < m_xCount; j++) { + float x = float(j) - m_limitX + m_multiSampleOffsetX[changedSeries]; + float angle = (z * x) / float(full) * 1.57f; + (*newRow)[j].setPosition(QVector3D(x + 0.5f, + qSin(angle * float(qPow(1.3f, changedSeries))) + 1.2f * changedSeries, + z + 1.0f)); + } + + m_insertTestZPos++; + + m_multiseries[2]->dataProxy()->insertRow(m_insertTestIndexPos, newRow); + m_insertTestIndexPos += 2; +#else + qDebug() << "Insert row function active only for SqrtSin"; +#endif + } +} + +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 { +#ifdef MULTI_SERIES + qDebug() << "Inserting 3 rows into series 3"; + int full = m_limitX * m_limitZ; + int changedSeries = 2; + + QSurfaceDataArray dataArray; + float zAdd = 0.25f; + for (int i = 0; i < 3; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(m_xCount); + float z = float(m_insertTestZPos) - m_limitZ + 0.5f + zAdd + m_multiSampleOffsetZ[changedSeries]; + for (int j = 0; j < m_xCount; j++) { + float x = float(j) - m_limitX + 0.5f + m_multiSampleOffsetX[changedSeries]; + float angle = (z * x) / float(full) * 1.57f; + float y = qSin(angle * float(qPow(1.3f, changedSeries))) + + 1.2f * changedSeries; + (*newRow)[j].setPosition(QVector3D(x, y, z)); + } + zAdd += 0.25f; + dataArray.append(newRow); + } + + m_insertTestZPos++; + + m_multiseries[2]->dataProxy()->insertRows(m_insertTestIndexPos, dataArray); + m_insertTestIndexPos += 4; +#else + qDebug() << "Insert rows function active only for SqrtSin"; +#endif + } +} + +void GraphModifier::removeRow() +{ + qDebug() << "Remove an arbitrary row"; + if (m_zCount < 1) + return; + + int row = rand() % m_zCount; + +#ifdef MULTI_SERIES + int series = rand() % 4; + m_multiseries[series]->dataProxy()->removeRows(row, 1); +#else + m_theSeries->dataProxy()->removeRows(row, 1); +#endif + m_zCount--; +} + +void GraphModifier::resetArray() +{ + qDebug() << "Reset series data array"; + int rows = 10; + int columns = 10; + float randFactor = float(rand() % 100) / 100.0f; + QSurfaceDataArray *planeArray = new QSurfaceDataArray; + planeArray->reserve(rows); + + for (int i = 0; i < rows; i++) { + planeArray->append(new QSurfaceDataRow); + (*planeArray)[i]->resize(columns); + for (int j = 0; j < columns; j++) { + (*planeArray->at(i))[j].setX(float(j) * randFactor); + (*planeArray->at(i))[j].setY(float(i - j) * randFactor); + (*planeArray->at(i))[j].setZ(float(i)); + } + } + +#ifdef MULTI_SERIES + int series = rand() % 4; + m_multiseries[series]->dataProxy()->resetArray(planeArray); +#else + m_theSeries->dataProxy()->resetArray(planeArray); +#endif +} + +void GraphModifier::resetArrayEmpty() +{ + QSurfaceDataArray *emptyArray = new QSurfaceDataArray; +#ifdef MULTI_SERIES + int series = rand() % 4; + m_multiseries[series]->dataProxy()->resetArray(emptyArray); +#else + m_theSeries->dataProxy()->resetArray(emptyArray); +#endif +} + +void GraphModifier::massiveDataTest() +{ + static int testPhase = 0; + static const int cacheSize = 1000; + const int columns = 200; + const int rows = 200000; + const int visibleRows = 200; + const float yRangeMin = 0.0f; + const float yRangeMax = 1.0f; + const float yRangeMargin = 0.05f; + static QTimer *massiveTestTimer = 0; + static QSurface3DSeries *series = new QSurface3DSeries; + + // To speed up massive array creation, we generate a smaller cache array + // and copy rows from that to our main array + if (!m_massiveTestCacheArray.size()) { + m_massiveTestCacheArray.reserve(cacheSize); + float minY = yRangeMin + yRangeMargin; + float maxY = yRangeMax - yRangeMargin; + float rowBase = minY; + float direction = 1.0f; + for (int i = 0; i < cacheSize; i++) { + m_massiveTestCacheArray.append(new QSurfaceDataRow); + m_massiveTestCacheArray[i]->resize(columns); + rowBase += direction * (float(rand() % 3) / 100.0f); + if (rowBase > maxY) { + rowBase = maxY; + direction = -1.0f; + } else if (rowBase < minY) { + rowBase = minY; + direction = 1.0f; + } + for (int j = 0; j < columns; j++) { + float randFactor = float(rand() % 100) / (100 / yRangeMargin); + (*m_massiveTestCacheArray.at(i))[j].setX(float(j)); + (*m_massiveTestCacheArray.at(i))[j].setY(rowBase + randFactor); + // Z value is irrelevant, we replace it anyway when we take row to use + } + } + massiveTestTimer = new QTimer; + } + + switch (testPhase) { + case 0: { + qDebug() << __FUNCTION__ << testPhase << ": Setting the graph up..."; + QValue3DAxis *xAxis = new QValue3DAxis(); + QValue3DAxis *yAxis = new QValue3DAxis(); + QValue3DAxis *zAxis = new QValue3DAxis(); + xAxis->setRange(0.0f, float(columns)); + yAxis->setRange(yRangeMin, yRangeMax); + zAxis->setRange(0.0f, float(visibleRows)); + xAxis->setSegmentCount(1); + yAxis->setSegmentCount(1); + zAxis->setSegmentCount(1); + m_graph->setMeasureFps(true); + m_graph->setAxisX(xAxis); + m_graph->setAxisY(yAxis); + m_graph->setAxisZ(zAxis); + m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetRight); + m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone); + foreach (QAbstract3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(static_cast(series)); + + qDebug() << __FUNCTION__ << testPhase << ": Creating massive array..." + << rows << "x" << columns; + // Reset to zero first to avoid having memory allocated for two massive arrays at the same + // time on the second and subsequent runs. + series->dataProxy()->resetArray(0); + QSurfaceDataArray *massiveArray = new QSurfaceDataArray; + massiveArray->reserve(rows); + + for (int i = 0; i < rows; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(*m_massiveTestCacheArray.at(i % cacheSize)); + for (int j = 0; j < columns; j++) + (*newRow)[j].setZ(float(i)); + massiveArray->append(newRow); + } + qDebug() << __FUNCTION__ << testPhase << ": Massive array creation finished!"; + + series->dataProxy()->resetArray(massiveArray); + m_graph->addSeries(series); + break; + } + case 1: { + qDebug() << __FUNCTION__ << testPhase << ": Scroll"; + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &GraphModifier::massiveTestScroll); + massiveTestTimer->start(16); + break; + } + case 2: { + qDebug() << __FUNCTION__ << testPhase << ": Append and scroll"; + massiveTestTimer->stop(); + QObject::disconnect(massiveTestTimer, 0, this, 0); + QObject::connect(massiveTestTimer, &QTimer::timeout, this, + &GraphModifier::massiveTestAppendAndScroll); + m_graph->axisZ()->setRange(rows - visibleRows, rows); + massiveTestTimer->start(16); + break; + } + default: + QObject::disconnect(massiveTestTimer, 0, this, 0); + massiveTestTimer->stop(); + qDebug() << __FUNCTION__ << testPhase << ": Resetting the test"; + testPhase = -1; + } + testPhase++; +} + +void GraphModifier::massiveTestScroll() +{ + const int scrollAmount = 20; + int maxRows = m_graph->seriesList().at(0)->dataProxy()->rowCount(); + int min = m_graph->axisZ()->min() + scrollAmount; + int max = m_graph->axisZ()->max() + scrollAmount; + if (max >= maxRows) { + max = max - min; + min = 0; + } + m_graph->axisZ()->setRange(min, max); +} + +void GraphModifier::massiveTestAppendAndScroll() +{ + const int addedRows = 50; + int maxRows = m_graph->seriesList().at(0)->dataProxy()->rowCount(); + int columns = m_graph->seriesList().at(0)->dataProxy()->columnCount(); + + QSurfaceDataArray appendArray; + appendArray.reserve(addedRows); + for (int i = 0; i < addedRows; i++) { + QSurfaceDataRow *newRow = new QSurfaceDataRow(*m_massiveTestCacheArray.at((i + maxRows) % 1000)); + for (int j = 0; j < columns; j++) + (*newRow)[j].setZ(float(maxRows + i)); + appendArray.append(newRow); + } + m_graph->seriesList().at(0)->dataProxy()->addRows(appendArray); + int min = m_graph->axisZ()->min() + addedRows; + int max = m_graph->axisZ()->max() + addedRows; + m_graph->axisZ()->setRange(min, max); +} + +void GraphModifier::testAxisReverse() +{ + static int counter = 0; + const int rowCount = 16; + const int colCount = 16; + static QSurface3DSeries *series0 = 0; + static QSurface3DSeries *series1 = 0; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test"; + foreach (QSurface3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(series); + foreach (QValue3DAxis *axis, m_graph->axes()) + m_graph->releaseAxis(axis); + delete series0; + delete series1; + series0 = new QSurface3DSeries; + series1 = new QSurface3DSeries; + populateRisingSeries(series0, rowCount, colCount, 0.0f, 50.0f, true, true); + populateRisingSeries(series1, rowCount, colCount, -20.0f, 30.0f, true, true); + m_graph->axisX()->setRange(0.0f, 10.0f); + m_graph->axisY()->setRange(-20.0f, 50.0f); + m_graph->axisZ()->setRange(5.0f, 15.0f); + m_graph->addSeries(series0); + m_graph->addSeries(series1); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Reverse X axis"; + m_graph->axisX()->setReversed(true); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Reverse Y axis"; + m_graph->axisY()->setReversed(true); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Reverse Z axis"; + m_graph->axisZ()->setReversed(true); + } + break; + case 4: { + qDebug() << __FUNCTION__ << counter << "Return all axes to normal"; + m_graph->axisX()->setReversed(false); + m_graph->axisY()->setReversed(false); + m_graph->axisZ()->setReversed(false); + } + break; + case 5: { + qDebug() << __FUNCTION__ << counter << "Reverse all axes"; + m_graph->axisX()->setReversed(true); + m_graph->axisY()->setReversed(true); + m_graph->axisZ()->setReversed(true); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + +void GraphModifier::testDataOrdering() +{ + static int counter = 0; + const int rowCount = 20; + const int colCount = 20; + static QSurface3DSeries *series0 = 0; + static QSurface3DSeries *series1 = 0; + const float series0min = 0.0f; + const float series0max = 50.0f; + const float series1min = -20.0f; + const float series1max = 30.0f; + + switch (counter) { + case 0: { + qDebug() << __FUNCTION__ << counter << "Setup test - both ascending"; + foreach (QSurface3DSeries *series, m_graph->seriesList()) + m_graph->removeSeries(series); + foreach (QValue3DAxis *axis, m_graph->axes()) + m_graph->releaseAxis(axis); + delete series0; + delete series1; + series0 = new QSurface3DSeries; + series1 = new QSurface3DSeries; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, true, true); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, true, true); + m_graph->axisX()->setRange(5.0f, 15.0f); + m_graph->axisY()->setRange(-20.0f, 50.0f); + m_graph->axisZ()->setRange(5.0f, 15.0f); + m_graph->addSeries(series0); + m_graph->addSeries(series1); + } + break; + case 1: { + qDebug() << __FUNCTION__ << counter << "Ascending X, descending Z"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, true, false); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, true, false); + } + break; + case 2: { + qDebug() << __FUNCTION__ << counter << "Descending X, ascending Z"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, false, true); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, false, true); + } + break; + case 3: { + qDebug() << __FUNCTION__ << counter << "Both descending"; + populateRisingSeries(series0, rowCount, colCount, series0min, series0max, false, false); + populateRisingSeries(series1, rowCount, colCount, series1min, series1max, false, false); + } + break; + default: + qDebug() << __FUNCTION__ << "Resetting test"; + counter = -1; + } + counter++; +} + +void GraphModifier::changeMesh() +{ + static int model = 0; + switch (model) { + case 0: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCylinder); + m_graph->seriesList().at(0)->setMeshSmooth(false); + break; + case 1: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCylinder); + m_graph->seriesList().at(0)->setMeshSmooth(true); + break; + case 2: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCone); + m_graph->seriesList().at(0)->setMeshSmooth(false); + break; + case 3: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshCone); + m_graph->seriesList().at(0)->setMeshSmooth(true); + break; + case 4: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBar); + m_graph->seriesList().at(0)->setMeshSmooth(false); + break; + case 5: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBar); + m_graph->seriesList().at(0)->setMeshSmooth(true); + break; + case 6: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshPyramid); + m_graph->seriesList().at(0)->setMeshSmooth(false); + break; + case 7: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshPyramid); + m_graph->seriesList().at(0)->setMeshSmooth(true); + break; + case 8: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBevelBar); + m_graph->seriesList().at(0)->setMeshSmooth(false); + break; + case 9: + m_graph->seriesList().at(0)->setMesh(QAbstract3DSeries::MeshBevelBar); + m_graph->seriesList().at(0)->setMeshSmooth(true); + break; + } + model++; + if (model > 9) + model = 0; +} + +void GraphModifier::updateSamples() +{ + switch (m_activeSample) { + case SqrtSin: + toggleSqrtSin(true); + break; + + case Plane: + togglePlane(true); + break; + + default: + break; + } +} + +void GraphModifier::setAspectRatio(int ratio) +{ + qreal aspectRatio = qreal(ratio) / 10.0; + m_graph->setAspectRatio(aspectRatio); +} + +void GraphModifier::setHorizontalAspectRatio(int ratio) +{ + qreal aspectRatio = qreal(ratio) / 100.0; + m_graph->setHorizontalAspectRatio(aspectRatio); +} + +void GraphModifier::setSurfaceTexture(bool enabled) +{ + if (enabled) + m_multiseries[3]->setTexture(QImage(":/maps/mapimage")); + else + m_multiseries[3]->setTexture(QImage()); +} diff --git a/tests/manual/surfacetest/graphmodifier.h b/tests/manual/surfacetest/graphmodifier.h new file mode 100644 index 00000000..e9260aac --- /dev/null +++ b/tests/manual/surfacetest/graphmodifier.h @@ -0,0 +1,204 @@ +/****************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Data Visualization module. +** +** $QT_BEGIN_LICENSE:COMM$ +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** $QT_END_LICENSE$ +** +******************************************************************************/ + +#ifndef GRAPHMODIFIER_H +#define GRAPHMODIFIER_H + +#include +#include +#include +#include +#include +#include +#include + +#define MULTI_SERIES + +using namespace QtDataVisualization; + +class GraphModifier : public QObject +{ + Q_OBJECT +public: + enum Samples { + SqrtSin = 1, + Plane, + Map + }; + + explicit GraphModifier(Q3DSurface *graph, QWidget *parentWidget); + ~GraphModifier(); + + void toggleSeries1(bool enabled); + void toggleSeries2(bool enabled); + void toggleSeries3(bool enabled); + void toggleSeries4(bool enabled); + void toggleSmooth(bool enabled); + void toggleSurfaceGrid(bool enable); + void toggleSurface(bool enable); + void toggleSeriesVisible(bool enable); + void toggleSmoothS2(bool enabled); + void toggleSurfaceGridS2(bool enable); + void toggleSurfaceS2(bool enable); + void toggleSeries2Visible(bool enable); + void toggleSmoothS3(bool enabled); + void toggleSurfaceGridS3(bool enable); + void toggleSurfaceS3(bool enable); + void toggleSeries3Visible(bool enable); + void toggleSmoothS4(bool enabled); + void toggleSurfaceGridS4(bool enable); + void toggleSurfaceS4(bool enable); + void toggleSeries4Visible(bool enable); + + void toggleSqrtSin(bool enable); + void togglePlane(bool enable); + void setHeightMapData(bool enable); + void toggleGridSliderLock(bool enable); + void setGridSliderX(QSlider *slider) { m_gridSliderX = slider; } + void setGridSliderZ(QSlider *slider) { m_gridSliderZ = slider; } + void setAxisRangeSliderX(QSlider *slider) { m_axisRangeSliderX = slider; } + void setAxisRangeSliderZ(QSlider *slider) { m_axisRangeSliderZ = slider; } + void setAxisMinSliderX(QSlider *slider) { m_axisMinSliderX = slider; } + void setAxisMinSliderZ(QSlider *slider) { m_axisMinSliderZ = slider; } + void setSeries1CB(QCheckBox *cb) { m_series1CB = cb; } + void setSeries2CB(QCheckBox *cb) { m_series2CB = cb; } + void setSeries3CB(QCheckBox *cb) { m_series3CB = cb; } + void setSeries4CB(QCheckBox *cb) { m_series4CB = cb; } + void adjustXCount(int count); + void adjustZCount(int count); + void adjustXRange(int range); + void adjustYRange(int range); + void adjustZRange(int range); + void adjustXMin(int min); + void adjustYMin(int min); + void adjustZMin(int min); + void updateSamples(); + void gradientPressed(); + void changeFont(const QFont &font); + void changeStyle(); + void selectButtonClicked(); + void setSelectionInfoLabel(QLabel *label) {m_selectionInfoLabel = label; } + void selectedPointChanged(const QPoint &point); + void changeRow(); + void changeRows(); + void changeMesh(); + void changeItem(); + void changeMultipleItem(); + void changeMultipleRows(); + void addRow(); + void addRows(); + void insertRow(); + void insertRows(); + void removeRow(); + void resetArray(); + void resetArrayEmpty(); + void massiveDataTest(); + void massiveTestScroll(); + void massiveTestAppendAndScroll(); + void testAxisReverse(); + void testDataOrdering(); + void setAspectRatio(int ratio); + void setHorizontalAspectRatio(int ratio); + void setSurfaceTexture(bool enabled); + +public Q_SLOTS: + void changeShadowQuality(int quality); + void changeTheme(int theme); + void flipViews(); + void changeSelectionMode(int mode); + void timeout(); + void graphQueryTimeout(); + + void handleAxisXChanged(QValue3DAxis *axis); + void handleAxisYChanged(QValue3DAxis *axis); + void handleAxisZChanged(QValue3DAxis *axis); + void handleFpsChange(qreal fps); + void changeLabelRotation(int rotation); + void toggleAxisTitleVisibility(bool enabled); + void toggleAxisTitleFixed(bool enabled); + void toggleXAscending(bool enabled); + void toggleZAscending(bool enabled); + void togglePolar(bool enabled); + void setCameraTargetX(int value); + void setCameraTargetY(int value); + void setCameraTargetZ(int value); + void setGraphMargin(int value); + +private: + void fillSeries(); + void resetArrayAndSliders(QSurfaceDataArray *array, float minZ, float maxZ, float minX, + float maxX); + QSurfaceDataRow *createMultiRow(int row, int series, bool change); + void populateRisingSeries(QSurface3DSeries *series, int rows, int columns, float minValue, + float maxValue, bool ascendingX, bool ascendingZ); + + Q3DSurface *m_graph; + QSurface3DSeries *m_multiseries[4]; + QSurface3DSeries *m_series1; + QSurface3DSeries *m_series2; + QSurface3DSeries *m_series3; + QSurface3DSeries *m_series4; + QSlider *m_gridSliderX; + QSlider *m_gridSliderZ; + QSlider *m_axisRangeSliderX; + QSlider *m_axisRangeSliderZ; + QSlider *m_axisMinSliderX; + QSlider *m_axisMinSliderZ; + QCheckBox *m_series1CB; + QCheckBox *m_series2CB; + QCheckBox *m_series3CB; + QCheckBox *m_series4CB; + bool m_gridSlidersLocked; + int m_xCount; + int m_zCount; + int m_activeSample; + int m_fontSize; + float m_rangeX; + float m_rangeY; + float m_rangeZ; + float m_minX; + float m_minY; + float m_minZ; + int m_addRowCounter; + int m_insertTestZPos; + int m_insertTestIndexPos; + QTimer m_timer; + QSurfaceDataArray *m_planeArray; + QLabel *m_selectionInfoLabel; + QSurface3DSeries *m_theSeries; + QSurface3DSeries::DrawFlags m_drawMode; + QSurface3DSeries::DrawFlags m_drawMode2; + QSurface3DSeries::DrawFlags m_drawMode3; + QSurface3DSeries::DrawFlags m_drawMode4; + float m_limitX; + float m_limitZ; + float m_offset; + float m_multiSampleOffsetX[4]; + float m_multiSampleOffsetZ[4]; + QSurfaceDataArray m_massiveTestCacheArray; + QVector3D m_cameraTarget; + QWidget *m_parentWidget; + QTimer m_graphPositionQueryTimer; + bool m_ascendingX; + bool m_ascendingZ; +}; + +#endif diff --git a/tests/manual/surfacetest/main.cpp b/tests/manual/surfacetest/main.cpp new file mode 100644 index 00000000..74bf78aa --- /dev/null +++ b/tests/manual/surfacetest/main.cpp @@ -0,0 +1,748 @@ +/****************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Data Visualization module. +** +** $QT_BEGIN_LICENSE:COMM$ +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** $QT_END_LICENSE$ +** +******************************************************************************/ + +#include "graphmodifier.h" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace QtDataVisualization; + +const int initialTheme = 4; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QWidget *widget = new QWidget; + QHBoxLayout *hLayout = new QHBoxLayout(widget); + QVBoxLayout *vLayout = new QVBoxLayout(); + QVBoxLayout *vLayout2 = new QVBoxLayout(); + QVBoxLayout *vLayout3 = new QVBoxLayout(); + vLayout->setAlignment(Qt::AlignTop); + vLayout2->setAlignment(Qt::AlignTop); + vLayout3->setAlignment(Qt::AlignTop); + + Q3DSurface *surfaceGraph = new Q3DSurface(); + QSize screenSize = surfaceGraph->screen()->size(); + + // Set to default, should be same as the initial on themeList + surfaceGraph->activeTheme()->setType(Q3DTheme::Theme(initialTheme)); + + QWidget *container = QWidget::createWindowContainer(surfaceGraph); + container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 4)); + container->setMaximumSize(screenSize); + container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + container->setFocusPolicy(Qt::StrongFocus); + + widget->setWindowTitle(QStringLiteral("Surface tester")); + + hLayout->addWidget(container, 1); + hLayout->addLayout(vLayout); + hLayout->addLayout(vLayout2); + hLayout->addLayout(vLayout3); + + QCheckBox *smoothCB = new QCheckBox(widget); + smoothCB->setText(QStringLiteral("Flat Surface")); + smoothCB->setChecked(true); + + QCheckBox *surfaceGridCB = new QCheckBox(widget); + surfaceGridCB->setText(QStringLiteral("Surface Grid")); + surfaceGridCB->setChecked(true); + + QCheckBox *surfaceCB = new QCheckBox(widget); + surfaceCB->setText(QStringLiteral("Surface Visible")); + surfaceCB->setChecked(true); + + QCheckBox *seriesVisibleCB = new QCheckBox(widget); + seriesVisibleCB->setText(QStringLiteral("Series Visible")); + seriesVisibleCB->setChecked(true); + +#ifdef MULTI_SERIES + smoothCB->setText(QStringLiteral("S1 Flat Surface")); + surfaceGridCB->setText(QStringLiteral("S1 Surface Grid")); + surfaceCB->setText(QStringLiteral("S1 Surface Visible")); + seriesVisibleCB->setText(QStringLiteral("Series 1 Visible")); + + QCheckBox *smoothS2CB = new QCheckBox(widget); + smoothS2CB->setText(QStringLiteral("S2 Flat Surface")); + smoothS2CB->setChecked(true); + + QCheckBox *surfaceGridS2CB = new QCheckBox(widget); + surfaceGridS2CB->setText(QStringLiteral("S2 Surface Grid")); + surfaceGridS2CB->setChecked(true); + + QCheckBox *surfaceS2CB = new QCheckBox(widget); + surfaceS2CB->setText(QStringLiteral("S2 Surface Visible")); + surfaceS2CB->setChecked(true); + + QCheckBox *series2VisibleCB = new QCheckBox(widget); + series2VisibleCB->setText(QStringLiteral("Series 2 Visible")); + series2VisibleCB->setChecked(true); + + QCheckBox *smoothS3CB = new QCheckBox(widget); + smoothS3CB->setText(QStringLiteral("S3 Flat Surface")); + smoothS3CB->setChecked(true); + + QCheckBox *surfaceGridS3CB = new QCheckBox(widget); + surfaceGridS3CB->setText(QStringLiteral("S3 Surface Grid")); + surfaceGridS3CB->setChecked(true); + + QCheckBox *surfaceS3CB = new QCheckBox(widget); + surfaceS3CB->setText(QStringLiteral("S3 Surface Visible")); + surfaceS3CB->setChecked(true); + + QCheckBox *series3VisibleCB = new QCheckBox(widget); + series3VisibleCB->setText(QStringLiteral("Series 3 Visible")); + series3VisibleCB->setChecked(true); + + QCheckBox *smoothS4CB = new QCheckBox(widget); + smoothS4CB->setText(QStringLiteral("S4 Flat Surface")); + smoothS4CB->setChecked(true); + + QCheckBox *surfaceGridS4CB = new QCheckBox(widget); + surfaceGridS4CB->setText(QStringLiteral("S4 Surface Grid")); + surfaceGridS4CB->setChecked(true); + + QCheckBox *surfaceS4CB = new QCheckBox(widget); + surfaceS4CB->setText(QStringLiteral("S4 Surface Visible")); + surfaceS4CB->setChecked(true); + + QCheckBox *series4VisibleCB = new QCheckBox(widget); + series4VisibleCB->setText(QStringLiteral("Series 4 Visible")); + series4VisibleCB->setChecked(true); + + QCheckBox *series1CB = new QCheckBox(widget); + series1CB->setText(QStringLiteral("Series 1")); + + QCheckBox *series2CB = new QCheckBox(widget); + series2CB->setText(QStringLiteral("Series 2")); + + QCheckBox *series3CB = new QCheckBox(widget); + series3CB->setText(QStringLiteral("Series 3")); + + QCheckBox *series4CB = new QCheckBox(widget); + series4CB->setText(QStringLiteral("Series 4")); +#else + //QCheckBox *sqrtSinCB = new QCheckBox(widget); + QRadioButton *sqrtSinCB = new QRadioButton(widget); + sqrtSinCB->setText(QStringLiteral("Sqrt & Sin")); + sqrtSinCB->setChecked(false); + + QRadioButton *planeCB = new QRadioButton(widget); + planeCB->setText(QStringLiteral("Plane")); + planeCB->setChecked(false); + + QRadioButton *heightMapCB = new QRadioButton(widget); + heightMapCB->setText(QStringLiteral("Height map")); + heightMapCB->setChecked(false); + + QCheckBox *gridSlidersLockCB = new QCheckBox(widget); + gridSlidersLockCB->setText(QStringLiteral("Lock")); + gridSlidersLockCB->setChecked(false); + + QSlider *gridSliderX = new QSlider(Qt::Horizontal, widget); + gridSliderX->setTickInterval(1); + gridSliderX->setMinimum(2); + gridSliderX->setValue(30); + gridSliderX->setMaximum(200); + gridSliderX->setEnabled(true); + QSlider *gridSliderZ = new QSlider(Qt::Horizontal, widget); + gridSliderZ->setTickInterval(1); + gridSliderZ->setMinimum(2); + gridSliderZ->setValue(30); + gridSliderZ->setMaximum(200); + gridSliderZ->setEnabled(true); +#endif + + QSlider *axisRangeSliderX = new QSlider(Qt::Horizontal, widget); + axisRangeSliderX->setTickInterval(1); + axisRangeSliderX->setMinimum(1); + axisRangeSliderX->setValue(34); + axisRangeSliderX->setMaximum(100); + axisRangeSliderX->setEnabled(true); + QSlider *axisRangeSliderY = new QSlider(Qt::Horizontal, widget); + axisRangeSliderY->setTickInterval(1); + axisRangeSliderY->setMinimum(1); + axisRangeSliderY->setValue(16); + axisRangeSliderY->setMaximum(100); + axisRangeSliderY->setEnabled(true); + QSlider *axisRangeSliderZ = new QSlider(Qt::Horizontal, widget); + axisRangeSliderZ->setTickInterval(1); + axisRangeSliderZ->setMinimum(1); + axisRangeSliderZ->setValue(34); + axisRangeSliderZ->setMaximum(100); + axisRangeSliderZ->setEnabled(true); + + QSlider *axisMinSliderX = new QSlider(Qt::Horizontal, widget); + axisMinSliderX->setTickInterval(1); + axisMinSliderX->setMinimum(-100); + axisMinSliderX->setValue(-17); + axisMinSliderX->setMaximum(100); + axisMinSliderX->setEnabled(true); + QSlider *axisMinSliderY = new QSlider(Qt::Horizontal, widget); + axisMinSliderY->setTickInterval(1); + axisMinSliderY->setMinimum(-100); + axisMinSliderY->setValue(-8); + axisMinSliderY->setMaximum(100); + axisMinSliderY->setEnabled(true); + QSlider *axisMinSliderZ = new QSlider(Qt::Horizontal, widget); + axisMinSliderZ->setTickInterval(1); + axisMinSliderZ->setMinimum(-100); + axisMinSliderZ->setValue(-17); + axisMinSliderZ->setMaximum(100); + axisMinSliderZ->setEnabled(true); + + QSlider *aspectRatioSlider = new QSlider(Qt::Horizontal, widget); + aspectRatioSlider->setMinimum(1); + aspectRatioSlider->setValue(20); + aspectRatioSlider->setMaximum(100); + + QSlider *horizontalAspectRatioSlider = new QSlider(Qt::Horizontal, widget); + horizontalAspectRatioSlider->setMinimum(0); + horizontalAspectRatioSlider->setValue(0); + horizontalAspectRatioSlider->setMaximum(300); + + QLinearGradient gr(0, 0, 100, 1); + gr.setColorAt(0.0, Qt::black); + gr.setColorAt(0.33, Qt::blue); + gr.setColorAt(0.67, Qt::red); + gr.setColorAt(1.0, Qt::yellow); + QPixmap pm(100, 24); + QPainter pmp(&pm); + pmp.setBrush(QBrush(gr)); + pmp.setPen(Qt::NoPen); + pmp.drawRect(0, 0, 100, 24); + QPushButton *colorPB = new QPushButton(); + colorPB->setIcon(QIcon(pm)); + colorPB->setIconSize(QSize(100, 24)); + + QFontComboBox *fontList = new QFontComboBox(widget); + fontList->setCurrentFont(QFont("Arial")); + + QPushButton *labelButton = new QPushButton(widget); + labelButton->setText(QStringLiteral("Change label style")); + + QPushButton *meshButton = new QPushButton(widget); + meshButton->setText(QStringLiteral("Change pointer mesh")); + + QComboBox *themeList = new QComboBox(widget); + themeList->addItem(QStringLiteral("Qt")); + themeList->addItem(QStringLiteral("Primary Colors")); + themeList->addItem(QStringLiteral("Digia")); + themeList->addItem(QStringLiteral("Stone Moss")); + themeList->addItem(QStringLiteral("Army Blue")); + themeList->addItem(QStringLiteral("Retro")); + themeList->addItem(QStringLiteral("Ebony")); + themeList->addItem(QStringLiteral("Isabelle")); + themeList->setCurrentIndex(initialTheme); + + QComboBox *shadowQuality = new QComboBox(widget); + shadowQuality->addItem(QStringLiteral("None")); + shadowQuality->addItem(QStringLiteral("Low")); + shadowQuality->addItem(QStringLiteral("Medium")); + shadowQuality->addItem(QStringLiteral("High")); + shadowQuality->addItem(QStringLiteral("Low Soft")); + shadowQuality->addItem(QStringLiteral("Medium Soft")); + shadowQuality->addItem(QStringLiteral("High Soft")); + shadowQuality->setCurrentIndex(3); + + QComboBox *selectionMode = new QComboBox(widget); + selectionMode->addItem(QStringLiteral("None"), + int(QAbstract3DGraph::SelectionNone)); + selectionMode->addItem(QStringLiteral("Item"), + int(QAbstract3DGraph::SelectionItem)); + selectionMode->addItem(QStringLiteral("Multi: Item"), + int(QAbstract3DGraph::SelectionItem | QAbstract3DGraph::SelectionMultiSeries)); + selectionMode->addItem(QStringLiteral("Row"), + int(QAbstract3DGraph::SelectionRow)); + selectionMode->addItem(QStringLiteral("Item and Row"), + int(QAbstract3DGraph::SelectionItemAndRow)); + selectionMode->addItem(QStringLiteral("Column"), + int(QAbstract3DGraph::SelectionColumn)); + selectionMode->addItem(QStringLiteral("Item and Column"), + int(QAbstract3DGraph::SelectionItemAndColumn)); + selectionMode->addItem(QStringLiteral("Row and Column"), + int(QAbstract3DGraph::SelectionRowAndColumn)); + selectionMode->addItem(QStringLiteral("Item, Row and Column"), + int(QAbstract3DGraph::SelectionItemRowAndColumn)); + selectionMode->addItem(QStringLiteral("Multi: Item, Row and Column"), + int(QAbstract3DGraph::SelectionItemRowAndColumn | QAbstract3DGraph::SelectionMultiSeries)); + selectionMode->addItem(QStringLiteral("Slice into Row"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow)); + selectionMode->addItem(QStringLiteral("Slice into Row and Item"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow)); + selectionMode->addItem(QStringLiteral("Multi: Slice, Row & Item"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow + | QAbstract3DGraph::SelectionMultiSeries)); + selectionMode->addItem(QStringLiteral("Slice into Column"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn)); + selectionMode->addItem(QStringLiteral("Slice into Column and Item"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn)); + selectionMode->addItem(QStringLiteral("Multi: Slice, Column & Item"), + int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn + | QAbstract3DGraph::SelectionMultiSeries)); + +#ifndef MULTI_SERIES + QPushButton *selectButton = new QPushButton(widget); + selectButton->setText(QStringLiteral("Select random point")); + + QPushButton *flipViewsButton = new QPushButton(widget); + flipViewsButton->setText(QStringLiteral("Flip Views")); + + QLabel *selectionInfoLabel = new QLabel(widget); +#endif + + QPushButton *changeRowButton = new QPushButton(widget); + changeRowButton->setText(QStringLiteral("Change a row")); + + QPushButton *changeRowsButton = new QPushButton(widget); + changeRowsButton->setText(QStringLiteral("Change 3 rows")); + + QPushButton *changeItemButton = new QPushButton(widget); + changeItemButton->setText(QStringLiteral("Change item")); + + QPushButton *changeMultipleItemButton = new QPushButton(widget); + changeMultipleItemButton->setText(QStringLiteral("Change many items")); + + 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")); + + QPushButton *resetArrayButton = new QPushButton(widget); + resetArrayButton->setText(QStringLiteral("Reset Series Array to plane")); + + QPushButton *resetArrayEmptyButton = new QPushButton(widget); + resetArrayEmptyButton->setText(QStringLiteral("Reset Series Array to empty")); + + QPushButton *massiveDataTestButton = new QPushButton(widget); + massiveDataTestButton->setText(QStringLiteral("Massive data test")); + + QPushButton *testReverseButton = new QPushButton(widget); + testReverseButton->setText(QStringLiteral("Test Axis Reversing")); + + QPushButton *testDataOrderingButton = new QPushButton(widget); + testDataOrderingButton->setText(QStringLiteral("Test data ordering")); + + QFrame* line = new QFrame(); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + + QFrame* line2 = new QFrame(); + line2->setFrameShape(QFrame::HLine); + line2->setFrameShadow(QFrame::Sunken); + + QFrame* line3 = new QFrame(); + line3->setFrameShape(QFrame::HLine); + line3->setFrameShadow(QFrame::Sunken); + + QCheckBox *axisTitlesVisibleCB = new QCheckBox(widget); + axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible")); + axisTitlesVisibleCB->setChecked(false); + + QCheckBox *axisTitlesFixedCB = new QCheckBox(widget); + axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed")); + axisTitlesFixedCB->setChecked(true); + + QSlider *axisLabelRotationSlider = new QSlider(Qt::Horizontal, widget); + axisLabelRotationSlider->setTickInterval(10); + axisLabelRotationSlider->setTickPosition(QSlider::TicksBelow); + axisLabelRotationSlider->setMinimum(0); + axisLabelRotationSlider->setValue(0); + axisLabelRotationSlider->setMaximum(90); + + QCheckBox *xAscendingCB = new QCheckBox(widget); + xAscendingCB->setText(QStringLiteral("X Ascending")); + xAscendingCB->setChecked(true); + + QCheckBox *zAscendingCB = new QCheckBox(widget); + zAscendingCB->setText(QStringLiteral("Z Ascending")); + zAscendingCB->setChecked(true); + + QCheckBox *polarCB = new QCheckBox(widget); + polarCB->setText(QStringLiteral("Polar")); + polarCB->setChecked(false); + + QCheckBox *surfaceTextureCB = new QCheckBox(widget); + surfaceTextureCB->setText(QStringLiteral("Map texture")); + surfaceTextureCB->setChecked(false); + + QSlider *cameraTargetSliderX = new QSlider(Qt::Horizontal, widget); + cameraTargetSliderX->setTickInterval(1); + cameraTargetSliderX->setMinimum(-100); + cameraTargetSliderX->setValue(0); + cameraTargetSliderX->setMaximum(100); + QSlider *cameraTargetSliderY = new QSlider(Qt::Horizontal, widget); + cameraTargetSliderY->setTickInterval(1); + cameraTargetSliderY->setMinimum(-100); + cameraTargetSliderY->setValue(0); + cameraTargetSliderY->setMaximum(100); + QSlider *cameraTargetSliderZ = new QSlider(Qt::Horizontal, widget); + cameraTargetSliderZ->setTickInterval(1); + cameraTargetSliderZ->setMinimum(-100); + cameraTargetSliderZ->setValue(0); + cameraTargetSliderZ->setMaximum(100); + + QSlider *marginSlider = new QSlider(Qt::Horizontal, widget); + marginSlider->setMinimum(-1); + marginSlider->setValue(-1); + marginSlider->setMaximum(100); + + // Add controls to the layout +#ifdef MULTI_SERIES + vLayout->addWidget(series1CB); +#endif + vLayout->addWidget(smoothCB); + vLayout->addWidget(surfaceGridCB); + vLayout->addWidget(surfaceCB); + vLayout->addWidget(seriesVisibleCB); +#ifdef MULTI_SERIES + vLayout->addWidget(line); + vLayout->addWidget(series2CB); + vLayout->addWidget(smoothS2CB); + vLayout->addWidget(surfaceGridS2CB); + vLayout->addWidget(surfaceS2CB); + vLayout->addWidget(series2VisibleCB); + vLayout->addWidget(line2); + vLayout->addWidget(series3CB); + vLayout->addWidget(smoothS3CB); + vLayout->addWidget(surfaceGridS3CB); + vLayout->addWidget(surfaceS3CB); + vLayout->addWidget(series3VisibleCB); + vLayout->addWidget(line3); + vLayout->addWidget(series4CB); + vLayout->addWidget(smoothS4CB); + vLayout->addWidget(surfaceGridS4CB); + vLayout->addWidget(surfaceS4CB); + vLayout->addWidget(series4VisibleCB); + vLayout->addWidget(surfaceTextureCB, 1, Qt::AlignTop); +#endif +#ifndef MULTI_SERIES + vLayout->addWidget(new QLabel(QStringLiteral("Select surface sample"))); + vLayout->addWidget(sqrtSinCB); + vLayout->addWidget(planeCB); + vLayout->addWidget(heightMapCB); + vLayout->addWidget(new QLabel(QStringLiteral("Adjust sample count"))); + vLayout->addWidget(gridSlidersLockCB); + vLayout->addWidget(gridSliderX); + vLayout->addWidget(gridSliderZ, 1, Qt::AlignTop); +#endif + + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust vertical aspect ratio"))); + vLayout2->addWidget(aspectRatioSlider); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust horizontal aspect ratio"))); + vLayout2->addWidget(horizontalAspectRatioSlider); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust axis range"))); + vLayout2->addWidget(axisRangeSliderX); + vLayout2->addWidget(axisRangeSliderY); + vLayout2->addWidget(axisRangeSliderZ); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust axis minimum"))); + vLayout2->addWidget(axisMinSliderX); + vLayout2->addWidget(axisMinSliderY); + vLayout2->addWidget(axisMinSliderZ); + vLayout2->addWidget(xAscendingCB); + vLayout2->addWidget(zAscendingCB); + vLayout2->addWidget(polarCB); + vLayout2->addWidget(new QLabel(QStringLiteral("Change font"))); + vLayout2->addWidget(fontList); + vLayout2->addWidget(new QLabel(QStringLiteral("Change theme"))); + vLayout2->addWidget(themeList); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality"))); + vLayout2->addWidget(shadowQuality); + vLayout2->addWidget(new QLabel(QStringLiteral("Selection Mode"))); + vLayout2->addWidget(selectionMode); + vLayout2->addWidget(new QLabel(QStringLiteral("Camera target"))); + vLayout2->addWidget(cameraTargetSliderX); + vLayout2->addWidget(cameraTargetSliderY); + vLayout2->addWidget(cameraTargetSliderZ); + vLayout2->addWidget(new QLabel(QStringLiteral("Adjust margin")), 0, Qt::AlignTop); + vLayout2->addWidget(marginSlider, 1, Qt::AlignTop); + + vLayout3->addWidget(labelButton); + vLayout3->addWidget(meshButton); +#ifndef MULTI_SERIES + vLayout3->addWidget(selectButton); + vLayout3->addWidget(selectionInfoLabel); + vLayout3->addWidget(flipViewsButton); +#endif + + vLayout3->addWidget(colorPB); + vLayout3->addWidget(changeRowButton); + vLayout3->addWidget(changeRowsButton); + vLayout3->addWidget(changeMultipleRowsButton); + vLayout3->addWidget(changeItemButton); + vLayout3->addWidget(changeMultipleItemButton); + vLayout3->addWidget(addRowButton); + vLayout3->addWidget(addRowsButton); + vLayout3->addWidget(insertRowButton); + vLayout3->addWidget(insertRowsButton); + vLayout3->addWidget(removeRowButton); + vLayout3->addWidget(resetArrayButton); + vLayout3->addWidget(resetArrayEmptyButton); + vLayout3->addWidget(massiveDataTestButton); + vLayout3->addWidget(testReverseButton); + vLayout3->addWidget(testDataOrderingButton); + vLayout3->addWidget(axisTitlesVisibleCB); + vLayout3->addWidget(axisTitlesFixedCB); + vLayout3->addWidget(new QLabel(QStringLiteral("Axis label rotation"))); + vLayout3->addWidget(axisLabelRotationSlider, 1, Qt::AlignTop); + + widget->show(); + + GraphModifier *modifier = new GraphModifier(surfaceGraph, container); + + // Connect controls to slots on modifier + QObject::connect(smoothCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSmooth); + QObject::connect(surfaceGridCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceGrid); + QObject::connect(surfaceCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurface); + QObject::connect(seriesVisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeriesVisible); +#ifdef MULTI_SERIES + QObject::connect(smoothS2CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSmoothS2); + QObject::connect(surfaceGridS2CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceGridS2); + QObject::connect(surfaceS2CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceS2); + QObject::connect(series2VisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries2Visible); + + QObject::connect(smoothS3CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSmoothS3); + QObject::connect(surfaceGridS3CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceGridS3); + QObject::connect(surfaceS3CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceS3); + QObject::connect(series3VisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries3Visible); + + QObject::connect(smoothS4CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSmoothS4); + QObject::connect(surfaceGridS4CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceGridS4); + QObject::connect(surfaceS4CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSurfaceS4); + QObject::connect(series4VisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries4Visible); + + QObject::connect(series1CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries1); + QObject::connect(series1CB, &QCheckBox::stateChanged, + smoothCB, &QPushButton::setEnabled); + QObject::connect(series1CB, &QCheckBox::stateChanged, + surfaceGridCB, &QPushButton::setEnabled); + QObject::connect(series1CB, &QCheckBox::stateChanged, + surfaceCB, &QPushButton::setEnabled); + QObject::connect(series1CB, &QCheckBox::stateChanged, + seriesVisibleCB, &QPushButton::setEnabled); + + QObject::connect(series2CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries2); + QObject::connect(series2CB, &QCheckBox::stateChanged, + smoothS2CB, &QPushButton::setEnabled); + QObject::connect(series2CB, &QCheckBox::stateChanged, + surfaceGridS2CB, &QPushButton::setEnabled); + QObject::connect(series2CB, &QCheckBox::stateChanged, + surfaceS2CB, &QPushButton::setEnabled); + QObject::connect(series2CB, &QCheckBox::stateChanged, + series2VisibleCB, &QPushButton::setEnabled); + + QObject::connect(series3CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries3); + QObject::connect(series3CB, &QCheckBox::stateChanged, + smoothS3CB, &QPushButton::setEnabled); + QObject::connect(series3CB, &QCheckBox::stateChanged, + surfaceGridS3CB, &QPushButton::setEnabled); + QObject::connect(series3CB, &QCheckBox::stateChanged, + surfaceS3CB, &QPushButton::setEnabled); + QObject::connect(series3CB, &QCheckBox::stateChanged, + series3VisibleCB, &QPushButton::setEnabled); + + QObject::connect(series4CB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleSeries4); + QObject::connect(series4CB, &QCheckBox::stateChanged, + smoothS4CB, &QPushButton::setEnabled); + QObject::connect(series4CB, &QCheckBox::stateChanged, + surfaceGridS4CB, &QPushButton::setEnabled); + QObject::connect(series4CB, &QCheckBox::stateChanged, + surfaceS4CB, &QPushButton::setEnabled); + QObject::connect(series4CB, &QCheckBox::stateChanged, + series4VisibleCB, &QPushButton::setEnabled); +#else + QObject::connect(sqrtSinCB, &QRadioButton::toggled, + modifier, &GraphModifier::toggleSqrtSin); + QObject::connect(planeCB, &QCheckBox::toggled, + modifier, &GraphModifier::togglePlane); + QObject::connect(heightMapCB, &QCheckBox::toggled, + modifier, &GraphModifier::setHeightMapData); + QObject::connect(gridSlidersLockCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleGridSliderLock); + QObject::connect(gridSliderX, &QSlider::valueChanged, + modifier, &GraphModifier::adjustXCount); + QObject::connect(gridSliderZ, &QSlider::valueChanged, + modifier, &GraphModifier::adjustZCount); +#endif + QObject::connect(axisRangeSliderX, &QSlider::valueChanged, + modifier, &GraphModifier::adjustXRange); + QObject::connect(axisRangeSliderY, &QSlider::valueChanged, + modifier, &GraphModifier::adjustYRange); + QObject::connect(axisRangeSliderZ, &QSlider::valueChanged, + modifier, &GraphModifier::adjustZRange); + QObject::connect(axisMinSliderX, &QSlider::valueChanged, + modifier, &GraphModifier::adjustXMin); + QObject::connect(axisMinSliderY, &QSlider::valueChanged, + modifier, &GraphModifier::adjustYMin); + QObject::connect(axisMinSliderZ, &QSlider::valueChanged, + modifier, &GraphModifier::adjustZMin); + QObject::connect(colorPB, &QPushButton::pressed, + modifier, &GraphModifier::gradientPressed); + QObject::connect(fontList, &QFontComboBox::currentFontChanged, + modifier, &GraphModifier::changeFont); + QObject::connect(labelButton, &QPushButton::clicked, + modifier, &GraphModifier::changeStyle); + QObject::connect(meshButton, &QPushButton::clicked, + modifier, &GraphModifier::changeMesh); + QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), + modifier, SLOT(changeTheme(int))); + QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), + modifier, SLOT(changeShadowQuality(int))); + QObject::connect(selectionMode, SIGNAL(currentIndexChanged(int)), + modifier, SLOT(changeSelectionMode(int))); +#ifndef MULTI_SERIES + QObject::connect(selectButton, &QPushButton::clicked, + modifier, &GraphModifier::selectButtonClicked); + QObject::connect(flipViewsButton, &QPushButton::clicked, + modifier, &GraphModifier::flipViews); +#endif + QObject::connect(changeRowButton,&QPushButton::clicked, + modifier, &GraphModifier::changeRow); + QObject::connect(changeRowsButton,&QPushButton::clicked, + modifier, &GraphModifier::changeRows); + QObject::connect(changeItemButton,&QPushButton::clicked, + modifier, &GraphModifier::changeItem); + QObject::connect(changeMultipleItemButton,&QPushButton::clicked, + 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); + QObject::connect(resetArrayButton,&QPushButton::clicked, + modifier, &GraphModifier::resetArray); + QObject::connect(resetArrayEmptyButton,&QPushButton::clicked, + modifier, &GraphModifier::resetArrayEmpty); + QObject::connect(massiveDataTestButton,&QPushButton::clicked, + modifier, &GraphModifier::massiveDataTest); + QObject::connect(testReverseButton, &QPushButton::clicked, + modifier, &GraphModifier::testAxisReverse); + QObject::connect(testDataOrderingButton, &QPushButton::clicked, + modifier, &GraphModifier::testDataOrdering); + QObject::connect(axisTitlesVisibleCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleAxisTitleVisibility); + QObject::connect(axisTitlesFixedCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleAxisTitleFixed); + QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier, + &GraphModifier::changeLabelRotation); + QObject::connect(xAscendingCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleXAscending); + QObject::connect(zAscendingCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::toggleZAscending); + QObject::connect(polarCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::togglePolar); + + QObject::connect(aspectRatioSlider, &QSlider::valueChanged, + modifier, &GraphModifier::setAspectRatio); + QObject::connect(horizontalAspectRatioSlider, &QSlider::valueChanged, + modifier, &GraphModifier::setHorizontalAspectRatio); + QObject::connect(surfaceTextureCB, &QCheckBox::stateChanged, + modifier, &GraphModifier::setSurfaceTexture); + QObject::connect(cameraTargetSliderX, &QSlider::valueChanged, modifier, + &GraphModifier::setCameraTargetX); + QObject::connect(cameraTargetSliderY, &QSlider::valueChanged, modifier, + &GraphModifier::setCameraTargetY); + QObject::connect(cameraTargetSliderZ, &QSlider::valueChanged, modifier, + &GraphModifier::setCameraTargetZ); + QObject::connect(marginSlider, &QSlider::valueChanged, modifier, + &GraphModifier::setGraphMargin); + +#ifdef MULTI_SERIES + modifier->setSeries1CB(series1CB); + modifier->setSeries2CB(series2CB); + modifier->setSeries3CB(series3CB); + modifier->setSeries4CB(series4CB); + series1CB->setChecked(true); + series2CB->setChecked(true); + series3CB->setChecked(true); + series4CB->setChecked(true); +#endif + modifier->setAxisRangeSliderX(axisRangeSliderX); + modifier->setAxisRangeSliderZ(axisRangeSliderZ); + modifier->setAxisMinSliderX(axisMinSliderX); + modifier->setAxisMinSliderZ(axisMinSliderZ); + selectionMode->setCurrentIndex(1); +#ifndef MULTI_SERIES + modifier->setGridSliderZ(gridSliderZ); + modifier->setGridSliderX(gridSliderX); + modifier->toggleGridSliderLock(gridSlidersLockCB->checkState()); + modifier->setSelectionInfoLabel(selectionInfoLabel); + sqrtSinCB->setChecked(true); +#endif + shadowQuality->setCurrentIndex(3); + + return app.exec(); +} diff --git a/tests/manual/surfacetest/mapimage.png b/tests/manual/surfacetest/mapimage.png new file mode 100644 index 00000000..079d0407 Binary files /dev/null and b/tests/manual/surfacetest/mapimage.png differ diff --git a/tests/manual/surfacetest/surfacetest.pro b/tests/manual/surfacetest/surfacetest.pro new file mode 100644 index 00000000..134e8a6e --- /dev/null +++ b/tests/manual/surfacetest/surfacetest.pro @@ -0,0 +1,14 @@ +!include( ../tests.pri ) { + error( "Couldn't find the tests.pri file!" ) +} + +SOURCES += main.cpp \ + graphmodifier.cpp + +QT += widgets + +HEADERS += \ + graphmodifier.h + +RESOURCES += \ + surfacetest.qrc diff --git a/tests/manual/surfacetest/surfacetest.qrc b/tests/manual/surfacetest/surfacetest.qrc new file mode 100644 index 00000000..266ed7e0 --- /dev/null +++ b/tests/manual/surfacetest/surfacetest.qrc @@ -0,0 +1,6 @@ + + + Heightmap.png + mapimage.png + + -- cgit v1.2.3