summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-09-03 08:21:22 +0300
committerTomi Korpipää <tomi.korpipaa@digia.com>2013-09-03 08:43:59 +0300
commitde88514dba523734170652d75a5cefcc7feb7c6c (patch)
tree649f908f09720f02c949782dfac7847a1b62f9c6
parent7b988086e9976b78d0f1ff433dcec205c6d33478 (diff)
Fixed issues from Improve examples task
Task-number: QTRD-2239 + Moved extra-full examples to tests + Removed extra functionality from widget and scatterchart examples + Changed bars default to bevelbar + Changed default label style to nobackground Change-Id: Idffba7a44d5b54dbaf36d7cdbfe616b78e0d4073 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--examples/scatterchart/main.cpp85
-rw-r--r--examples/scatterchart/scatterchart.cpp154
-rw-r--r--examples/scatterchart/scatterchart.h21
-rw-r--r--examples/widget/chart.cpp286
-rw-r--r--examples/widget/chart.h32
-rw-r--r--examples/widget/main.cpp200
-rw-r--r--src/datavis3d/engine/abstract3dcontroller.cpp2
-rw-r--r--src/datavis3d/engine/bars3dcontroller.cpp2
-rw-r--r--tests/barstest/barstest.pro10
-rw-r--r--tests/barstest/chart.cpp509
-rw-r--r--tests/barstest/chart.h108
-rw-r--r--tests/barstest/main.cpp324
-rw-r--r--tests/scattertest/main.cpp209
-rw-r--r--tests/scattertest/scatterchart.cpp330
-rw-r--r--tests/scattertest/scatterchart.h77
-rw-r--r--tests/scattertest/scattertest.pro10
-rw-r--r--tests/tests.pri72
-rw-r--r--tests/tests.pro11
18 files changed, 1704 insertions, 738 deletions
diff --git a/examples/scatterchart/main.cpp b/examples/scatterchart/main.cpp
index b0135ef3..ceecbc69 100644
--- a/examples/scatterchart/main.cpp
+++ b/examples/scatterchart/main.cpp
@@ -24,7 +24,6 @@
#include <QVBoxLayout>
#include <QPushButton>
#include <QCheckBox>
-#include <QSlider>
#include <QComboBox>
#include <QFontComboBox>
#include <QLabel>
@@ -43,7 +42,7 @@ int main(int argc, char **argv)
QSize screenSize = chart->screen()->size();
QWidget *container = QWidget::createWindowContainer(chart);
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
container->setMaximumSize(screenSize);
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
@@ -65,39 +64,6 @@ int main(int argc, char **argv)
QPushButton *cameraButton = new QPushButton(widget);
cameraButton->setText(QStringLiteral("Change camera preset"));
- QPushButton *clearButton = new QPushButton(widget);
- clearButton->setText(QStringLiteral("Clear chart"));
-
- QPushButton *addOneButton = new QPushButton(widget);
- addOneButton->setText(QStringLiteral("Add item"));
-
- QPushButton *addBunchButton = new QPushButton(widget);
- addBunchButton->setText(QStringLiteral("Add bunch of items"));
-
- QPushButton *insertOneButton = new QPushButton(widget);
- insertOneButton->setText(QStringLiteral("Insert item"));
-
- QPushButton *insertBunchButton = new QPushButton(widget);
- insertBunchButton->setText(QStringLiteral("Insert bunch of items"));
-
- QPushButton *changeOneButton = new QPushButton(widget);
- changeOneButton->setText(QStringLiteral("Change selected item"));
-
- QPushButton *changeBunchButton = new QPushButton(widget);
- changeBunchButton->setText(QStringLiteral("Change bunch of items"));
-
- QPushButton *removeOneButton = new QPushButton(widget);
- removeOneButton->setText(QStringLiteral("Remove selected item"));
-
- QPushButton *removeBunchButton = new QPushButton(widget);
- removeBunchButton->setText(QStringLiteral("Remove bunch of items"));
-
- QPushButton *setSelectedItemButton = new QPushButton(widget);
- setSelectedItemButton->setText(QStringLiteral("Select/deselect item 3"));
-
- QPushButton *startTimerButton = new QPushButton(widget);
- startTimerButton->setText(QStringLiteral("Start/stop timer"));
-
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
backgroundCheckBox->setText(QStringLiteral("Show background"));
backgroundCheckBox->setChecked(true);
@@ -117,70 +83,27 @@ int main(int argc, char **argv)
shadowQuality->setCurrentIndex(3);
QFontComboBox *fontList = new QFontComboBox(widget);
-
- QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
- fontSizeSlider->setTickInterval(1);
- fontSizeSlider->setMinimum(1);
- fontSizeSlider->setValue(30);
- fontSizeSlider->setMaximum(200);
+ fontList->setCurrentFont(QFont("Arial"));
vLayout->addWidget(themeButton, 0, Qt::AlignTop);
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(styleButton, 0, Qt::AlignTop);
vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
- vLayout->addWidget(clearButton, 0, Qt::AlignTop);
- vLayout->addWidget(addOneButton, 0, Qt::AlignTop);
- vLayout->addWidget(addBunchButton, 0, Qt::AlignTop);
- vLayout->addWidget(insertOneButton, 0, Qt::AlignTop);
- vLayout->addWidget(insertBunchButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeOneButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeBunchButton, 0, Qt::AlignTop);
- vLayout->addWidget(removeOneButton, 0, Qt::AlignTop);
- vLayout->addWidget(removeBunchButton, 0, Qt::AlignTop);
- vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop);
- vLayout->addWidget(startTimerButton, 0, Qt::AlignTop);
vLayout->addWidget(backgroundCheckBox);
vLayout->addWidget(gridCheckBox);
vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
vLayout->addWidget(shadowQuality);
vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
- vLayout->addWidget(fontList);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
- vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop);
+ vLayout->addWidget(fontList, 1, Qt::AlignTop);
widget->show();
ScatterDataModifier *modifier = new ScatterDataModifier(chart);
- QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
- &ScatterDataModifier::changeFontSize);
-
QObject::connect(styleButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changeStyle);
QObject::connect(cameraButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changePresetCamera);
- QObject::connect(clearButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::clear);
- QObject::connect(addOneButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::addOne);
- QObject::connect(addBunchButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::addBunch);
- QObject::connect(insertOneButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::insertOne);
- QObject::connect(insertBunchButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::insertBunch);
- QObject::connect(changeOneButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::changeOne);
- QObject::connect(changeBunchButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::changeBunch);
- QObject::connect(removeOneButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::removeOne);
- QObject::connect(removeBunchButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::removeBunch);
- QObject::connect(setSelectedItemButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::selectItem);
- QObject::connect(startTimerButton, &QPushButton::clicked, modifier,
- &ScatterDataModifier::startStopTimer);
QObject::connect(themeButton, &QPushButton::clicked, modifier,
&ScatterDataModifier::changeTheme);
QObject::connect(labelButton, &QPushButton::clicked, modifier,
@@ -192,8 +115,6 @@ int main(int argc, char **argv)
&QComboBox::setCurrentIndex);
QObject::connect(chart, &Q3DScatter::shadowQualityChanged, modifier,
&ScatterDataModifier::shadowQualityUpdatedByVisual);
- QObject::connect(chart, &Q3DScatter::selectedItemIndexChanged, modifier,
- &ScatterDataModifier::handleSelectionChange);
QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
&ScatterDataModifier::changeFont);
diff --git a/examples/scatterchart/scatterchart.cpp b/examples/scatterchart/scatterchart.cpp
index aab230f2..bcb10e92 100644
--- a/examples/scatterchart/scatterchart.cpp
+++ b/examples/scatterchart/scatterchart.cpp
@@ -22,14 +22,13 @@
#include <qmath.h>
using namespace QtDataVis3D;
-//#define RANDOM_SCATTER
+//#define RANDOM_SCATTER // Uncomment this to switch to random scatter
const int numberOfItems = 10000;
ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
: m_chart(scatter),
- m_fontSize(30.0f),
- m_selectedItem(-1)
+ m_fontSize(40.0f)
{
QFont font = m_chart->font();
font.setPointSize(m_fontSize);
@@ -45,8 +44,6 @@ ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
QScatterDataProxy *proxy = new QScatterDataProxy;
proxy->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel");
m_chart->setActiveDataProxy(proxy);
-
- connect(&m_timer, &QTimer::timeout, this, &ScatterDataModifier::timeout);
}
ScatterDataModifier::~ScatterDataModifier()
@@ -150,14 +147,6 @@ void ScatterDataModifier::changeFont(const QFont &font)
m_chart->setFont(newFont);
}
-void ScatterDataModifier::changeFontSize(int fontsize)
-{
- m_fontSize = fontsize;
- QFont font = m_chart->font();
- font.setPointSize(m_fontSize);
- m_chart->setFont(font);
-}
-
void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
{
int quality = int(sq);
@@ -165,145 +154,6 @@ void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality s
emit shadowQualityChanged(quality);
}
-void ScatterDataModifier::clear()
-{
- m_chart->activeDataProxy()->resetArray(0);
- qDebug() << m_loopCounter << "Cleared array";
-}
-
-void ScatterDataModifier::addOne()
-{
- QScatterDataItem item(randVector());
- int addIndex = m_chart->activeDataProxy()->addItem(item);
- qDebug() << m_loopCounter << "added one to index:" << addIndex << "array size:" << m_chart->activeDataProxy()->array()->size();
-}
-
-void ScatterDataModifier::addBunch()
-{
- QScatterDataArray items(100);
- for (int i = 0; i < items.size(); i++)
- items[i].setPosition(randVector());
- int addIndex = m_chart->activeDataProxy()->addItems(items);
- qDebug() << m_loopCounter << "added bunch to index:" << addIndex << "array size:" << m_chart->activeDataProxy()->array()->size();
-}
-
-void ScatterDataModifier::insertOne()
-{
- QScatterDataItem item(randVector());
- m_chart->activeDataProxy()->insertItem(0, item);
- qDebug() << m_loopCounter << "Inserted one, array size:" << m_chart->activeDataProxy()->array()->size();
-}
-
-void ScatterDataModifier::insertBunch()
-{
- QScatterDataArray items(100);
- for (int i = 0; i < items.size(); i++)
- items[i].setPosition(randVector());
- m_chart->activeDataProxy()->insertItems(0, items);
- qDebug() << m_loopCounter << "Inserted bunch, array size:" << m_chart->activeDataProxy()->array()->size();
-}
-
-void ScatterDataModifier::changeOne()
-{
- if (m_selectedItem >= 0 && m_chart->activeDataProxy()->array()->size()) {
- QScatterDataItem item(randVector());
- m_chart->activeDataProxy()->setItem(m_selectedItem, item);
- qDebug() << m_loopCounter << "Changed one, array size:" << m_chart->activeDataProxy()->array()->size();
- }
-}
-
-void ScatterDataModifier::changeBunch()
-{
- if (m_chart->activeDataProxy()->array()->size()) {
- int amount = qMin(m_chart->activeDataProxy()->array()->size(), 100);
- QScatterDataArray items(amount);
- for (int i = 0; i < items.size(); i++)
- items[i].setPosition(randVector());
- m_chart->activeDataProxy()->setItems(0, items);
- qDebug() << m_loopCounter << "Changed bunch, array size:" << m_chart->activeDataProxy()->array()->size();
- }
-}
-
-void ScatterDataModifier::removeOne()
-{
- if (m_selectedItem >= 0) {
- m_chart->activeDataProxy()->removeItems(m_selectedItem, 1);
- qDebug() << m_loopCounter << "Removed one, array size:" << m_chart->activeDataProxy()->array()->size();
- }
-}
-
-void ScatterDataModifier::removeBunch()
-{
- m_chart->activeDataProxy()->removeItems(0, 100);
- qDebug() << m_loopCounter << "Removed bunch, array size:" << m_chart->activeDataProxy()->array()->size();
-}
-
-void ScatterDataModifier::timeout()
-{
- int doWhat = rand() % 8;
- if (!(rand() % 100))
- doWhat = -1;
-
- switch (doWhat) {
- case 0:
- addOne();
- break;
- case 1:
- addBunch();
- break;
- case 2:
- insertOne();
- break;
- case 3:
- insertBunch();
- break;
- case 4:
- changeOne();
- break;
- case 5:
- changeBunch();
- break;
- case 6:
- removeOne();
- break;
- case 7:
- removeBunch();
- break;
- default:
- clear();
- break;
- }
-
- m_loopCounter++;
-}
-
-void ScatterDataModifier::startStopTimer()
-{
- if (m_timer.isActive()) {
- m_timer.stop();
- } else {
- clear();
- m_loopCounter = 0;
- m_timer.start(0);
- }
-}
-
-void ScatterDataModifier::selectItem()
-{
- int targetItem(3);
- int noSelection(-1);
- if (m_selectedItem != targetItem)
- m_chart->setSelectedItemIndex(targetItem);
- else
- m_chart->setSelectedItemIndex(noSelection);
-}
-
-void ScatterDataModifier::handleSelectionChange(int index)
-{
- m_selectedItem = index;
- qDebug() << "Selected item index:" << index;
-}
-
void ScatterDataModifier::changeShadowQuality(int quality)
{
QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
diff --git a/examples/scatterchart/scatterchart.h b/examples/scatterchart/scatterchart.h
index 4412af99..9e01f0dc 100644
--- a/examples/scatterchart/scatterchart.h
+++ b/examples/scatterchart/scatterchart.h
@@ -20,10 +20,7 @@
#define SCATTERDATAMODIFIER_H
#include <QtDataVis3D/q3dscatter.h>
-
-#include <QFont>
-#include <QDebug>
-#include <QTimer>
+#include <QtGui/QFont>
using namespace QtDataVis3D;
@@ -48,19 +45,6 @@ public:
public slots:
void changeShadowQuality(int quality);
void shadowQualityUpdatedByVisual(QDataVis::ShadowQuality shadowQuality);
- void clear();
- void addOne();
- void addBunch();
- void insertOne();
- void insertBunch();
- void changeOne();
- void changeBunch();
- void removeOne();
- void removeBunch();
- void timeout();
- void startStopTimer();
- void selectItem();
- void handleSelectionChange(int index);
signals:
void shadowQualityChanged(int quality);
@@ -69,9 +53,6 @@ private:
QVector3D randVector();
Q3DScatter *m_chart;
int m_fontSize;
- QTimer m_timer;
- int m_loopCounter;
- int m_selectedItem;
};
#endif
diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp
index 106fd2d6..017961cb 100644
--- a/examples/widget/chart.cpp
+++ b/examples/widget/chart.cpp
@@ -28,71 +28,22 @@ const QString celsiusString = QString(QChar(0xB0)) + "C";
ChartModifier::ChartModifier(Q3DBars *barchart)
: m_chart(barchart),
- m_columnCount(21),
- m_rowCount(21),
m_xRotation(0.0f),
m_yRotation(0.0f),
- m_static(true),
- m_barThicknessRatio(1.0),
- m_barSpacingX(0.1f),
- m_barSpacingZ(0.1f),
m_fontSize(20),
m_segments(4),
m_subSegments(3),
m_minval(-20.0), // TODO Barchart Y-axis currently only properly supports zero-centered ranges
m_maxval(20.0),
- m_selectedBarPos(-1, -1),
- m_autoAdjustingAxis(new QValueAxis),
- m_fixedRangeAxis(new QValueAxis),
m_temperatureAxis(new QValueAxis),
m_yearAxis(new QCategoryAxis),
m_monthAxis(new QCategoryAxis),
- m_genericRowAxis(new QCategoryAxis),
- m_genericColumnAxis(new QCategoryAxis),
- m_temperatureData(new QBarDataProxy),
- m_genericData(new QBarDataProxy),
- m_currentAxis(m_fixedRangeAxis)
+ m_temperatureData(new QBarDataProxy)
{
- // Don't set any styles or specifications, start from defaults
- // Generate generic labels
- QStringList genericRowLabels;
- QStringList genericColumnLabels;
- for (int i = 0; i < 200; i++) {
- if (i % 5)
- genericRowLabels << QString();
- else
- genericRowLabels << QStringLiteral("Row %1").arg(i);
- }
- for (int i = 0; i < 200; i++) {
- if (i % 5)
- genericColumnLabels << QString();
- else
- genericColumnLabels << QStringLiteral("Column %1").arg(i);
- }
-
m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012";
- QString labelFormat(QStringLiteral("%.3f"));
- QString axisTitle("Generic Value");
-
- m_autoAdjustingAxis->setLabelFormat(labelFormat);
- m_autoAdjustingAxis->setTitle(axisTitle);
- m_autoAdjustingAxis->setSegmentCount(m_segments * 2);
- m_autoAdjustingAxis->setSubSegmentCount(1);
- m_autoAdjustingAxis->setAutoAdjustRange(true);
-
- m_fixedRangeAxis->setLabelFormat(labelFormat);
- m_fixedRangeAxis->setTitle(axisTitle);
- m_fixedRangeAxis->setSegmentCount(m_segments);
- m_fixedRangeAxis->setSubSegmentCount(m_subSegments);
- m_fixedRangeAxis->setRange(0.0, 100.0);
-
- m_genericRowAxis->setTitle("Generic Row");
- m_genericRowAxis->setCategoryLabels(genericRowLabels);
-
- m_genericColumnAxis->setTitle("Generic Column");
- m_genericColumnAxis->setCategoryLabels(genericColumnLabels);
+ m_chart->setBackgroundVisible(false);
m_temperatureAxis->setTitle("Average temperature");
m_temperatureAxis->setSegmentCount(m_segments);
@@ -106,24 +57,20 @@ ChartModifier::ChartModifier(Q3DBars *barchart)
m_monthAxis->setTitle("Month");
m_monthAxis->setCategoryLabels(m_months);
- m_chart->addAxis(m_autoAdjustingAxis);
- m_chart->addAxis(m_fixedRangeAxis);
m_chart->addAxis(m_temperatureAxis);
m_chart->addAxis(m_yearAxis);
m_chart->addAxis(m_monthAxis);
- m_chart->addAxis(m_genericRowAxis);
- m_chart->addAxis(m_genericColumnAxis);
m_chart->setShadowQuality(QDataVis::ShadowSoftMedium);
m_temperatureData->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
- m_genericData->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel"));
m_chart->addDataProxy(m_temperatureData);
- m_chart->addDataProxy(m_genericData);
m_chart->setFont(QFont("Times Roman", 20));
+ m_chart->setSelectionMode(QDataVis::ModeItem);
+
resetTemperatureData();
}
@@ -134,92 +81,19 @@ ChartModifier::~ChartModifier()
void ChartModifier::start()
{
- restart(false);
-}
-
-void ChartModifier::restart(bool dynamicData)
-{
- m_static = !dynamicData;
-
- if (m_static) {
- m_chart->setActiveDataProxy(m_temperatureData);
-
- m_chart->setTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
-
- m_chart->setValueAxis(m_temperatureAxis);
- m_chart->setRowAxis(m_yearAxis);
- m_chart->setColumnAxis(m_monthAxis);
-
- m_chart->setDataWindow(m_years.size(), m_months.size());
- m_chart->setSelectionMode(QDataVis::ModeItem);
- } else {
- m_chart->setActiveDataProxy(m_genericData);
-
- m_chart->setTitle(QStringLiteral("Generic data"));
-
- m_chart->setValueAxis(m_currentAxis);
- m_chart->setRowAxis(m_genericRowAxis);
- m_chart->setColumnAxis(m_genericColumnAxis);
-
- m_chart->setDataWindow(m_rowCount, m_columnCount);
- m_chart->setSelectionMode(QDataVis::ModeItem);
- }
-}
-
-void ChartModifier::selectBar()
-{
- QPoint targetBar(5, 5);
- QPoint noSelection(-1, -1);
- if (m_selectedBarPos != targetBar)
- m_chart->setSelectedBarPos(targetBar);
- else
- m_chart->setSelectedBarPos(noSelection);
-}
+ m_chart->setActiveDataProxy(m_temperatureData);
-void ChartModifier::swapAxis()
-{
- static int counter = 0;
- int state = ++counter % 3;
-
- if (state == 0) {
- m_currentAxis = m_fixedRangeAxis;
- qDebug() << "Fixed range axis";
- } else if (state == 1) {
- m_currentAxis = m_autoAdjustingAxis;
- qDebug() << "Automatic range axis";
- } else {
- m_currentAxis = 0;
- qDebug() << "default axis";
- }
+ m_chart->setTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
- m_chart->setValueAxis(m_currentAxis);
-}
+ m_chart->setValueAxis(m_temperatureAxis);
+ m_chart->setRowAxis(m_yearAxis);
+ m_chart->setColumnAxis(m_monthAxis);
-void ChartModifier::releaseAxes()
-{
- // Releases all axes - results in default axes for all dimensions.
- // Axes reset when the graph is switched as set*Axis calls are made, which
- // implicitly add axes.
- m_chart->releaseAxis(m_autoAdjustingAxis);
- m_chart->releaseAxis(m_fixedRangeAxis);
- m_chart->releaseAxis(m_temperatureAxis);
- m_chart->releaseAxis(m_yearAxis);
- m_chart->releaseAxis(m_monthAxis);
- m_chart->releaseAxis(m_genericRowAxis);
- m_chart->releaseAxis(m_genericColumnAxis);
-}
-
-void ChartModifier::releaseProxies()
-{
- // Releases all proxies - results in default proxy.
- // Proxies will get readded back when graph is switched as setDataProxy call is made.
- m_chart->releaseDataProxy(m_temperatureData);
- m_chart->releaseDataProxy(m_genericData);
+ m_chart->setDataWindow(m_years.size(), m_months.size());
}
void ChartModifier::resetTemperatureData()
{
-
// Set up data
static const float temp[7][12] = {
{-6.7f, -11.7f, -9.7f, 3.3f, 9.2f, 14.0f, 16.3f, 17.8f, 10.2f, 2.1f, -2.6f, -0.3f}, // 2006
@@ -247,103 +121,13 @@ void ChartModifier::resetTemperatureData()
dataSet->append(dataRow);
}
-
// Add data to chart (chart assumes ownership)
m_temperatureData->resetArray(dataSet);
}
-void ChartModifier::addRow()
-{
- QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
- for (float i = 0; i < m_columnCount; i++) {
- (*dataRow)[i].setValue(((i + 1) / (float)m_columnCount) * (float)(rand() % 100));
- //(*dataRow)[i].setValue(i + m_chart->dataProxy()->rowCount());
- }
-
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = qMax(m_selectedBarPos.x(), 0);
- m_chart->activeDataProxy()->insertRow(row, dataRow);
-}
-
-void ChartModifier::addRows()
-{
- QTime timer;
- timer.start();
- QBarDataArray dataArray;
- for (int i = 0; i < m_rowCount; i++) {
- QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
- for (int j = 0; j < m_columnCount; j++)
- (*dataRow)[j].setValue(qreal(j + i + m_chart->activeDataProxy()->rowCount()));
- dataArray.append(dataRow);
- }
-
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = qMax(m_selectedBarPos.x(), 0);
- m_chart->activeDataProxy()->insertRows(row, dataArray);
- qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed();
-}
-
-void ChartModifier::changeItem()
-{
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = m_selectedBarPos.x();
- int column = m_selectedBarPos.y();
- if (row >= 0 && column >= 0) {
- QBarDataItem item(qreal(rand() % 100));
- m_chart->activeDataProxy()->setItem(row, column, item);
- }
-}
-
-void ChartModifier::changeRow()
-{
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = m_selectedBarPos.x();
- if (row >= 0) {
- QBarDataRow *newRow = new QBarDataRow(m_chart->activeDataProxy()->rowAt(row)->size());
- for (int i = 0; i < newRow->size(); i++)
- (*newRow)[i].setValue(qreal(rand() % 100));
- m_chart->activeDataProxy()->setRow(row, newRow);
- }
-}
-
-void ChartModifier::changeRows()
-{
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = m_selectedBarPos.x();
- if (row >= 0) {
- int startRow = qMax(row - 2, 0);
- QBarDataArray newArray;
- for (int i = startRow; i <= row; i++ ) {
- QBarDataRow *newRow = new QBarDataRow(m_chart->activeDataProxy()->rowAt(i)->size());
- for (int j = 0; j < newRow->size(); j++)
- (*newRow)[j].setValue(qreal(rand() % 100));
- newArray.append(newRow);
- }
- m_chart->activeDataProxy()->setRows(startRow, newArray);
- }
-}
-
-void ChartModifier::removeRow()
-{
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = m_selectedBarPos.x();
- if (row >= 0)
- m_chart->activeDataProxy()->removeRows(row, 1);
-}
-
-void ChartModifier::removeRows()
-{
- // TODO Needs to be changed to account for data window offset once it is implemented.
- int row = m_selectedBarPos.x();
- if (row >= 0) {
- int startRow = qMax(row - 2, 0);
- m_chart->activeDataProxy()->removeRows(startRow, 3);
- }
-}
-
void ChartModifier::changeStyle()
{
- static int model = 0;
+ static int model = 9;
switch (model) {
case 0:
m_chart->setBarType(QDataVis::Cylinders, false);
@@ -393,7 +177,7 @@ void ChartModifier::changePresetCamera()
void ChartModifier::changeTheme()
{
- static int theme = QDataVis::ThemeSystem;
+ static int theme = QDataVis::ThemeBlueCerulean;
m_chart->setTheme((QDataVis::ColorTheme)theme);
@@ -408,7 +192,7 @@ void ChartModifier::changeTransparency()
m_chart->setLabelTransparency((QDataVis::LabelTransparency)transparency);
if (++transparency > QDataVis::TransparencyNoBackground)
- transparency = QDataVis::TransparencyFromTheme;
+ transparency = QDataVis::TransparencyNone;
}
void ChartModifier::changeSelectionMode()
@@ -443,12 +227,6 @@ void ChartModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
emit shadowQualityChanged(quality);
}
-void ChartModifier::handleSelectionChange(const QPoint &position)
-{
- m_selectedBarPos = position;
- qDebug() << "Selected bar position:" << position;
-}
-
void ChartModifier::changeShadowQuality(int quality)
{
QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
@@ -456,16 +234,6 @@ void ChartModifier::changeShadowQuality(int quality)
emit shadowQualityChanged(quality);
}
-void ChartModifier::setBackgroundEnabled(int enabled)
-{
- m_chart->setBackgroundVisible((bool)enabled);
-}
-
-void ChartModifier::setGridEnabled(int enabled)
-{
- m_chart->setGridVisible((bool)enabled);
-}
-
void ChartModifier::rotateX(int rotation)
{
m_xRotation = rotation;
@@ -478,32 +246,12 @@ void ChartModifier::rotateY(int rotation)
m_chart->setCameraPosition(m_xRotation, m_yRotation);
}
-void ChartModifier::setSpecsRatio(int barwidth)
-{
- m_barThicknessRatio = (float)barwidth / 30.0f;
- m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
-}
-
-void ChartModifier::setSpacingSpecsX(int spacing)
-{
- m_barSpacingX = (float)spacing / 100.0f;
- m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
-}
-
-void ChartModifier::setSpacingSpecsZ(int spacing)
-{
- m_barSpacingZ = (float)spacing / 100.0f;
- m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
-}
-
-void ChartModifier::setSampleCountX(int samples)
+void ChartModifier::setBackgroundEnabled(int enabled)
{
- m_columnCount = samples;
- m_chart->setDataWindow(m_rowCount, m_columnCount);
+ m_chart->setBackgroundVisible((bool)enabled);
}
-void ChartModifier::setSampleCountZ(int samples)
+void ChartModifier::setGridEnabled(int enabled)
{
- m_rowCount = samples;
- m_chart->setDataWindow(m_rowCount, m_columnCount);
+ m_chart->setGridVisible((bool)enabled);
}
diff --git a/examples/widget/chart.h b/examples/widget/chart.h
index 3319df06..82745521 100644
--- a/examples/widget/chart.h
+++ b/examples/widget/chart.h
@@ -36,13 +36,6 @@ public:
~ChartModifier();
void resetTemperatureData();
- void addRow();
- void addRows();
- void changeItem();
- void changeRow();
- void changeRows();
- void removeRow();
- void removeRows();
void changeStyle();
void changePresetCamera();
void changeTheme();
@@ -54,37 +47,19 @@ public:
void rotateY(int rotation);
void setBackgroundEnabled(int enabled);
void setGridEnabled(int enabled);
- void setSpecsRatio(int barwidth);
- void setSpecsZ(int bardepth);
- void setSpacingSpecsX(int spacing);
- void setSpacingSpecsZ(int spacing);
- void setSampleCountX(int samples);
- void setSampleCountZ(int samples);
void start();
- void restart(bool dynamicData);
- void selectBar();
- void swapAxis();
- void releaseAxes();
- void releaseProxies();
public slots:
void changeShadowQuality(int quality);
void shadowQualityUpdatedByVisual(QDataVis::ShadowQuality shadowQuality);
- void handleSelectionChange(const QPoint &position);
signals:
void shadowQualityChanged(int quality);
private:
Q3DBars *m_chart;
- int m_columnCount;
- int m_rowCount;
float m_xRotation;
float m_yRotation;
- bool m_static;
- qreal m_barThicknessRatio;
- float m_barSpacingX;
- float m_barSpacingZ;
int m_fontSize;
int m_segments;
int m_subSegments;
@@ -92,17 +67,10 @@ private:
qreal m_maxval;
QStringList m_months;
QStringList m_years;
- QPoint m_selectedBarPos;
- QValueAxis *m_autoAdjustingAxis;
- QValueAxis *m_fixedRangeAxis;
QValueAxis *m_temperatureAxis;
QCategoryAxis *m_yearAxis;
QCategoryAxis *m_monthAxis;
- QCategoryAxis *m_genericRowAxis;
- QCategoryAxis *m_genericColumnAxis;
QBarDataProxy *m_temperatureData;
- QBarDataProxy *m_genericData;
- QValueAxis *m_currentAxis;
};
#endif
diff --git a/examples/widget/main.cpp b/examples/widget/main.cpp
index 98d2dbbd..76ec6dee 100644
--- a/examples/widget/main.cpp
+++ b/examples/widget/main.cpp
@@ -42,7 +42,7 @@ int main(int argc, char **argv)
QSize screenSize = widgetchart->screen()->size();
QWidget *container = QWidget::createWindowContainer(widgetchart);
- container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
container->setMaximumSize(screenSize);
container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
container->setFocusPolicy(Qt::StrongFocus);
@@ -52,34 +52,6 @@ int main(int argc, char **argv)
hLayout->addWidget(container, 1);
hLayout->addLayout(vLayout);
- QPushButton *dataButton = new QPushButton(widget);
- dataButton->setText(QStringLiteral("Insert a row of data"));
- dataButton->setEnabled(false);
-
- QPushButton *multiDataButton = new QPushButton(widget);
- multiDataButton->setText(QStringLiteral("Insert many rows of data"));
- multiDataButton->setEnabled(false);
-
- QPushButton *changeSingleDataButton = new QPushButton(widget);
- changeSingleDataButton->setText(QStringLiteral("Change selected bar value"));
- changeSingleDataButton->setEnabled(false);
-
- QPushButton *changeRowButton = new QPushButton(widget);
- changeRowButton->setText(QStringLiteral("Change selected row values"));
- changeRowButton->setEnabled(false);
-
- QPushButton *changeRowsButton = new QPushButton(widget);
- changeRowsButton->setText(QStringLiteral("Change three rows from selected"));
- changeRowsButton->setEnabled(false);
-
- QPushButton *removeRowButton = new QPushButton(widget);
- removeRowButton->setText(QStringLiteral("Remove selected row"));
- removeRowButton->setEnabled(false);
-
- QPushButton *removeRowsButton = new QPushButton(widget);
- removeRowsButton->setText(QStringLiteral("remove three rows from selected"));
- removeRowsButton->setEnabled(false);
-
QPushButton *themeButton = new QPushButton(widget);
themeButton->setText(QStringLiteral("Change theme"));
@@ -95,78 +67,24 @@ int main(int argc, char **argv)
QPushButton *selectionButton = new QPushButton(widget);
selectionButton->setText(QStringLiteral("Change selection mode"));
- QPushButton *setSelectedBarButton = new QPushButton(widget);
- setSelectedBarButton->setText(QStringLiteral("Select/deselect bar at (5,5)"));
-
- QPushButton *swapAxisButton = new QPushButton(widget);
- swapAxisButton->setText(QStringLiteral("Swap value axis"));
- swapAxisButton->setEnabled(false);
-
- QPushButton *releaseAxesButton = new QPushButton(widget);
- releaseAxesButton->setText(QStringLiteral("Release all axes"));
- releaseAxesButton->setEnabled(true);
-
- QPushButton *releaseProxiesButton = new QPushButton(widget);
- releaseProxiesButton->setText(QStringLiteral("Release all proxies"));
- releaseProxiesButton->setEnabled(true);
-
QCheckBox *backgroundCheckBox = new QCheckBox(widget);
backgroundCheckBox->setText(QStringLiteral("Show background"));
- backgroundCheckBox->setChecked(true);
+ backgroundCheckBox->setChecked(false);
QCheckBox *gridCheckBox = new QCheckBox(widget);
gridCheckBox->setText(QStringLiteral("Show grid"));
gridCheckBox->setChecked(true);
- QCheckBox *rotationCheckBox = new QCheckBox(widget);
- rotationCheckBox->setText("Rotate with slider");
-
- QCheckBox *staticCheckBox = new QCheckBox(widget);
- staticCheckBox->setText("Use dynamic data");
- staticCheckBox->setChecked(false);
-
QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
rotationSliderX->setTickInterval(1);
rotationSliderX->setMinimum(-180);
rotationSliderX->setValue(0);
rotationSliderX->setMaximum(180);
- rotationSliderX->setEnabled(false);
QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget);
rotationSliderY->setTickInterval(1);
- rotationSliderY->setMinimum(0);
+ rotationSliderY->setMinimum(-90);
rotationSliderY->setValue(0);
rotationSliderY->setMaximum(90);
- rotationSliderY->setEnabled(false);
-
- QSlider *ratioSlider = new QSlider(Qt::Horizontal, widget);
- ratioSlider->setTickInterval(1);
- ratioSlider->setMinimum(10);
- ratioSlider->setValue(30);
- ratioSlider->setMaximum(100);
-
- QSlider *spacingSliderX = new QSlider(Qt::Horizontal, widget);
- spacingSliderX->setTickInterval(1);
- spacingSliderX->setMinimum(0);
- spacingSliderX->setValue(10);
- spacingSliderX->setMaximum(200);
- QSlider *spacingSliderZ = new QSlider(Qt::Horizontal, widget);
- spacingSliderZ->setTickInterval(1);
- spacingSliderZ->setMinimum(0);
- spacingSliderZ->setValue(10);
- spacingSliderZ->setMaximum(200);
-
- QSlider *sampleSliderX = new QSlider(Qt::Horizontal, widget);
- sampleSliderX->setTickInterval(1);
- sampleSliderX->setMinimum(2);
- sampleSliderX->setValue(10);
- sampleSliderX->setMaximum(200);
- sampleSliderX->setEnabled(false);
- QSlider *sampleSliderZ = new QSlider(Qt::Horizontal, widget);
- sampleSliderZ->setTickInterval(1);
- sampleSliderZ->setMinimum(2);
- sampleSliderZ->setValue(10);
- sampleSliderZ->setMaximum(200);
- sampleSliderZ->setEnabled(false);
QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
fontSizeSlider->setTickInterval(1);
@@ -175,6 +93,7 @@ int main(int argc, char **argv)
fontSizeSlider->setMaximum(100);
QFontComboBox *fontList = new QFontComboBox(widget);
+ fontList->setCurrentFont(QFont("Arial"));
QComboBox *shadowQuality = new QComboBox(widget);
shadowQuality->addItem(QStringLiteral("None"));
@@ -186,34 +105,15 @@ int main(int argc, char **argv)
shadowQuality->addItem(QStringLiteral("High Soft"));
shadowQuality->setCurrentIndex(5);
- vLayout->addWidget(staticCheckBox, 0, Qt::AlignTop);
- vLayout->addWidget(rotationCheckBox, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally")));
vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Rotate vertically")));
vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust relative bar size")));
- vLayout->addWidget(ratioSlider, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust relative bar spacing")));
- vLayout->addWidget(spacingSliderX, 0, Qt::AlignTop);
- vLayout->addWidget(spacingSliderZ, 0, Qt::AlignTop);
- vLayout->addWidget(new QLabel(QStringLiteral("Adjust sample count")));
- vLayout->addWidget(sampleSliderX, 0, Qt::AlignTop);
- vLayout->addWidget(sampleSliderZ, 1, Qt::AlignTop);
- vLayout->addWidget(dataButton, 0, Qt::AlignTop);
- vLayout->addWidget(multiDataButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeSingleDataButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeRowButton, 0, Qt::AlignTop);
- vLayout->addWidget(changeRowsButton, 0, Qt::AlignTop);
- vLayout->addWidget(removeRowButton, 0, Qt::AlignTop);
- vLayout->addWidget(removeRowsButton, 0, Qt::AlignTop);
vLayout->addWidget(themeButton, 0, Qt::AlignTop);
vLayout->addWidget(labelButton, 0, Qt::AlignTop);
vLayout->addWidget(styleButton, 0, Qt::AlignTop);
vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
vLayout->addWidget(selectionButton, 0, Qt::AlignTop);
- vLayout->addWidget(setSelectedBarButton, 0, Qt::AlignTop);
- vLayout->addWidget(swapAxisButton, 0, Qt::AlignTop);
- vLayout->addWidget(releaseAxesButton, 0, Qt::AlignTop);
- vLayout->addWidget(releaseProxiesButton, 0, Qt::AlignTop);
vLayout->addWidget(backgroundCheckBox);
vLayout->addWidget(gridCheckBox);
vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
@@ -221,8 +121,7 @@ int main(int argc, char **argv)
vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
vLayout->addWidget(fontList);
vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
- vLayout->addWidget(fontSizeSlider, 0, Qt::AlignTop);
- // TODO: Add example for setMeshFileName
+ vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop);
widget->show();
@@ -231,17 +130,19 @@ int main(int argc, char **argv)
QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &ChartModifier::rotateX);
QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &ChartModifier::rotateY);
- QObject::connect(ratioSlider, &QSlider::valueChanged, modifier, &ChartModifier::setSpecsRatio);
-
- QObject::connect(spacingSliderX, &QSlider::valueChanged, modifier,
- &ChartModifier::setSpacingSpecsX);
- QObject::connect(spacingSliderZ, &QSlider::valueChanged, modifier,
- &ChartModifier::setSpacingSpecsZ);
+ QObject::connect(themeButton, &QPushButton::clicked, modifier, &ChartModifier::changeTheme);
+ QObject::connect(labelButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changeTransparency);
+ QObject::connect(styleButton, &QPushButton::clicked, modifier, &ChartModifier::changeStyle);
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changePresetCamera);
+ QObject::connect(selectionButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changeSelectionMode);
- QObject::connect(sampleSliderX, &QSlider::valueChanged, modifier,
- &ChartModifier::setSampleCountX);
- QObject::connect(sampleSliderZ, &QSlider::valueChanged, modifier,
- &ChartModifier::setSampleCountZ);
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &ChartModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &ChartModifier::setGridEnabled);
QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
SLOT(changeShadowQuality(int)));
@@ -249,75 +150,12 @@ int main(int argc, char **argv)
&QComboBox::setCurrentIndex);
QObject::connect(widgetchart, &Q3DBars::shadowQualityChanged, modifier,
&ChartModifier::shadowQualityUpdatedByVisual);
- QObject::connect(widgetchart, &Q3DBars::selectedBarPosChanged, modifier,
- &ChartModifier::handleSelectionChange);
QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
&ChartModifier::changeFontSize);
-
- QObject::connect(styleButton, &QPushButton::clicked, modifier, &ChartModifier::changeStyle);
- QObject::connect(cameraButton, &QPushButton::clicked, modifier,
- &ChartModifier::changePresetCamera);
- QObject::connect(themeButton, &QPushButton::clicked, modifier, &ChartModifier::changeTheme);
- QObject::connect(labelButton, &QPushButton::clicked, modifier,
- &ChartModifier::changeTransparency);
- QObject::connect(dataButton, &QPushButton::clicked, modifier, &ChartModifier::addRow);
- QObject::connect(multiDataButton, &QPushButton::clicked, modifier, &ChartModifier::addRows);
- QObject::connect(changeSingleDataButton, &QPushButton::clicked, modifier, &ChartModifier::changeItem);
- QObject::connect(changeRowButton, &QPushButton::clicked, modifier, &ChartModifier::changeRow);
- QObject::connect(changeRowsButton, &QPushButton::clicked, modifier, &ChartModifier::changeRows);
- QObject::connect(removeRowButton, &QPushButton::clicked, modifier, &ChartModifier::removeRow);
- QObject::connect(removeRowsButton, &QPushButton::clicked, modifier, &ChartModifier::removeRows);
- QObject::connect(selectionButton, &QPushButton::clicked, modifier,
- &ChartModifier::changeSelectionMode);
- QObject::connect(setSelectedBarButton, &QPushButton::clicked, modifier,
- &ChartModifier::selectBar);
- QObject::connect(swapAxisButton, &QPushButton::clicked, modifier,
- &ChartModifier::swapAxis);
- QObject::connect(releaseAxesButton, &QPushButton::clicked, modifier,
- &ChartModifier::releaseAxes);
- QObject::connect(releaseProxiesButton, &QPushButton::clicked, modifier,
- &ChartModifier::releaseProxies);
-
QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
&ChartModifier::changeFont);
- QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
- &ChartModifier::setBackgroundEnabled);
- QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
- &ChartModifier::setGridEnabled);
-
- QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderX,
- &QSlider::setEnabled);
- QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderX,
- &QSlider::setValue);
- QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderY,
- &QSlider::setEnabled);
- QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderY,
- &QSlider::setValue);
-
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, dataButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, multiDataButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeSingleDataButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeRowButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeRowsButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, removeRowButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, removeRowsButton,
- &QPushButton::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, sampleSliderX,
- &QSlider::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, sampleSliderZ,
- &QSlider::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, swapAxisButton,
- &QSlider::setEnabled);
- QObject::connect(staticCheckBox, &QCheckBox::stateChanged, modifier, &ChartModifier::restart);
-
modifier->start();
return app.exec();
diff --git a/src/datavis3d/engine/abstract3dcontroller.cpp b/src/datavis3d/engine/abstract3dcontroller.cpp
index ae6501df..441cc154 100644
--- a/src/datavis3d/engine/abstract3dcontroller.cpp
+++ b/src/datavis3d/engine/abstract3dcontroller.cpp
@@ -42,7 +42,7 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
m_font(QFont(QStringLiteral("Arial"))),
m_selectionMode(QDataVis::ModeItem),
m_shadowQuality(QDataVis::ShadowMedium),
- m_labelTransparency(QDataVis::TransparencyFromTheme),
+ m_labelTransparency(QDataVis::TransparencyNoBackground),
m_isBackgroundEnabled(true),
m_isGridEnabled(true),
m_cameraHelper(new CameraHelper()),
diff --git a/src/datavis3d/engine/bars3dcontroller.cpp b/src/datavis3d/engine/bars3dcontroller.cpp
index a2607137..0844f422 100644
--- a/src/datavis3d/engine/bars3dcontroller.cpp
+++ b/src/datavis3d/engine/bars3dcontroller.cpp
@@ -44,7 +44,7 @@ Bars3DController::Bars3DController(QRect boundRect)
m_renderer(0)
{
// Default bar type; specific to bars
- setBarType(QDataVis::Bars, false);
+ setBarType(QDataVis::BevelBars, false);
setActiveDataProxy(0);
diff --git a/tests/barstest/barstest.pro b/tests/barstest/barstest.pro
new file mode 100644
index 00000000..55fbefbd
--- /dev/null
+++ b/tests/barstest/barstest.pro
@@ -0,0 +1,10 @@
+!include( ../tests.pri ) {
+ error( "Couldn't find the tests.pri file!" )
+}
+
+SOURCES += main.cpp chart.cpp
+HEADERS += chart.h
+
+QT += widgets
+
+INSTALLS += target
diff --git a/tests/barstest/chart.cpp b/tests/barstest/chart.cpp
new file mode 100644
index 00000000..106fd2d6
--- /dev/null
+++ b/tests/barstest/chart.cpp
@@ -0,0 +1,509 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "chart.h"
+#include <QtDataVis3D/qcategoryaxis.h>
+#include <QtDataVis3D/qvalueaxis.h>
+#include <QtDataVis3D/qbardataproxy.h>
+#include <QTime>
+
+QT_DATAVIS3D_USE_NAMESPACE
+
+const QString celsiusString = QString(QChar(0xB0)) + "C";
+
+ChartModifier::ChartModifier(Q3DBars *barchart)
+ : m_chart(barchart),
+ m_columnCount(21),
+ m_rowCount(21),
+ m_xRotation(0.0f),
+ m_yRotation(0.0f),
+ m_static(true),
+ m_barThicknessRatio(1.0),
+ m_barSpacingX(0.1f),
+ m_barSpacingZ(0.1f),
+ m_fontSize(20),
+ m_segments(4),
+ m_subSegments(3),
+ m_minval(-20.0), // TODO Barchart Y-axis currently only properly supports zero-centered ranges
+ m_maxval(20.0),
+ m_selectedBarPos(-1, -1),
+ m_autoAdjustingAxis(new QValueAxis),
+ m_fixedRangeAxis(new QValueAxis),
+ m_temperatureAxis(new QValueAxis),
+ m_yearAxis(new QCategoryAxis),
+ m_monthAxis(new QCategoryAxis),
+ m_genericRowAxis(new QCategoryAxis),
+ m_genericColumnAxis(new QCategoryAxis),
+ m_temperatureData(new QBarDataProxy),
+ m_genericData(new QBarDataProxy),
+ m_currentAxis(m_fixedRangeAxis)
+{
+ // Don't set any styles or specifications, start from defaults
+ // Generate generic labels
+ QStringList genericRowLabels;
+ QStringList genericColumnLabels;
+ for (int i = 0; i < 200; i++) {
+ if (i % 5)
+ genericRowLabels << QString();
+ else
+ genericRowLabels << QStringLiteral("Row %1").arg(i);
+ }
+ for (int i = 0; i < 200; i++) {
+ if (i % 5)
+ genericColumnLabels << QString();
+ else
+ genericColumnLabels << QStringLiteral("Column %1").arg(i);
+ }
+
+ m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
+ m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012";
+
+ QString labelFormat(QStringLiteral("%.3f"));
+ QString axisTitle("Generic Value");
+
+ m_autoAdjustingAxis->setLabelFormat(labelFormat);
+ m_autoAdjustingAxis->setTitle(axisTitle);
+ m_autoAdjustingAxis->setSegmentCount(m_segments * 2);
+ m_autoAdjustingAxis->setSubSegmentCount(1);
+ m_autoAdjustingAxis->setAutoAdjustRange(true);
+
+ m_fixedRangeAxis->setLabelFormat(labelFormat);
+ m_fixedRangeAxis->setTitle(axisTitle);
+ m_fixedRangeAxis->setSegmentCount(m_segments);
+ m_fixedRangeAxis->setSubSegmentCount(m_subSegments);
+ m_fixedRangeAxis->setRange(0.0, 100.0);
+
+ m_genericRowAxis->setTitle("Generic Row");
+ m_genericRowAxis->setCategoryLabels(genericRowLabels);
+
+ m_genericColumnAxis->setTitle("Generic Column");
+ m_genericColumnAxis->setCategoryLabels(genericColumnLabels);
+
+ m_temperatureAxis->setTitle("Average temperature");
+ m_temperatureAxis->setSegmentCount(m_segments);
+ m_temperatureAxis->setSubSegmentCount(m_subSegments);
+ m_temperatureAxis->setRange(m_minval, m_maxval);
+ m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%d ") + celsiusString));
+
+ m_yearAxis->setTitle("Year");
+ m_yearAxis->setCategoryLabels(m_years);
+
+ m_monthAxis->setTitle("Month");
+ m_monthAxis->setCategoryLabels(m_months);
+
+ m_chart->addAxis(m_autoAdjustingAxis);
+ m_chart->addAxis(m_fixedRangeAxis);
+ m_chart->addAxis(m_temperatureAxis);
+ m_chart->addAxis(m_yearAxis);
+ m_chart->addAxis(m_monthAxis);
+ m_chart->addAxis(m_genericRowAxis);
+ m_chart->addAxis(m_genericColumnAxis);
+
+ m_chart->setShadowQuality(QDataVis::ShadowSoftMedium);
+
+ m_temperatureData->setItemLabelFormat(QStringLiteral("@valueTitle for @colLabel @rowLabel: @valueLabel"));
+ m_genericData->setItemLabelFormat(QStringLiteral("@valueTitle for (@rowIdx, @colIdx): @valueLabel"));
+
+ m_chart->addDataProxy(m_temperatureData);
+ m_chart->addDataProxy(m_genericData);
+
+ m_chart->setFont(QFont("Times Roman", 20));
+
+ resetTemperatureData();
+}
+
+ChartModifier::~ChartModifier()
+{
+ delete m_chart;
+}
+
+void ChartModifier::start()
+{
+ restart(false);
+}
+
+void ChartModifier::restart(bool dynamicData)
+{
+ m_static = !dynamicData;
+
+ if (m_static) {
+ m_chart->setActiveDataProxy(m_temperatureData);
+
+ m_chart->setTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
+
+ m_chart->setValueAxis(m_temperatureAxis);
+ m_chart->setRowAxis(m_yearAxis);
+ m_chart->setColumnAxis(m_monthAxis);
+
+ m_chart->setDataWindow(m_years.size(), m_months.size());
+ m_chart->setSelectionMode(QDataVis::ModeItem);
+ } else {
+ m_chart->setActiveDataProxy(m_genericData);
+
+ m_chart->setTitle(QStringLiteral("Generic data"));
+
+ m_chart->setValueAxis(m_currentAxis);
+ m_chart->setRowAxis(m_genericRowAxis);
+ m_chart->setColumnAxis(m_genericColumnAxis);
+
+ m_chart->setDataWindow(m_rowCount, m_columnCount);
+ m_chart->setSelectionMode(QDataVis::ModeItem);
+ }
+}
+
+void ChartModifier::selectBar()
+{
+ QPoint targetBar(5, 5);
+ QPoint noSelection(-1, -1);
+ if (m_selectedBarPos != targetBar)
+ m_chart->setSelectedBarPos(targetBar);
+ else
+ m_chart->setSelectedBarPos(noSelection);
+}
+
+void ChartModifier::swapAxis()
+{
+ static int counter = 0;
+ int state = ++counter % 3;
+
+ if (state == 0) {
+ m_currentAxis = m_fixedRangeAxis;
+ qDebug() << "Fixed range axis";
+ } else if (state == 1) {
+ m_currentAxis = m_autoAdjustingAxis;
+ qDebug() << "Automatic range axis";
+ } else {
+ m_currentAxis = 0;
+ qDebug() << "default axis";
+ }
+
+ m_chart->setValueAxis(m_currentAxis);
+}
+
+void ChartModifier::releaseAxes()
+{
+ // Releases all axes - results in default axes for all dimensions.
+ // Axes reset when the graph is switched as set*Axis calls are made, which
+ // implicitly add axes.
+ m_chart->releaseAxis(m_autoAdjustingAxis);
+ m_chart->releaseAxis(m_fixedRangeAxis);
+ m_chart->releaseAxis(m_temperatureAxis);
+ m_chart->releaseAxis(m_yearAxis);
+ m_chart->releaseAxis(m_monthAxis);
+ m_chart->releaseAxis(m_genericRowAxis);
+ m_chart->releaseAxis(m_genericColumnAxis);
+}
+
+void ChartModifier::releaseProxies()
+{
+ // Releases all proxies - results in default proxy.
+ // Proxies will get readded back when graph is switched as setDataProxy call is made.
+ m_chart->releaseDataProxy(m_temperatureData);
+ m_chart->releaseDataProxy(m_genericData);
+}
+
+void ChartModifier::resetTemperatureData()
+{
+
+ // Set up data
+ static const float temp[7][12] = {
+ {-6.7f, -11.7f, -9.7f, 3.3f, 9.2f, 14.0f, 16.3f, 17.8f, 10.2f, 2.1f, -2.6f, -0.3f}, // 2006
+ {-6.8f, -13.3f, 0.2f, 1.5f, 7.9f, 13.4f, 16.1f, 15.5f, 8.2f, 5.4f, -2.6f, -0.8f}, // 2007
+ {-4.2f, -4.0f, -4.6f, 1.9f, 7.3f, 12.5f, 15.0f, 12.8f, 7.6f, 5.1f, -0.9f, -1.3f}, // 2008
+ {-7.8f, -8.8f, -4.2f, 0.7f, 9.3f, 13.2f, 15.8f, 15.5f, 11.2f, 0.6f, 0.7f, -8.4f}, // 2009
+ {-14.4f, -12.1f, -7.0f, 2.3f, 11.0f, 12.6f, 18.8f, 13.8f, 9.4f, 3.9f, -5.6f, -13.0f}, // 2010
+ {-9.0f, -15.2f, -3.8f, 2.6f, 8.3f, 15.9f, 18.6f, 14.9f, 11.1f, 5.3f, 1.8f, -0.2f}, // 2011
+ {-8.7f, -11.3f, -2.3f, 0.4f, 7.5f, 12.2f, 16.4f, 14.1f, 9.2f, 3.1f, 0.3f, -12.1f} // 2012
+ };
+
+ // Create data rows
+ QBarDataArray *dataSet = new QBarDataArray;
+ QBarDataRow *dataRow;
+
+ dataSet->reserve(m_years.size());
+ for (int year = 0; year < m_years.size(); year++) {
+ dataRow = new QBarDataRow(m_months.size());
+ // Create data items
+ for (int month = 0; month < m_months.size(); month++) {
+ // Add data to rows
+ (*dataRow)[month].setValue(temp[year][month]);
+ }
+ // Add row to set
+ dataSet->append(dataRow);
+ }
+
+
+ // Add data to chart (chart assumes ownership)
+ m_temperatureData->resetArray(dataSet);
+}
+
+void ChartModifier::addRow()
+{
+ QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
+ for (float i = 0; i < m_columnCount; i++) {
+ (*dataRow)[i].setValue(((i + 1) / (float)m_columnCount) * (float)(rand() % 100));
+ //(*dataRow)[i].setValue(i + m_chart->dataProxy()->rowCount());
+ }
+
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = qMax(m_selectedBarPos.x(), 0);
+ m_chart->activeDataProxy()->insertRow(row, dataRow);
+}
+
+void ChartModifier::addRows()
+{
+ QTime timer;
+ timer.start();
+ QBarDataArray dataArray;
+ for (int i = 0; i < m_rowCount; i++) {
+ QBarDataRow *dataRow = new QBarDataRow(m_columnCount);
+ for (int j = 0; j < m_columnCount; j++)
+ (*dataRow)[j].setValue(qreal(j + i + m_chart->activeDataProxy()->rowCount()));
+ dataArray.append(dataRow);
+ }
+
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = qMax(m_selectedBarPos.x(), 0);
+ m_chart->activeDataProxy()->insertRows(row, dataArray);
+ qDebug() << "Added" << m_rowCount << "rows, time:" << timer.elapsed();
+}
+
+void ChartModifier::changeItem()
+{
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = m_selectedBarPos.x();
+ int column = m_selectedBarPos.y();
+ if (row >= 0 && column >= 0) {
+ QBarDataItem item(qreal(rand() % 100));
+ m_chart->activeDataProxy()->setItem(row, column, item);
+ }
+}
+
+void ChartModifier::changeRow()
+{
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = m_selectedBarPos.x();
+ if (row >= 0) {
+ QBarDataRow *newRow = new QBarDataRow(m_chart->activeDataProxy()->rowAt(row)->size());
+ for (int i = 0; i < newRow->size(); i++)
+ (*newRow)[i].setValue(qreal(rand() % 100));
+ m_chart->activeDataProxy()->setRow(row, newRow);
+ }
+}
+
+void ChartModifier::changeRows()
+{
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = m_selectedBarPos.x();
+ if (row >= 0) {
+ int startRow = qMax(row - 2, 0);
+ QBarDataArray newArray;
+ for (int i = startRow; i <= row; i++ ) {
+ QBarDataRow *newRow = new QBarDataRow(m_chart->activeDataProxy()->rowAt(i)->size());
+ for (int j = 0; j < newRow->size(); j++)
+ (*newRow)[j].setValue(qreal(rand() % 100));
+ newArray.append(newRow);
+ }
+ m_chart->activeDataProxy()->setRows(startRow, newArray);
+ }
+}
+
+void ChartModifier::removeRow()
+{
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = m_selectedBarPos.x();
+ if (row >= 0)
+ m_chart->activeDataProxy()->removeRows(row, 1);
+}
+
+void ChartModifier::removeRows()
+{
+ // TODO Needs to be changed to account for data window offset once it is implemented.
+ int row = m_selectedBarPos.x();
+ if (row >= 0) {
+ int startRow = qMax(row - 2, 0);
+ m_chart->activeDataProxy()->removeRows(startRow, 3);
+ }
+}
+
+void ChartModifier::changeStyle()
+{
+ static int model = 0;
+ switch (model) {
+ case 0:
+ m_chart->setBarType(QDataVis::Cylinders, false);
+ break;
+ case 1:
+ m_chart->setBarType(QDataVis::Cylinders, true);
+ break;
+ case 2:
+ m_chart->setBarType(QDataVis::Cones, false);
+ break;
+ case 3:
+ m_chart->setBarType(QDataVis::Cones, true);
+ break;
+ case 4:
+ m_chart->setBarType(QDataVis::Bars, false);
+ break;
+ case 5:
+ m_chart->setBarType(QDataVis::Bars, true);
+ break;
+ case 6:
+ m_chart->setBarType(QDataVis::Pyramids, false);
+ break;
+ case 7:
+ m_chart->setBarType(QDataVis::Pyramids, true);
+ break;
+ case 8:
+ m_chart->setBarType(QDataVis::BevelBars, false);
+ break;
+ case 9:
+ m_chart->setBarType(QDataVis::BevelBars, true);
+ break;
+ }
+ model++;
+ if (model > 9)
+ model = 0;
+}
+
+void ChartModifier::changePresetCamera()
+{
+ static int preset = QDataVis::PresetFrontLow;
+
+ m_chart->setCameraPreset((QDataVis::CameraPreset)preset);
+
+ if (++preset > QDataVis::PresetDirectlyBelow)
+ preset = QDataVis::PresetFrontLow;
+}
+
+void ChartModifier::changeTheme()
+{
+ static int theme = QDataVis::ThemeSystem;
+
+ m_chart->setTheme((QDataVis::ColorTheme)theme);
+
+ if (++theme > QDataVis::ThemeLight)
+ theme = QDataVis::ThemeSystem;
+}
+
+void ChartModifier::changeTransparency()
+{
+ static int transparency = QDataVis::TransparencyNone;
+
+ m_chart->setLabelTransparency((QDataVis::LabelTransparency)transparency);
+
+ if (++transparency > QDataVis::TransparencyNoBackground)
+ transparency = QDataVis::TransparencyFromTheme;
+}
+
+void ChartModifier::changeSelectionMode()
+{
+ static int selectionMode = m_chart->selectionMode();
+
+ if (++selectionMode > QDataVis::ModeSliceColumn)
+ selectionMode = QDataVis::ModeNone;
+
+ m_chart->setSelectionMode((QDataVis::SelectionMode)selectionMode);
+}
+
+void ChartModifier::changeFont(const QFont &font)
+{
+ QFont newFont = font;
+ newFont.setPointSize(m_fontSize);
+ m_chart->setFont(newFont);
+}
+
+void ChartModifier::changeFontSize(int fontsize)
+{
+ m_fontSize = fontsize;
+ QFont font = m_chart->font();
+ font.setPointSize(m_fontSize);
+ m_chart->setFont(font);
+}
+
+void ChartModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
+{
+ int quality = int(sq);
+ // Updates the UI component to show correct shadow quality
+ emit shadowQualityChanged(quality);
+}
+
+void ChartModifier::handleSelectionChange(const QPoint &position)
+{
+ m_selectedBarPos = position;
+ qDebug() << "Selected bar position:" << position;
+}
+
+void ChartModifier::changeShadowQuality(int quality)
+{
+ QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
+ m_chart->setShadowQuality(sq);
+ emit shadowQualityChanged(quality);
+}
+
+void ChartModifier::setBackgroundEnabled(int enabled)
+{
+ m_chart->setBackgroundVisible((bool)enabled);
+}
+
+void ChartModifier::setGridEnabled(int enabled)
+{
+ m_chart->setGridVisible((bool)enabled);
+}
+
+void ChartModifier::rotateX(int rotation)
+{
+ m_xRotation = rotation;
+ m_chart->setCameraPosition(m_xRotation, m_yRotation);
+}
+
+void ChartModifier::rotateY(int rotation)
+{
+ m_yRotation = rotation;
+ m_chart->setCameraPosition(m_xRotation, m_yRotation);
+}
+
+void ChartModifier::setSpecsRatio(int barwidth)
+{
+ m_barThicknessRatio = (float)barwidth / 30.0f;
+ m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
+}
+
+void ChartModifier::setSpacingSpecsX(int spacing)
+{
+ m_barSpacingX = (float)spacing / 100.0f;
+ m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
+}
+
+void ChartModifier::setSpacingSpecsZ(int spacing)
+{
+ m_barSpacingZ = (float)spacing / 100.0f;
+ m_chart->setBarSpecs(m_barThicknessRatio, QSizeF(m_barSpacingX, m_barSpacingZ));
+}
+
+void ChartModifier::setSampleCountX(int samples)
+{
+ m_columnCount = samples;
+ m_chart->setDataWindow(m_rowCount, m_columnCount);
+}
+
+void ChartModifier::setSampleCountZ(int samples)
+{
+ m_rowCount = samples;
+ m_chart->setDataWindow(m_rowCount, m_columnCount);
+}
diff --git a/tests/barstest/chart.h b/tests/barstest/chart.h
new file mode 100644
index 00000000..3319df06
--- /dev/null
+++ b/tests/barstest/chart.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 CHARTMODIFIER_H
+#define CHARTMODIFIER_H
+
+#include <QtDataVis3D/q3dbars.h>
+
+#include <QFont>
+#include <QDebug>
+#include <QStringList>
+#include <QPointer>
+
+using namespace QtDataVis3D;
+
+class ChartModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit ChartModifier(Q3DBars *barchart);
+ ~ChartModifier();
+
+ void resetTemperatureData();
+ void addRow();
+ void addRows();
+ void changeItem();
+ void changeRow();
+ void changeRows();
+ void removeRow();
+ void removeRows();
+ void changeStyle();
+ void changePresetCamera();
+ void changeTheme();
+ void changeTransparency();
+ void changeSelectionMode();
+ void changeFont(const QFont &font);
+ void changeFontSize(int fontsize);
+ void rotateX(int rotation);
+ void rotateY(int rotation);
+ void setBackgroundEnabled(int enabled);
+ void setGridEnabled(int enabled);
+ void setSpecsRatio(int barwidth);
+ void setSpecsZ(int bardepth);
+ void setSpacingSpecsX(int spacing);
+ void setSpacingSpecsZ(int spacing);
+ void setSampleCountX(int samples);
+ void setSampleCountZ(int samples);
+ void start();
+ void restart(bool dynamicData);
+ void selectBar();
+ void swapAxis();
+ void releaseAxes();
+ void releaseProxies();
+
+public slots:
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QDataVis::ShadowQuality shadowQuality);
+ void handleSelectionChange(const QPoint &position);
+
+signals:
+ void shadowQualityChanged(int quality);
+
+private:
+ Q3DBars *m_chart;
+ int m_columnCount;
+ int m_rowCount;
+ float m_xRotation;
+ float m_yRotation;
+ bool m_static;
+ qreal m_barThicknessRatio;
+ float m_barSpacingX;
+ float m_barSpacingZ;
+ int m_fontSize;
+ int m_segments;
+ int m_subSegments;
+ qreal m_minval;
+ qreal m_maxval;
+ QStringList m_months;
+ QStringList m_years;
+ QPoint m_selectedBarPos;
+ QValueAxis *m_autoAdjustingAxis;
+ QValueAxis *m_fixedRangeAxis;
+ QValueAxis *m_temperatureAxis;
+ QCategoryAxis *m_yearAxis;
+ QCategoryAxis *m_monthAxis;
+ QCategoryAxis *m_genericRowAxis;
+ QCategoryAxis *m_genericColumnAxis;
+ QBarDataProxy *m_temperatureData;
+ QBarDataProxy *m_genericData;
+ QValueAxis *m_currentAxis;
+};
+
+#endif
diff --git a/tests/barstest/main.cpp b/tests/barstest/main.cpp
new file mode 100644
index 00000000..98d2dbbd
--- /dev/null
+++ b/tests/barstest/main.cpp
@@ -0,0 +1,324 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "chart.h"
+
+#include <QApplication>
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QCheckBox>
+#include <QSlider>
+#include <QFontComboBox>
+#include <QLabel>
+#include <QScreen>
+#include <QFontDatabase>
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+
+ QWidget *widget = new QWidget;
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ QVBoxLayout *vLayout = new QVBoxLayout();
+
+ Q3DBars *widgetchart = new Q3DBars();
+ QSize screenSize = widgetchart->screen()->size();
+
+ QWidget *container = QWidget::createWindowContainer(widgetchart);
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu, Finland (2006-2012)"));
+
+ hLayout->addWidget(container, 1);
+ hLayout->addLayout(vLayout);
+
+ QPushButton *dataButton = new QPushButton(widget);
+ dataButton->setText(QStringLiteral("Insert a row of data"));
+ dataButton->setEnabled(false);
+
+ QPushButton *multiDataButton = new QPushButton(widget);
+ multiDataButton->setText(QStringLiteral("Insert many rows of data"));
+ multiDataButton->setEnabled(false);
+
+ QPushButton *changeSingleDataButton = new QPushButton(widget);
+ changeSingleDataButton->setText(QStringLiteral("Change selected bar value"));
+ changeSingleDataButton->setEnabled(false);
+
+ QPushButton *changeRowButton = new QPushButton(widget);
+ changeRowButton->setText(QStringLiteral("Change selected row values"));
+ changeRowButton->setEnabled(false);
+
+ QPushButton *changeRowsButton = new QPushButton(widget);
+ changeRowsButton->setText(QStringLiteral("Change three rows from selected"));
+ changeRowsButton->setEnabled(false);
+
+ QPushButton *removeRowButton = new QPushButton(widget);
+ removeRowButton->setText(QStringLiteral("Remove selected row"));
+ removeRowButton->setEnabled(false);
+
+ QPushButton *removeRowsButton = new QPushButton(widget);
+ removeRowsButton->setText(QStringLiteral("remove three rows from selected"));
+ removeRowsButton->setEnabled(false);
+
+ QPushButton *themeButton = new QPushButton(widget);
+ themeButton->setText(QStringLiteral("Change theme"));
+
+ QPushButton *labelButton = new QPushButton(widget);
+ labelButton->setText(QStringLiteral("Change label style"));
+
+ QPushButton *styleButton = new QPushButton(widget);
+ styleButton->setText(QStringLiteral("Change bar style"));
+
+ QPushButton *cameraButton = new QPushButton(widget);
+ cameraButton->setText(QStringLiteral("Change camera preset"));
+
+ QPushButton *selectionButton = new QPushButton(widget);
+ selectionButton->setText(QStringLiteral("Change selection mode"));
+
+ QPushButton *setSelectedBarButton = new QPushButton(widget);
+ setSelectedBarButton->setText(QStringLiteral("Select/deselect bar at (5,5)"));
+
+ QPushButton *swapAxisButton = new QPushButton(widget);
+ swapAxisButton->setText(QStringLiteral("Swap value axis"));
+ swapAxisButton->setEnabled(false);
+
+ QPushButton *releaseAxesButton = new QPushButton(widget);
+ releaseAxesButton->setText(QStringLiteral("Release all axes"));
+ releaseAxesButton->setEnabled(true);
+
+ QPushButton *releaseProxiesButton = new QPushButton(widget);
+ releaseProxiesButton->setText(QStringLiteral("Release all proxies"));
+ releaseProxiesButton->setEnabled(true);
+
+ QCheckBox *backgroundCheckBox = new QCheckBox(widget);
+ backgroundCheckBox->setText(QStringLiteral("Show background"));
+ backgroundCheckBox->setChecked(true);
+
+ QCheckBox *gridCheckBox = new QCheckBox(widget);
+ gridCheckBox->setText(QStringLiteral("Show grid"));
+ gridCheckBox->setChecked(true);
+
+ QCheckBox *rotationCheckBox = new QCheckBox(widget);
+ rotationCheckBox->setText("Rotate with slider");
+
+ QCheckBox *staticCheckBox = new QCheckBox(widget);
+ staticCheckBox->setText("Use dynamic data");
+ staticCheckBox->setChecked(false);
+
+ QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
+ rotationSliderX->setTickInterval(1);
+ rotationSliderX->setMinimum(-180);
+ rotationSliderX->setValue(0);
+ rotationSliderX->setMaximum(180);
+ rotationSliderX->setEnabled(false);
+ QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget);
+ rotationSliderY->setTickInterval(1);
+ rotationSliderY->setMinimum(0);
+ rotationSliderY->setValue(0);
+ rotationSliderY->setMaximum(90);
+ rotationSliderY->setEnabled(false);
+
+ QSlider *ratioSlider = new QSlider(Qt::Horizontal, widget);
+ ratioSlider->setTickInterval(1);
+ ratioSlider->setMinimum(10);
+ ratioSlider->setValue(30);
+ ratioSlider->setMaximum(100);
+
+ QSlider *spacingSliderX = new QSlider(Qt::Horizontal, widget);
+ spacingSliderX->setTickInterval(1);
+ spacingSliderX->setMinimum(0);
+ spacingSliderX->setValue(10);
+ spacingSliderX->setMaximum(200);
+ QSlider *spacingSliderZ = new QSlider(Qt::Horizontal, widget);
+ spacingSliderZ->setTickInterval(1);
+ spacingSliderZ->setMinimum(0);
+ spacingSliderZ->setValue(10);
+ spacingSliderZ->setMaximum(200);
+
+ QSlider *sampleSliderX = new QSlider(Qt::Horizontal, widget);
+ sampleSliderX->setTickInterval(1);
+ sampleSliderX->setMinimum(2);
+ sampleSliderX->setValue(10);
+ sampleSliderX->setMaximum(200);
+ sampleSliderX->setEnabled(false);
+ QSlider *sampleSliderZ = new QSlider(Qt::Horizontal, widget);
+ sampleSliderZ->setTickInterval(1);
+ sampleSliderZ->setMinimum(2);
+ sampleSliderZ->setValue(10);
+ sampleSliderZ->setMaximum(200);
+ sampleSliderZ->setEnabled(false);
+
+ QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
+ fontSizeSlider->setTickInterval(1);
+ fontSizeSlider->setMinimum(1);
+ fontSizeSlider->setValue(20);
+ fontSizeSlider->setMaximum(100);
+
+ QFontComboBox *fontList = new QFontComboBox(widget);
+
+ 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(5);
+
+ vLayout->addWidget(staticCheckBox, 0, Qt::AlignTop);
+ vLayout->addWidget(rotationCheckBox, 0, Qt::AlignTop);
+ vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
+ vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust relative bar size")));
+ vLayout->addWidget(ratioSlider, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust relative bar spacing")));
+ vLayout->addWidget(spacingSliderX, 0, Qt::AlignTop);
+ vLayout->addWidget(spacingSliderZ, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust sample count")));
+ vLayout->addWidget(sampleSliderX, 0, Qt::AlignTop);
+ vLayout->addWidget(sampleSliderZ, 1, Qt::AlignTop);
+ vLayout->addWidget(dataButton, 0, Qt::AlignTop);
+ vLayout->addWidget(multiDataButton, 0, Qt::AlignTop);
+ vLayout->addWidget(changeSingleDataButton, 0, Qt::AlignTop);
+ vLayout->addWidget(changeRowButton, 0, Qt::AlignTop);
+ vLayout->addWidget(changeRowsButton, 0, Qt::AlignTop);
+ vLayout->addWidget(removeRowButton, 0, Qt::AlignTop);
+ vLayout->addWidget(removeRowsButton, 0, Qt::AlignTop);
+ vLayout->addWidget(themeButton, 0, Qt::AlignTop);
+ vLayout->addWidget(labelButton, 0, Qt::AlignTop);
+ vLayout->addWidget(styleButton, 0, Qt::AlignTop);
+ vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(selectionButton, 0, Qt::AlignTop);
+ vLayout->addWidget(setSelectedBarButton, 0, Qt::AlignTop);
+ vLayout->addWidget(swapAxisButton, 0, Qt::AlignTop);
+ vLayout->addWidget(releaseAxesButton, 0, Qt::AlignTop);
+ vLayout->addWidget(releaseProxiesButton, 0, Qt::AlignTop);
+ vLayout->addWidget(backgroundCheckBox);
+ vLayout->addWidget(gridCheckBox);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
+ vLayout->addWidget(shadowQuality);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
+ vLayout->addWidget(fontList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
+ vLayout->addWidget(fontSizeSlider, 0, Qt::AlignTop);
+ // TODO: Add example for setMeshFileName
+
+ widget->show();
+
+ ChartModifier *modifier = new ChartModifier(widgetchart);
+
+ QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &ChartModifier::rotateX);
+ QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &ChartModifier::rotateY);
+
+ QObject::connect(ratioSlider, &QSlider::valueChanged, modifier, &ChartModifier::setSpecsRatio);
+
+ QObject::connect(spacingSliderX, &QSlider::valueChanged, modifier,
+ &ChartModifier::setSpacingSpecsX);
+ QObject::connect(spacingSliderZ, &QSlider::valueChanged, modifier,
+ &ChartModifier::setSpacingSpecsZ);
+
+ QObject::connect(sampleSliderX, &QSlider::valueChanged, modifier,
+ &ChartModifier::setSampleCountX);
+ QObject::connect(sampleSliderZ, &QSlider::valueChanged, modifier,
+ &ChartModifier::setSampleCountZ);
+
+ QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeShadowQuality(int)));
+ QObject::connect(modifier, &ChartModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+ QObject::connect(widgetchart, &Q3DBars::shadowQualityChanged, modifier,
+ &ChartModifier::shadowQualityUpdatedByVisual);
+ QObject::connect(widgetchart, &Q3DBars::selectedBarPosChanged, modifier,
+ &ChartModifier::handleSelectionChange);
+
+ QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
+ &ChartModifier::changeFontSize);
+
+ QObject::connect(styleButton, &QPushButton::clicked, modifier, &ChartModifier::changeStyle);
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changePresetCamera);
+ QObject::connect(themeButton, &QPushButton::clicked, modifier, &ChartModifier::changeTheme);
+ QObject::connect(labelButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changeTransparency);
+ QObject::connect(dataButton, &QPushButton::clicked, modifier, &ChartModifier::addRow);
+ QObject::connect(multiDataButton, &QPushButton::clicked, modifier, &ChartModifier::addRows);
+ QObject::connect(changeSingleDataButton, &QPushButton::clicked, modifier, &ChartModifier::changeItem);
+ QObject::connect(changeRowButton, &QPushButton::clicked, modifier, &ChartModifier::changeRow);
+ QObject::connect(changeRowsButton, &QPushButton::clicked, modifier, &ChartModifier::changeRows);
+ QObject::connect(removeRowButton, &QPushButton::clicked, modifier, &ChartModifier::removeRow);
+ QObject::connect(removeRowsButton, &QPushButton::clicked, modifier, &ChartModifier::removeRows);
+ QObject::connect(selectionButton, &QPushButton::clicked, modifier,
+ &ChartModifier::changeSelectionMode);
+ QObject::connect(setSelectedBarButton, &QPushButton::clicked, modifier,
+ &ChartModifier::selectBar);
+ QObject::connect(swapAxisButton, &QPushButton::clicked, modifier,
+ &ChartModifier::swapAxis);
+ QObject::connect(releaseAxesButton, &QPushButton::clicked, modifier,
+ &ChartModifier::releaseAxes);
+ QObject::connect(releaseProxiesButton, &QPushButton::clicked, modifier,
+ &ChartModifier::releaseProxies);
+
+ QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
+ &ChartModifier::changeFont);
+
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &ChartModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &ChartModifier::setGridEnabled);
+
+ QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderX,
+ &QSlider::setEnabled);
+ QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderX,
+ &QSlider::setValue);
+ QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderY,
+ &QSlider::setEnabled);
+ QObject::connect(rotationCheckBox, &QCheckBox::stateChanged, rotationSliderY,
+ &QSlider::setValue);
+
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, dataButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, multiDataButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeSingleDataButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeRowButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, changeRowsButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, removeRowButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, removeRowsButton,
+ &QPushButton::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, sampleSliderX,
+ &QSlider::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, sampleSliderZ,
+ &QSlider::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, swapAxisButton,
+ &QSlider::setEnabled);
+ QObject::connect(staticCheckBox, &QCheckBox::stateChanged, modifier, &ChartModifier::restart);
+
+ modifier->start();
+
+ return app.exec();
+}
diff --git a/tests/scattertest/main.cpp b/tests/scattertest/main.cpp
new file mode 100644
index 00000000..b0135ef3
--- /dev/null
+++ b/tests/scattertest/main.cpp
@@ -0,0 +1,209 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "scatterchart.h"
+
+#include <QApplication>
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QCheckBox>
+#include <QSlider>
+#include <QComboBox>
+#include <QFontComboBox>
+#include <QLabel>
+#include <QScreen>
+#include <QFontDatabase>
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+
+ QWidget *widget = new QWidget;
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ QVBoxLayout *vLayout = new QVBoxLayout();
+
+ Q3DScatter *chart = new Q3DScatter();
+ QSize screenSize = chart->screen()->size();
+
+ QWidget *container = QWidget::createWindowContainer(chart);
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ widget->setWindowTitle(QStringLiteral("values of some things in something"));
+
+ hLayout->addWidget(container, 1);
+ hLayout->addLayout(vLayout);
+
+ QPushButton *themeButton = new QPushButton(widget);
+ themeButton->setText(QStringLiteral("Change theme"));
+
+ QPushButton *labelButton = new QPushButton(widget);
+ labelButton->setText(QStringLiteral("Change label style"));
+
+ QPushButton *styleButton = new QPushButton(widget);
+ styleButton->setText(QStringLiteral("Change item style"));
+
+ QPushButton *cameraButton = new QPushButton(widget);
+ cameraButton->setText(QStringLiteral("Change camera preset"));
+
+ QPushButton *clearButton = new QPushButton(widget);
+ clearButton->setText(QStringLiteral("Clear chart"));
+
+ QPushButton *addOneButton = new QPushButton(widget);
+ addOneButton->setText(QStringLiteral("Add item"));
+
+ QPushButton *addBunchButton = new QPushButton(widget);
+ addBunchButton->setText(QStringLiteral("Add bunch of items"));
+
+ QPushButton *insertOneButton = new QPushButton(widget);
+ insertOneButton->setText(QStringLiteral("Insert item"));
+
+ QPushButton *insertBunchButton = new QPushButton(widget);
+ insertBunchButton->setText(QStringLiteral("Insert bunch of items"));
+
+ QPushButton *changeOneButton = new QPushButton(widget);
+ changeOneButton->setText(QStringLiteral("Change selected item"));
+
+ QPushButton *changeBunchButton = new QPushButton(widget);
+ changeBunchButton->setText(QStringLiteral("Change bunch of items"));
+
+ QPushButton *removeOneButton = new QPushButton(widget);
+ removeOneButton->setText(QStringLiteral("Remove selected item"));
+
+ QPushButton *removeBunchButton = new QPushButton(widget);
+ removeBunchButton->setText(QStringLiteral("Remove bunch of items"));
+
+ QPushButton *setSelectedItemButton = new QPushButton(widget);
+ setSelectedItemButton->setText(QStringLiteral("Select/deselect item 3"));
+
+ QPushButton *startTimerButton = new QPushButton(widget);
+ startTimerButton->setText(QStringLiteral("Start/stop timer"));
+
+ QCheckBox *backgroundCheckBox = new QCheckBox(widget);
+ backgroundCheckBox->setText(QStringLiteral("Show background"));
+ backgroundCheckBox->setChecked(true);
+
+ QCheckBox *gridCheckBox = new QCheckBox(widget);
+ gridCheckBox->setText(QStringLiteral("Show grid"));
+ gridCheckBox->setChecked(true);
+
+ 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);
+
+ QFontComboBox *fontList = new QFontComboBox(widget);
+
+ QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
+ fontSizeSlider->setTickInterval(1);
+ fontSizeSlider->setMinimum(1);
+ fontSizeSlider->setValue(30);
+ fontSizeSlider->setMaximum(200);
+
+ vLayout->addWidget(themeButton, 0, Qt::AlignTop);
+ vLayout->addWidget(labelButton, 0, Qt::AlignTop);
+ vLayout->addWidget(styleButton, 0, Qt::AlignTop);
+ vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(clearButton, 0, Qt::AlignTop);
+ vLayout->addWidget(addOneButton, 0, Qt::AlignTop);
+ vLayout->addWidget(addBunchButton, 0, Qt::AlignTop);
+ vLayout->addWidget(insertOneButton, 0, Qt::AlignTop);
+ vLayout->addWidget(insertBunchButton, 0, Qt::AlignTop);
+ vLayout->addWidget(changeOneButton, 0, Qt::AlignTop);
+ vLayout->addWidget(changeBunchButton, 0, Qt::AlignTop);
+ vLayout->addWidget(removeOneButton, 0, Qt::AlignTop);
+ vLayout->addWidget(removeBunchButton, 0, Qt::AlignTop);
+ vLayout->addWidget(setSelectedItemButton, 0, Qt::AlignTop);
+ vLayout->addWidget(startTimerButton, 0, Qt::AlignTop);
+ vLayout->addWidget(backgroundCheckBox);
+ vLayout->addWidget(gridCheckBox);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
+ vLayout->addWidget(shadowQuality);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
+ vLayout->addWidget(fontList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
+ vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop);
+
+ widget->show();
+
+ ScatterDataModifier *modifier = new ScatterDataModifier(chart);
+
+ QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
+ &ScatterDataModifier::changeFontSize);
+
+ QObject::connect(styleButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changeStyle);
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changePresetCamera);
+ QObject::connect(clearButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::clear);
+ QObject::connect(addOneButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::addOne);
+ QObject::connect(addBunchButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::addBunch);
+ QObject::connect(insertOneButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::insertOne);
+ QObject::connect(insertBunchButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::insertBunch);
+ QObject::connect(changeOneButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changeOne);
+ QObject::connect(changeBunchButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changeBunch);
+ QObject::connect(removeOneButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::removeOne);
+ QObject::connect(removeBunchButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::removeBunch);
+ QObject::connect(setSelectedItemButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::selectItem);
+ QObject::connect(startTimerButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::startStopTimer);
+ QObject::connect(themeButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changeTheme);
+ QObject::connect(labelButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::changeTransparency);
+
+ QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeShadowQuality(int)));
+ QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+ QObject::connect(chart, &Q3DScatter::shadowQualityChanged, modifier,
+ &ScatterDataModifier::shadowQualityUpdatedByVisual);
+ QObject::connect(chart, &Q3DScatter::selectedItemIndexChanged, modifier,
+ &ScatterDataModifier::handleSelectionChange);
+
+ QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
+ &ScatterDataModifier::changeFont);
+
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &ScatterDataModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &ScatterDataModifier::setGridEnabled);
+
+ modifier->start();
+
+ return app.exec();
+}
diff --git a/tests/scattertest/scatterchart.cpp b/tests/scattertest/scatterchart.cpp
new file mode 100644
index 00000000..aab230f2
--- /dev/null
+++ b/tests/scattertest/scatterchart.cpp
@@ -0,0 +1,330 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 "scatterchart.h"
+#include <QtDataVis3D/qscatterdataproxy.h>
+#include <QtDataVis3D/qvalueaxis.h>
+#include <qmath.h>
+using namespace QtDataVis3D;
+
+//#define RANDOM_SCATTER
+
+const int numberOfItems = 10000;
+
+ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
+ : m_chart(scatter),
+ m_fontSize(30.0f),
+ m_selectedItem(-1)
+{
+ QFont font = m_chart->font();
+ font.setPointSize(m_fontSize);
+ m_chart->setFont(font);
+ m_chart->setObjectType(QDataVis::Spheres, true);
+ m_chart->setTheme(QDataVis::ThemeBrownSand);
+ m_chart->setShadowQuality(QDataVis::ShadowHigh);
+ m_chart->setCameraPreset(QDataVis::PresetFront);
+ m_chart->setAxisX(new QValueAxis);
+ m_chart->setAxisY(new QValueAxis);
+ m_chart->setAxisZ(new QValueAxis);
+
+ QScatterDataProxy *proxy = new QScatterDataProxy;
+ proxy->setItemLabelFormat("@xTitle: @xLabel @yTitle: @yLabel @zTitle: @zLabel");
+ m_chart->setActiveDataProxy(proxy);
+
+ connect(&m_timer, &QTimer::timeout, this, &ScatterDataModifier::timeout);
+}
+
+ScatterDataModifier::~ScatterDataModifier()
+{
+ delete m_chart;
+}
+
+void ScatterDataModifier::start()
+{
+ addData();
+}
+
+void ScatterDataModifier::addData()
+{
+ // Add labels
+ m_chart->axisX()->setTitle("X");
+ m_chart->axisY()->setTitle("Y");
+ m_chart->axisZ()->setTitle("Z");
+ m_chart->axisX()->setRange(-50.0, 50.0);
+ m_chart->axisY()->setRange(-1.0, 1.0);
+ m_chart->axisZ()->setRange(-50.0, 50.0);
+
+ QScatterDataArray *dataArray = new QScatterDataArray;
+ dataArray->resize(numberOfItems);
+ QScatterDataItem *ptrToDataArray = &dataArray->first();
+
+#ifdef RANDOM_SCATTER
+ for (int i = 0; i < numberOfItems; i++) {
+ ptrToDataArray->setPosition(randVector());
+ ptrToDataArray++;
+ }
+#else
+ float limit = qSqrt(numberOfItems) / 2.0f;
+ for (float i = -limit; i < limit; i++) {
+ for (float j = -limit; j < limit; j++) {
+ ptrToDataArray->setPosition(QVector3D(i, qCos(qDegreesToRadians((i * j) / 7.5)), j));
+ ptrToDataArray++;
+ }
+ }
+#endif
+
+ static_cast<QScatterDataProxy *>(m_chart->activeDataProxy())->resetArray(dataArray);
+}
+
+void ScatterDataModifier::changeStyle()
+{
+ static int model = 0;
+ switch (model) {
+ case 0:
+ m_chart->setObjectType(QDataVis::Dots, false);
+ break;
+ case 1:
+ m_chart->setObjectType(QDataVis::Dots, true);
+ break;
+ case 2:
+ m_chart->setObjectType(QDataVis::Spheres, false);
+ break;
+ case 3:
+ m_chart->setObjectType(QDataVis::Spheres, true);
+ break;
+ }
+ model++;
+ if (model > 3)
+ model = 0;
+}
+
+void ScatterDataModifier::changePresetCamera()
+{
+ static int preset = QDataVis::PresetFrontLow;
+
+ m_chart->setCameraPreset((QDataVis::CameraPreset)preset);
+
+ if (++preset > QDataVis::PresetDirectlyAboveCCW45)
+ preset = QDataVis::PresetFrontLow;
+}
+
+void ScatterDataModifier::changeTheme()
+{
+ static int theme = QDataVis::ThemeSystem;
+
+ m_chart->setTheme((QDataVis::ColorTheme)theme);
+
+ if (++theme > QDataVis::ThemeLight)
+ theme = QDataVis::ThemeSystem;
+}
+
+void ScatterDataModifier::changeTransparency()
+{
+ static int transparency = QDataVis::TransparencyNone;
+
+ m_chart->setLabelTransparency((QDataVis::LabelTransparency)transparency);
+
+ if (++transparency > QDataVis::TransparencyNoBackground)
+ transparency = QDataVis::TransparencyNone;
+}
+
+void ScatterDataModifier::changeFont(const QFont &font)
+{
+ QFont newFont = font;
+ newFont.setPointSizeF(m_fontSize);
+ m_chart->setFont(newFont);
+}
+
+void ScatterDataModifier::changeFontSize(int fontsize)
+{
+ m_fontSize = fontsize;
+ QFont font = m_chart->font();
+ font.setPointSize(m_fontSize);
+ m_chart->setFont(font);
+}
+
+void ScatterDataModifier::shadowQualityUpdatedByVisual(QDataVis::ShadowQuality sq)
+{
+ int quality = int(sq);
+ // Updates the UI component to show correct shadow quality
+ emit shadowQualityChanged(quality);
+}
+
+void ScatterDataModifier::clear()
+{
+ m_chart->activeDataProxy()->resetArray(0);
+ qDebug() << m_loopCounter << "Cleared array";
+}
+
+void ScatterDataModifier::addOne()
+{
+ QScatterDataItem item(randVector());
+ int addIndex = m_chart->activeDataProxy()->addItem(item);
+ qDebug() << m_loopCounter << "added one to index:" << addIndex << "array size:" << m_chart->activeDataProxy()->array()->size();
+}
+
+void ScatterDataModifier::addBunch()
+{
+ QScatterDataArray items(100);
+ for (int i = 0; i < items.size(); i++)
+ items[i].setPosition(randVector());
+ int addIndex = m_chart->activeDataProxy()->addItems(items);
+ qDebug() << m_loopCounter << "added bunch to index:" << addIndex << "array size:" << m_chart->activeDataProxy()->array()->size();
+}
+
+void ScatterDataModifier::insertOne()
+{
+ QScatterDataItem item(randVector());
+ m_chart->activeDataProxy()->insertItem(0, item);
+ qDebug() << m_loopCounter << "Inserted one, array size:" << m_chart->activeDataProxy()->array()->size();
+}
+
+void ScatterDataModifier::insertBunch()
+{
+ QScatterDataArray items(100);
+ for (int i = 0; i < items.size(); i++)
+ items[i].setPosition(randVector());
+ m_chart->activeDataProxy()->insertItems(0, items);
+ qDebug() << m_loopCounter << "Inserted bunch, array size:" << m_chart->activeDataProxy()->array()->size();
+}
+
+void ScatterDataModifier::changeOne()
+{
+ if (m_selectedItem >= 0 && m_chart->activeDataProxy()->array()->size()) {
+ QScatterDataItem item(randVector());
+ m_chart->activeDataProxy()->setItem(m_selectedItem, item);
+ qDebug() << m_loopCounter << "Changed one, array size:" << m_chart->activeDataProxy()->array()->size();
+ }
+}
+
+void ScatterDataModifier::changeBunch()
+{
+ if (m_chart->activeDataProxy()->array()->size()) {
+ int amount = qMin(m_chart->activeDataProxy()->array()->size(), 100);
+ QScatterDataArray items(amount);
+ for (int i = 0; i < items.size(); i++)
+ items[i].setPosition(randVector());
+ m_chart->activeDataProxy()->setItems(0, items);
+ qDebug() << m_loopCounter << "Changed bunch, array size:" << m_chart->activeDataProxy()->array()->size();
+ }
+}
+
+void ScatterDataModifier::removeOne()
+{
+ if (m_selectedItem >= 0) {
+ m_chart->activeDataProxy()->removeItems(m_selectedItem, 1);
+ qDebug() << m_loopCounter << "Removed one, array size:" << m_chart->activeDataProxy()->array()->size();
+ }
+}
+
+void ScatterDataModifier::removeBunch()
+{
+ m_chart->activeDataProxy()->removeItems(0, 100);
+ qDebug() << m_loopCounter << "Removed bunch, array size:" << m_chart->activeDataProxy()->array()->size();
+}
+
+void ScatterDataModifier::timeout()
+{
+ int doWhat = rand() % 8;
+ if (!(rand() % 100))
+ doWhat = -1;
+
+ switch (doWhat) {
+ case 0:
+ addOne();
+ break;
+ case 1:
+ addBunch();
+ break;
+ case 2:
+ insertOne();
+ break;
+ case 3:
+ insertBunch();
+ break;
+ case 4:
+ changeOne();
+ break;
+ case 5:
+ changeBunch();
+ break;
+ case 6:
+ removeOne();
+ break;
+ case 7:
+ removeBunch();
+ break;
+ default:
+ clear();
+ break;
+ }
+
+ m_loopCounter++;
+}
+
+void ScatterDataModifier::startStopTimer()
+{
+ if (m_timer.isActive()) {
+ m_timer.stop();
+ } else {
+ clear();
+ m_loopCounter = 0;
+ m_timer.start(0);
+ }
+}
+
+void ScatterDataModifier::selectItem()
+{
+ int targetItem(3);
+ int noSelection(-1);
+ if (m_selectedItem != targetItem)
+ m_chart->setSelectedItemIndex(targetItem);
+ else
+ m_chart->setSelectedItemIndex(noSelection);
+}
+
+void ScatterDataModifier::handleSelectionChange(int index)
+{
+ m_selectedItem = index;
+ qDebug() << "Selected item index:" << index;
+}
+
+void ScatterDataModifier::changeShadowQuality(int quality)
+{
+ QDataVis::ShadowQuality sq = QDataVis::ShadowQuality(quality);
+ m_chart->setShadowQuality(sq);
+ emit shadowQualityChanged(quality);
+}
+
+void ScatterDataModifier::setBackgroundEnabled(int enabled)
+{
+ m_chart->setBackgroundVisible((bool)enabled);
+}
+
+void ScatterDataModifier::setGridEnabled(int enabled)
+{
+ m_chart->setGridVisible((bool)enabled);
+}
+
+QVector3D ScatterDataModifier::randVector()
+{
+ return QVector3D(
+ (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f,
+ (float)(rand() % 100) / 100.0f - (float)(rand() % 100) / 100.0f,
+ (float)(rand() % 100) / 2.0f - (float)(rand() % 100) / 2.0f);
+}
diff --git a/tests/scattertest/scatterchart.h b/tests/scattertest/scatterchart.h
new file mode 100644
index 00000000..4412af99
--- /dev/null
+++ b/tests/scattertest/scatterchart.h
@@ -0,0 +1,77 @@
+/****************************************************************************
+**
+** 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 QtDataVis3D 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 SCATTERDATAMODIFIER_H
+#define SCATTERDATAMODIFIER_H
+
+#include <QtDataVis3D/q3dscatter.h>
+
+#include <QFont>
+#include <QDebug>
+#include <QTimer>
+
+using namespace QtDataVis3D;
+
+class ScatterDataModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit ScatterDataModifier(Q3DScatter *scatter);
+ ~ScatterDataModifier();
+
+ void addData();
+ void changeStyle();
+ void changePresetCamera();
+ void changeTheme();
+ void changeTransparency();
+ void changeFont(const QFont &font);
+ void changeFontSize(int fontsize);
+ void setBackgroundEnabled(int enabled);
+ void setGridEnabled(int enabled);
+ void start();
+
+public slots:
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QDataVis::ShadowQuality shadowQuality);
+ void clear();
+ void addOne();
+ void addBunch();
+ void insertOne();
+ void insertBunch();
+ void changeOne();
+ void changeBunch();
+ void removeOne();
+ void removeBunch();
+ void timeout();
+ void startStopTimer();
+ void selectItem();
+ void handleSelectionChange(int index);
+
+signals:
+ void shadowQualityChanged(int quality);
+
+private:
+ QVector3D randVector();
+ Q3DScatter *m_chart;
+ int m_fontSize;
+ QTimer m_timer;
+ int m_loopCounter;
+ int m_selectedItem;
+};
+
+#endif
diff --git a/tests/scattertest/scattertest.pro b/tests/scattertest/scattertest.pro
new file mode 100644
index 00000000..62fb3d39
--- /dev/null
+++ b/tests/scattertest/scattertest.pro
@@ -0,0 +1,10 @@
+!include( ../tests.pri ) {
+ error( "Couldn't find the tests.pri file!" )
+}
+
+SOURCES += main.cpp scatterchart.cpp
+HEADERS += scatterchart.h
+
+QT += widgets
+
+INSTALLS += target
diff --git a/tests/tests.pri b/tests/tests.pri
new file mode 100644
index 00000000..e772d18a
--- /dev/null
+++ b/tests/tests.pri
@@ -0,0 +1,72 @@
+android {
+ target.path = /libs/$$ANDROID_TARGET_ARCH
+} else {
+ target.path = $$[QT_INSTALL_TESTS]/datavis3d/$$TARGET
+}
+
+win32 {
+ CONFIG(debug, release|debug):DESTDIR = $$OUT_PWD/debug
+ CONFIG(release, release|debug):DESTDIR = $$OUT_PWD/release
+} else {
+ DESTDIR = $$OUT_PWD
+}
+
+LIBS += -L$$OUT_PWD/../../lib
+
+TEMPLATE = app
+
+QT += datavis3d
+
+contains(TARGET, qml.*) {
+ uri = com.digia.QtDataVis3D
+ lib_name = datavis3dqml2
+
+ uri_replaced = $$replace(uri, \\., $$QMAKE_DIR_SEP)
+ make_qmldir_path = $$DESTDIR/$$uri_replaced
+ !exists($$make_qmldir_path) {
+ make_qmldir_target = \"$$replace(make_qmldir_path, /, $$QMAKE_DIR_SEP)\"
+ system($$QMAKE_MKDIR $$make_qmldir_target)
+ }
+ copy_qmldir_examples.target = $$make_qmldir_path/qmldir
+ copy_qmldir_examples.depends = $$_PRO_FILE_PWD_/../../src/$$lib_name/qmldir
+ copy_qmldir_examples.commands = $(COPY_FILE) \"$$replace(copy_qmldir_examples.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir_examples.target, /, $$QMAKE_DIR_SEP)\"
+ QMAKE_EXTRA_TARGETS += copy_qmldir_examples
+ PRE_TARGETDEPS += $$copy_qmldir_examples.target
+
+ win32 {
+ CONFIG(debug, release|debug) {
+ src_dir = debug
+ src_lib = $${lib_name}d.dll
+ }
+ CONFIG(release, release|debug){
+ src_dir = release
+ src_lib = $${lib_name}.dll
+ }
+ } else {
+ src_dir = .
+ mac {
+ CONFIG(debug, release|debug) {
+ src_lib = lib$${lib_name}_debug.dylib
+ }
+ CONFIG(release, release|debug){
+ src_lib = lib$${lib_name}.dylib
+ }
+ } else {
+ # linux, android
+ src_lib = lib$${lib_name}.so
+ }
+ }
+ copy_lib.target = $$make_qmldir_path/$$src_lib
+ copy_lib.depends = $$OUT_PWD/../../src/$$lib_name/$$src_dir/$$src_lib
+ copy_lib.commands = $(COPY_FILE) \"$$replace(copy_lib.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_lib.target, /, $$QMAKE_DIR_SEP)\"
+ QMAKE_EXTRA_TARGETS += copy_lib
+ PRE_TARGETDEPS += $$copy_lib.target
+
+ android {
+ android_qmldir.files = $$copy_qmldir_examples.target
+ android_qmldir.path = /assets/qml/$$uri_replaced
+ android_qmlplugin.files = $$copy_lib.target
+ android_qmlplugin.path = $$target.path
+ INSTALLS += android_qmldir android_qmlplugin
+ }
+}
diff --git a/tests/tests.pro b/tests/tests.pro
new file mode 100644
index 00000000..42550420
--- /dev/null
+++ b/tests/tests.pro
@@ -0,0 +1,11 @@
+!contains(QT_CONFIG, opengl) {
+ error(Tests requires OpenGL!)
+}
+contains(QT_CONFIG, opengles1) {
+ error(Tests do not support OpenGL ES 1!)
+}
+
+TEMPLATE = subdirs
+
+SUBDIRS += barstest \
+ scattertest