diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-11-07 10:18:53 +0200 |
---|---|---|
committer | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-11-07 10:29:29 +0200 |
commit | 6c3a413f65fe69cc525599ca183a66976ce0eaa7 (patch) | |
tree | a401017604c7ff4139d553c6792417e2f415e508 /tests/multigraphs/data.cpp | |
parent | a61c6ee6533dca6723320c3955773cc5ccbfe2fa (diff) |
Added a test for switching graphs (when no kinect available)
Makes fixing QTRD-2348 easier
Change-Id: I5e5cd361336bbe3d9b2b4b1477b694f15ae42725
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'tests/multigraphs/data.cpp')
-rw-r--r-- | tests/multigraphs/data.cpp | 319 |
1 files changed, 319 insertions, 0 deletions
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; + } + } +} |