diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/multigraphs/australia.png | bin | 0 -> 414991 bytes | |||
-rw-r--r-- | tests/multigraphs/data.cpp | 319 | ||||
-rw-r--r-- | tests/multigraphs/data.h | 98 | ||||
-rw-r--r-- | tests/multigraphs/main.cpp | 156 | ||||
-rw-r--r-- | tests/multigraphs/multigraphs.pro | 14 | ||||
-rw-r--r-- | tests/multigraphs/multigraphs.qrc | 5 | ||||
-rw-r--r-- | tests/tests.pro | 3 |
7 files changed, 594 insertions, 1 deletions
diff --git a/tests/multigraphs/australia.png b/tests/multigraphs/australia.png Binary files differnew file mode 100644 index 00000000..a839b6b9 --- /dev/null +++ b/tests/multigraphs/australia.png diff --git a/tests/multigraphs/data.cpp b/tests/multigraphs/data.cpp new file mode 100644 index 00000000..31bc5391 --- /dev/null +++ b/tests/multigraphs/data.cpp @@ -0,0 +1,319 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#define NOMINMAX + +#include "data.h" +#include <QtDataVisualization/Q3DValueAxis> +#include <QtDataVisualization/Q3DCamera> +#include <QScrollBar> +#include <QSize> +#include <QImage> + +QT_DATAVISUALIZATION_USE_NAMESPACE + +Data::Data(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars, + QTextEdit *statusArea, QWidget *widget) : + m_surface(surface), + m_scatter(scatter), + m_bars(bars), + m_statusArea(statusArea), + m_widget(widget), + m_resize(true), + m_resolution(QSize(300, 300)), + m_resolutionLevel(0), + m_mode(Surface), + m_started(false) +{ + // Initialize surface + m_surface->setTheme(QDataVis::ThemeIsabelle); + 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); + m_surface->setSelectionMode(QDataVis::SelectionNone); + m_surface->setGridVisible(false); + m_surface->setGradient(gradient); + m_surface->setSurfaceGridEnabled(false); + m_surface->setBackgroundVisible(false); + m_surface->setSmoothSurfaceEnabled(false); + m_surface->setActiveDataProxy(new QHeightMapSurfaceDataProxy()); + m_surface->scene()->activeCamera()->setCameraPosition(0.0, 90.0, 150); + + // Initialize scatter + m_scatter->setTheme(QDataVis::ThemeStoneMoss); + m_scatter->setSelectionMode(QDataVis::SelectionNone); + m_scatter->setGridVisible(false); + m_scatter->setObjectType(QDataVis::MeshStylePoints); + m_scatter->setShadowQuality(QDataVis::ShadowQualitySoftLow); + m_scatter->scene()->activeCamera()->setCameraPosition(0.0, 85.0, 150); + + // Initialize bars + m_bars->setTheme(QDataVis::ThemeQt); + m_bars->setSelectionMode(QDataVis::SelectionItemAndRow | QDataVis::SelectionSlice); + m_bars->setGridVisible(false); + m_bars->setBarType(QDataVis::MeshStyleBars, false); + m_bars->setShadowQuality(QDataVis::ShadowQualityLow); + m_bars->setBarSpacing(QSizeF(0.0, 0.0)); + m_bars->scene()->activeCamera()->setCameraPosition(0.0, 75.0, 150); + + // Hide scroll bar + m_statusArea->verticalScrollBar()->setVisible(false); +} + +Data::~Data() +{ // HACK: The current context needs to be destroyed last + // TODO: Fix properly in datavis code somehow + if (m_mode == Surface) { + delete m_scatter; + delete m_bars; + delete m_surface; + } else if (m_mode == Bars) { + delete m_scatter; + delete m_surface; + delete m_bars; + } else { + delete m_bars; + delete m_surface; + delete m_scatter; + } + delete m_widget; +} + +void Data::updateData() +{ + if (!m_started) { + m_statusArea->append(QStringLiteral("<i>We are stopped. The changes will take effect once started.</i>")); + return; + } + QImage depthMap = QImage(":/australia.png"); + if (m_resize) // Resize for better performance + depthMap = depthMap.scaled(m_resolution); + if (m_mode != Surface) + setData(depthMap); + else + static_cast<QHeightMapSurfaceDataProxy *>(m_surface->activeDataProxy())->setHeightMap( + depthMap); +} + +void Data::clearData() +{ + m_bars->activeDataProxy()->resetArray(0); + m_scatter->activeDataProxy()->resetArray(0); + m_surface->activeDataProxy()->resetArray(0); +} + +void Data::setResolution(int selection) +{ + m_resolutionLevel = selection; + switch (selection) { + case 0: { + m_resize = true; + m_resolution = QSize(300, 300); + break; + } + case 1: { + m_resize = true; + m_resolution = QSize(600, 600); + break; + } + case 2: { + m_resize = true; + m_resolution = QSize(800, 800); + break; + } + case 3: { + m_resize = false; + m_resolution = QSize(1020, 1020); // image size + break; + } + }; + if (m_mode == Scatter) { + m_resize = true; + m_resolution /= 3; + m_scatterDataArray = new QScatterDataArray; + m_scatterDataArray->resize(m_resolution.width() * m_resolution.height()); + } else if (m_mode == Bars) { + m_resize = true; + m_resolution /= 6; + m_barDataArray = new QBarDataArray; + m_barDataArray->reserve(m_resolution.height()); + for (int i = 0; i < m_resolution.height(); i++) { + QBarDataRow *newProxyRow = new QBarDataRow(m_resolution.width()); + m_barDataArray->append(newProxyRow); + } + } + + m_statusArea->append(QString(QStringLiteral("<b>Resolution:</b> %1 x %2")).arg( + m_resolution.width()).arg(m_resolution.height())); + + updateData(); +} + +void Data::scrollDown() +{ + QScrollBar *scrollbar = m_statusArea->verticalScrollBar(); + scrollbar->setValue(scrollbar->maximum()); +} + +void Data::useGradientOne() +{ + m_surface->setTheme(QDataVis::ThemeIsabelle); + 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); + m_surface->setGradient(gradient); + m_statusArea->append(QStringLiteral("<b>Colors:</b> Thermal image imitation")); +} + +void Data::useGradientTwo() +{ + m_surface->setTheme(QDataVis::ThemeQt); + QLinearGradient gradient; + gradient.setColorAt(0.0, Qt::white); + gradient.setColorAt(0.8, Qt::red); + gradient.setColorAt(1.0, Qt::green); + m_surface->setGradient(gradient); + m_statusArea->append(QStringLiteral("<b>Colors:</b> Highlight foreground")); +} + +void Data::setData(const QImage &image) +{ + QImage heightImage = image; + + uchar *bits = heightImage.bits(); + + int imageHeight = heightImage.height(); + int imageWidth = heightImage.width(); + int bitCount = imageWidth * 4 * (imageHeight - 1); + int widthBits = imageWidth * 4; + + if (m_mode == Scatter) { + QScatterDataItem *ptrToDataArray = &m_scatterDataArray->first(); + + int limitsX = imageWidth / 2; + int limitsZ = imageHeight / 2; + qreal height = 0; + int count = 0; + + for (int i = -limitsZ; i < limitsZ; i++, bitCount -= widthBits) { + for (int j = -limitsX; j < limitsX; j++) { + height = qreal(bits[bitCount + ((j + limitsX) * 4)]) - 128.0; + if (height > -128) { + ptrToDataArray->setPosition(QVector3D(qreal(j), height, qreal(i))); + ptrToDataArray++; + count++; + } + } + } + + QScatterDataArray *dataArray = new QScatterDataArray(m_scatterDataArray->mid(0, count)); + m_scatter->activeDataProxy()->resetArray(dataArray); + } else { + QBarDataArray *dataArray = m_barDataArray; + for (int i = 0; i < imageHeight; i++, bitCount -= widthBits) { + QBarDataRow &newRow = *dataArray->at(i); + for (int j = 0; j < imageWidth; j++) + newRow[j] = qreal(bits[bitCount + (j * 4)]); + } + + m_bars->activeDataProxy()->resetArray(dataArray); + } +} + +void Data::changeMode(int mode) +{ + m_mode = VisualizationMode(mode); + switch (m_mode) { + case Surface: { + m_statusArea->append(QStringLiteral("<b>Visualization Type:</b> Surface")); + break; + } + case Scatter: { + m_statusArea->append(QStringLiteral("<b>Visualization Type:</b> Scatter")); + break; + } + default: { + m_statusArea->append(QStringLiteral("<b>Visualization Type:</b> Bars")); + break; + } + } + // Reset resolution after mode change + setResolution(m_resolutionLevel); +} + +void Data::start() +{ + m_started = true; + updateData(); + m_statusArea->append(QStringLiteral("<b>Started<\b>")); +} + +void Data::stop() +{ + m_started = false; + clearData(); + m_statusArea->append(QStringLiteral("<b>Stopped<\b>")); +} + +ContainerChanger::ContainerChanger(QWidget *surface, QWidget *scatter, QWidget *bars, + QWidget *buttonOne, QWidget *buttonTwo) + : m_surface(surface), + m_scatter(scatter), + m_bars(bars), + m_button1(buttonOne), + m_button2(buttonTwo) +{ +} + +ContainerChanger::~ContainerChanger() +{ +} + +void ContainerChanger::changeContainer(int container) +{ + switch (container) { + case 0: { + m_scatter->setVisible(false); + m_bars->setVisible(false); + m_surface->setVisible(true); + m_button1->setEnabled(true); + m_button2->setEnabled(true); + break; + } + case 1: { + m_surface->setVisible(false); + m_bars->setVisible(false); + m_scatter->setVisible(true); + m_button1->setEnabled(false); + m_button2->setEnabled(false); + break; + } + case 2: { + m_surface->setVisible(false); + m_scatter->setVisible(false); + m_bars->setVisible(true); + m_button1->setEnabled(false); + m_button2->setEnabled(false); + break; + } + } +} diff --git a/tests/multigraphs/data.h b/tests/multigraphs/data.h new file mode 100644 index 00000000..91e68334 --- /dev/null +++ b/tests/multigraphs/data.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#ifndef DATA_H +#define DATA_H + +#include <QtDataVisualization/Q3DScatter> +#include <QtDataVisualization/Q3DBars> +#include <QtDataVisualization/Q3DSurface> +#include <QtDataVisualization/QScatterDataProxy> +#include <QtDataVisualization/QBarDataProxy> +#include <QtDataVisualization/QHeightMapSurfaceDataProxy> +#include <QTextEdit> + +using namespace QtDataVisualization; + +class Data : public QObject +{ + Q_OBJECT + +public: + explicit Data(Q3DSurface *surface, Q3DScatter *scatter, Q3DBars *bars, + QTextEdit *statusLabel, QWidget *widget); + ~Data(); + + void start(); + void stop(); + + void updateData(); + void clearData(); + + void scrollDown(); + void setData(const QImage &image); + void useGradientOne(); + void useGradientTwo(); + +public: + enum VisualizationMode { + Surface = 0, + Scatter, + Bars + }; + +public slots: + void setResolution(int selection); + void changeMode(int mode); + +private: + Q3DSurface *m_surface; + Q3DScatter *m_scatter; + Q3DBars *m_bars; + QTextEdit *m_statusArea; + QWidget *m_widget; + bool m_resize; + QSize m_resolution; + int m_resolutionLevel; + VisualizationMode m_mode; + QScatterDataArray *m_scatterDataArray; + QBarDataArray *m_barDataArray; + bool m_started; +}; + +class ContainerChanger : public QObject +{ + Q_OBJECT + +public: + explicit ContainerChanger(QWidget *surface, QWidget *scatter, QWidget *bars, + QWidget *buttonOne, QWidget *buttonTwo); + ~ContainerChanger(); + +public slots: + void changeContainer(int container); + +private: + QWidget *m_surface; + QWidget *m_scatter; + QWidget *m_bars; + QWidget *m_button1; + QWidget *m_button2; +}; + +#endif diff --git a/tests/multigraphs/main.cpp b/tests/multigraphs/main.cpp new file mode 100644 index 00000000..a959641d --- /dev/null +++ b/tests/multigraphs/main.cpp @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the QtDataVisualization module. +** +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** +****************************************************************************/ + +#include "data.h" + +#include <QApplication> +#include <QWidget> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QPushButton> +#include <QLabel> +#include <QComboBox> +#include <QSlider> +#include <QTextEdit> +#include <QScreen> +#include <QPainter> + +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + + QWidget *widget = new QWidget(); + QHBoxLayout *hLayout = new QHBoxLayout(widget); + QVBoxLayout *vLayout = new QVBoxLayout(); + + Q3DSurface *surface = new Q3DSurface(); + Q3DScatter *scatter = new Q3DScatter(); + Q3DBars *bars = new Q3DBars(); + + QSize screenSize = surface->screen()->size(); + + QWidget *containerSurface = QWidget::createWindowContainer(surface); + containerSurface->setMinimumSize(QSize(screenSize.height() / 1.2, screenSize.height() / 1.2)); + containerSurface->setMaximumSize(screenSize); + containerSurface->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + containerSurface->setFocusPolicy(Qt::StrongFocus); + + QWidget *containerScatter = QWidget::createWindowContainer(scatter); + containerScatter->setMinimumSize(QSize(screenSize.height() / 1.2, screenSize.height() / 1.2)); + containerScatter->setMaximumSize(screenSize); + containerScatter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + containerScatter->setFocusPolicy(Qt::StrongFocus); + containerScatter->setVisible(false); + + QWidget *containerBars = QWidget::createWindowContainer(bars); + containerBars->setMinimumSize(QSize(screenSize.height() / 1.2, screenSize.height() / 1.2)); + containerBars->setMaximumSize(screenSize); + containerBars->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + containerBars->setFocusPolicy(Qt::StrongFocus); + containerBars->setVisible(false); + + widget->setWindowTitle(QStringLiteral("Test switching graphs on the fly")); + + hLayout->addWidget(containerSurface, 1); + hLayout->addWidget(containerScatter, 1); + hLayout->addWidget(containerBars, 1); + hLayout->addLayout(vLayout); + + QPushButton *startButton = new QPushButton(widget); + startButton->setText(QStringLiteral("Start")); + + QPushButton *stopButton = new QPushButton(widget); + stopButton->setText(QStringLiteral("Stop")); + + QComboBox *resolutionBox = new QComboBox(widget); + resolutionBox->addItem(QStringLiteral("Low")); + resolutionBox->addItem(QStringLiteral("Medium")); + resolutionBox->addItem(QStringLiteral("High")); + resolutionBox->addItem(QStringLiteral("Max")); // Comment this out if demo machine is low-perf + resolutionBox->setCurrentIndex(0); + + QComboBox *modeBox = new QComboBox(widget); + modeBox->addItem(QStringLiteral("Surface Plot")); + modeBox->addItem(QStringLiteral("Scatter Chart")); + modeBox->addItem(QStringLiteral("Bar Chart")); + modeBox->setCurrentIndex(0); + + QLinearGradient gradientOne(0, 0, 200, 1); + gradientOne.setColorAt(0.0, Qt::black); + gradientOne.setColorAt(0.33, Qt::blue); + gradientOne.setColorAt(0.67, Qt::red); + gradientOne.setColorAt(1.0, Qt::yellow); + + QPixmap pm(200, 24); + QPainter pmp(&pm); + pmp.setBrush(QBrush(gradientOne)); + pmp.setPen(Qt::NoPen); + pmp.drawRect(0, 0, 200, 24); + + QPushButton *gradientOneButton = new QPushButton(widget); + gradientOneButton->setIcon(QIcon(pm)); + gradientOneButton->setIconSize(QSize(200, 24)); + gradientOneButton->setToolTip(QStringLiteral("Colors: Thermal Imitation")); + + QLinearGradient gradientTwo(0, 0, 200, 1); + gradientTwo.setColorAt(0.0, Qt::white); + gradientTwo.setColorAt(0.8, Qt::red); + gradientTwo.setColorAt(1.0, Qt::green); + + pmp.setBrush(QBrush(gradientTwo)); + pmp.setPen(Qt::NoPen); + pmp.drawRect(0, 0, 200, 24); + + QPushButton *gradientTwoButton = new QPushButton(widget); + gradientTwoButton->setIcon(QIcon(pm)); + gradientTwoButton->setIconSize(QSize(200, 24)); + gradientTwoButton->setToolTip(QStringLiteral("Colors: Highlight Foreground")); + + QTextEdit *status = new QTextEdit(QStringLiteral("<b>Ready</b><br>"), widget); + status->setReadOnly(true); + + vLayout->addWidget(startButton); + vLayout->addWidget(stopButton); + vLayout->addWidget(new QLabel(QStringLiteral("Change resolution"))); + vLayout->addWidget(resolutionBox); + vLayout->addWidget(new QLabel(QStringLiteral("Change visualization type"))); + vLayout->addWidget(modeBox); + vLayout->addWidget(new QLabel(QStringLiteral("Change color scheme"))); + vLayout->addWidget(gradientOneButton); + vLayout->addWidget(gradientTwoButton); + vLayout->addWidget(status, 1, Qt::AlignBottom); + + widget->show(); + + Data datagen(surface, scatter, bars, status, widget); + ContainerChanger changer(containerSurface, containerScatter, containerBars, + gradientOneButton, gradientTwoButton); + + QObject::connect(startButton, &QPushButton::clicked, &datagen, &Data::start); + QObject::connect(stopButton, &QPushButton::clicked, &datagen, &Data::stop); + QObject::connect(resolutionBox, SIGNAL(activated(int)), &datagen, SLOT(setResolution(int))); + QObject::connect(modeBox, SIGNAL(activated(int)), &changer, SLOT(changeContainer(int))); + QObject::connect(modeBox, SIGNAL(activated(int)), &datagen, SLOT(changeMode(int))); + QObject::connect(status, &QTextEdit::textChanged, &datagen, &Data::scrollDown); + QObject::connect(gradientOneButton, &QPushButton::clicked, &datagen, + &Data::useGradientOne); + QObject::connect(gradientTwoButton, &QPushButton::clicked, &datagen, + &Data::useGradientTwo); + + return app.exec(); +} diff --git a/tests/multigraphs/multigraphs.pro b/tests/multigraphs/multigraphs.pro new file mode 100644 index 00000000..914a816a --- /dev/null +++ b/tests/multigraphs/multigraphs.pro @@ -0,0 +1,14 @@ +!include( ../tests.pri ) { + error( "Couldn't find the tests.pri file!" ) +} + +SOURCES += main.cpp \ + data.cpp +HEADERS += data.h + +QT += widgets + +INSTALLS += target + +RESOURCES += \ + multigraphs.qrc diff --git a/tests/multigraphs/multigraphs.qrc b/tests/multigraphs/multigraphs.qrc new file mode 100644 index 00000000..bd924255 --- /dev/null +++ b/tests/multigraphs/multigraphs.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>australia.png</file> + </qresource> +</RCC> diff --git a/tests/tests.pro b/tests/tests.pro index 3fe3edb8..1b13cce2 100644 --- a/tests/tests.pro +++ b/tests/tests.pro @@ -10,7 +10,8 @@ TEMPLATE = subdirs SUBDIRS += barstest \ scattertest \ surfacetest \ - qmlcamera + qmlcamera \ + multigraphs #SUBDIRS += kinectsurface |