summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@digia.com>2013-04-05 13:11:05 +0300
committerMika Salmela <mika.salmela@digia.com>2013-04-05 20:26:20 +0300
commita6bc36e7ccdee05b2e3bca17ae8632854eba0483 (patch)
tree1794206c0578f1fb9896adeca4bbc464b988e96e
parent8f4ea5395e70408a27bdd9514b4d7ab3cf10b1f4 (diff)
Added data set classes for easier data insertion
Note: Not taken fully into use yet. Moved rainfall chart into it's own example. Added usage of data set classes to barchart Fixed a crash in case a row contains less data than sample space assumes Change-Id: I73f12de0214fe594d9054028da88b7280213fdd6 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--examples/datavis3d/barchart/barchart.pro4
-rw-r--r--examples/datavis3d/barchart/main.cpp303
-rw-r--r--examples/datavis3d/datavis3d.pro1
-rw-r--r--examples/datavis3d/rainfall/main.cpp327
-rw-r--r--examples/datavis3d/rainfall/rainfall.pro5
-rw-r--r--src/datavis3d/engine/engine.pri10
-rw-r--r--src/datavis3d/engine/q3dbars.cpp36
-rw-r--r--src/datavis3d/engine/q3dbars.h14
-rw-r--r--src/datavis3d/engine/q3dbars_p.h2
-rw-r--r--src/datavis3d/engine/q3dwindow.cpp1
-rw-r--r--src/datavis3d/engine/qdataitem.cpp5
-rw-r--r--src/datavis3d/engine/qdataitem.h3
-rw-r--r--src/datavis3d/engine/qdataitem_p.h2
-rw-r--r--src/datavis3d/engine/qdatarow.cpp122
-rw-r--r--src/datavis3d/engine/qdatarow.h72
-rw-r--r--src/datavis3d/engine/qdatarow_p.h73
-rw-r--r--src/datavis3d/engine/qdataset.cpp156
-rw-r--r--src/datavis3d/engine/qdataset.h78
-rw-r--r--src/datavis3d/engine/qdataset_p.h78
19 files changed, 1035 insertions, 257 deletions
diff --git a/examples/datavis3d/barchart/barchart.pro b/examples/datavis3d/barchart/barchart.pro
index 80d6fd6c..f61adac0 100644
--- a/examples/datavis3d/barchart/barchart.pro
+++ b/examples/datavis3d/barchart/barchart.pro
@@ -1,9 +1,5 @@
SOURCES += main.cpp
-HEADERS +=
QT += datavis3d
target.path = $$[QT_INSTALL_EXAMPLES]/datavis3d/barchart
INSTALLS += target
-
-RESOURCES +=
-
diff --git a/examples/datavis3d/barchart/main.cpp b/examples/datavis3d/barchart/main.cpp
index ecb92820..352bbcf3 100644
--- a/examples/datavis3d/barchart/main.cpp
+++ b/examples/datavis3d/barchart/main.cpp
@@ -39,7 +39,7 @@
****************************************************************************/
#include "q3dbars.h"
-#include "qdataitem.h"
+#include "qdataset.h"
#include <QGuiApplication>
#include <QTimer>
@@ -48,15 +48,7 @@
//#define CYCLE_THROUGH_STYLES
//#define CYCLE_THROUGH_PRESET_CAMERAS
//#define CYCLE_THROUGH_THEMES
-#define USE_ACTUAL_DATA
-
-#ifdef USE_ACTUAL_DATA
-const int rows = 13;
-const int columns = 12;
-#else
-const int rows = 9;
-const int columns = 9;
-#endif
+#define USE_STATIC_DATA
using namespace QtDataVis3D;
@@ -89,48 +81,29 @@ ChartDataGenerator::ChartDataGenerator(Q3DBars *barchart)
, m_styleTimer(0)
, m_presetTimer(0)
, m_themeTimer(0)
- , m_columnCount(columns)
- , m_rowCount(rows)
+ , m_columnCount(9)
+ , m_rowCount(9)
{
// Set up bar specifications; make the bars as wide as they are deep,
// and add a small space between the bars
m_chart->setBarSpecs(QPointF(1.0f, 1.0f), QPointF(0.2f, 0.2f), true);
-#ifndef USE_ACTUAL_DATA
+#ifndef USE_STATIC_DATA
// Set up sample space; make it as deep as it's wide
m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount));
-#else
- // Set up sample space; make it match actual data size
- m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount)
- , QStringLiteral("year"), QStringLiteral("month")
- , QStringLiteral("rainfall (in mm)"));
#endif
// Set bar type to smooth bar
#ifndef CYCLE_THROUGH_STYLES
-#ifdef USE_ACTUAL_DATA
- m_chart->setBarType(Q3DBars::Cylinders, true);
-#else
m_chart->setBarType(Q3DBars::Bars, false);
#endif
-#endif
-#ifdef USE_ACTUAL_DATA
- // Set selection mode to bar and column
- m_chart->setSelectionMode(Q3DBars::BarAndColumn);
-#else
// Set selection mode to full
m_chart->setSelectionMode(Q3DBars::BarRowAndColumn);
-#endif
#ifndef CYCLE_THROUGH_THEMES
-#ifndef USE_ACTUAL_DATA
// Set bar colors
m_chart->setBarColor(QColor(Qt::black), QColor(Qt::red), QColor(Qt::darkBlue));
-#else
- // Set theme
- m_chart->setTheme(Q3DBars::ThemeBlueNcs);
-#endif
#endif
// Set preset camera position
@@ -160,7 +133,7 @@ ChartDataGenerator::~ChartDataGenerator()
void ChartDataGenerator::start()
{
-#ifndef USE_ACTUAL_DATA
+#ifndef USE_STATIC_DATA
m_dataTimer = new QTimer();
m_dataTimer->setTimerType(Qt::CoarseTimer);
m_dataTimer->setInterval(100);
@@ -193,234 +166,80 @@ void ChartDataGenerator::start()
// Change theme every 2 seconds
m_themeTimer = new QTimer();
m_themeTimer->setTimerType(Qt::CoarseTimer);
- m_themeTimer->setInterval(6000);//2000);
+ m_themeTimer->setInterval(3000);//2000);
QObject::connect(m_themeTimer, &QTimer::timeout, this
, &ChartDataGenerator::changeTheme);
- m_themeTimer->start(6000);//2000);
+ m_themeTimer->start(3000);//2000);
#endif
}
void ChartDataGenerator::addDataSet()
{
-#if 0
+#if 1
+ // Prepare data to be visualized
+ // Use float vector adder
QVector< QVector<float> > data;
QVector<float> row;
// TODO: Keep here for testing
for (int j = 0; j < m_rowCount; j++) {
for (int i = 0; i < m_columnCount; i++) {
- //row.prepend(((float)i / (float)m_columnCount) / 1.5f + (float)(rand() % 30) / 100);
- row.prepend(1.0f);
+ row.prepend(((float)i / (float)m_columnCount) * 100 + (float)(rand() % 30));
+ //row.prepend(1.0f);
}
data.prepend(row);
row.clear();
}
+ // Set up sample space based on inserted data
+ m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount));
+ // Add data to chart
+ m_chart->addDataSet(data);
#else
- m_chart->setWindowTitle(QStringLiteral("Monthly rainfall in Northern Finland (2000-2012)"));
- // Fill in rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo)
- QVector< QVector<QDataItem*> > data;
- QVector<QDataItem*> row;
- // 2000
- row.prepend(new QDataItem(72, "mm, January 2000"));
- row.prepend(new QDataItem(47, "mm, February 2000"));
- row.prepend(new QDataItem(37, "mm, March 2000"));
- row.prepend(new QDataItem(79, "mm, April 2000"));
- row.prepend(new QDataItem(42, "mm, May 2000"));
- row.prepend(new QDataItem(73, "mm, June 2000"));
- row.prepend(new QDataItem(94, "mm, July 2000"));
- row.prepend(new QDataItem(37, "mm, August 2000"));
- row.prepend(new QDataItem(17, "mm, September 2000"));
- row.prepend(new QDataItem(69, "mm, October 2000"));
- row.prepend(new QDataItem(42, "mm, November 2000"));
- row.prepend(new QDataItem(42, "mm, December 2000"));
- data.prepend(row);
- row.clear();
- // 2001
- row.prepend(new QDataItem(25, "mm, January 2001"));
- row.prepend(new QDataItem(47, "mm, February 2001"));
- row.prepend(new QDataItem(20, "mm, March 2001"));
- row.prepend(new QDataItem(70, "mm, April 2001"));
- row.prepend(new QDataItem(27, "mm, May 2001"));
- row.prepend(new QDataItem(40, "mm, June 2001"));
- row.prepend(new QDataItem(123, "mm, July 2001"));
- row.prepend(new QDataItem(39, "mm, August 2001"));
- row.prepend(new QDataItem(66, "mm, September 2001"));
- row.prepend(new QDataItem(55, "mm, October 2001"));
- row.prepend(new QDataItem(29, "mm, November 2001"));
- row.prepend(new QDataItem(12, "mm, December 2001"));
- data.prepend(row);
- row.clear();
- // 2002
- row.prepend(new QDataItem(24, "mm, January 2002"));
- row.prepend(new QDataItem(45, "mm, February 2002"));
- row.prepend(new QDataItem(27, "mm, March 2002"));
- row.prepend(new QDataItem(30, "mm, April 2002"));
- row.prepend(new QDataItem(16, "mm, May 2002"));
- row.prepend(new QDataItem(98, "mm, June 2002"));
- row.prepend(new QDataItem(122, "mm, July 2002"));
- row.prepend(new QDataItem(20, "mm, August 2002"));
- row.prepend(new QDataItem(50, "mm, September 2002"));
- row.prepend(new QDataItem(24, "mm, October 2002"));
- row.prepend(new QDataItem(22, "mm, November 2002"));
- row.prepend(new QDataItem(12, "mm, December 2002"));
- data.prepend(row);
- row.clear();
- // 2003
- row.prepend(new QDataItem(43, "mm, January 2003"));
- row.prepend(new QDataItem(17, "mm, February 2003"));
- row.prepend(new QDataItem(26, "mm, March 2003"));
- row.prepend(new QDataItem(22, "mm, April 2003"));
- row.prepend(new QDataItem(60, "mm, May 2003"));
- row.prepend(new QDataItem(14, "mm, June 2003"));
- row.prepend(new QDataItem(86, "mm, July 2003"));
- row.prepend(new QDataItem(77, "mm, August 2003"));
- row.prepend(new QDataItem(69, "mm, September 2003"));
- row.prepend(new QDataItem(49, "mm, October 2003"));
- row.prepend(new QDataItem(23, "mm, November 2003"));
- row.prepend(new QDataItem(44, "mm, December 2003"));
- data.prepend(row);
- row.clear();
- // 2004
- row.prepend(new QDataItem(15, "mm, January 2004"));
- row.prepend(new QDataItem(19, "mm, February 2004"));
- row.prepend(new QDataItem(10, "mm, March 2004"));
- row.prepend(new QDataItem(11, "mm, April 2004"));
- row.prepend(new QDataItem(41, "mm, May 2004"));
- row.prepend(new QDataItem(29, "mm, June 2004"));
- row.prepend(new QDataItem(49, "mm, July 2004"));
- row.prepend(new QDataItem(72, "mm, August 2004"));
- row.prepend(new QDataItem(50, "mm, September 2004"));
- row.prepend(new QDataItem(18, "mm, October 2004"));
- row.prepend(new QDataItem(19, "mm, November 2004"));
- row.prepend(new QDataItem(40, "mm, December 2004"));
- data.prepend(row);
- row.clear();
- // 2005
- row.prepend(new QDataItem(60, "mm, January 2005"));
- row.prepend(new QDataItem(24, "mm, February 2005"));
- row.prepend(new QDataItem(12, "mm, March 2005"));
- row.prepend(new QDataItem(50, "mm, April 2005"));
- row.prepend(new QDataItem(88, "mm, May 2005"));
- row.prepend(new QDataItem(32, "mm, June 2005"));
- row.prepend(new QDataItem(76, "mm, July 2005"));
- row.prepend(new QDataItem(55, "mm, August 2005"));
- row.prepend(new QDataItem(92, "mm, September 2005"));
- row.prepend(new QDataItem(35, "mm, October 2005"));
- row.prepend(new QDataItem(105, "mm, November 2005"));
- row.prepend(new QDataItem(59, "mm, December 2005"));
- data.prepend(row);
- row.clear();
- // 2006
- row.prepend(new QDataItem(27, "mm, January 2006"));
- row.prepend(new QDataItem(18, "mm, February 2006"));
- row.prepend(new QDataItem(17, "mm, March 2006"));
- row.prepend(new QDataItem(26, "mm, April 2006"));
- row.prepend(new QDataItem(24, "mm, May 2006"));
- row.prepend(new QDataItem(18, "mm, June 2006"));
- row.prepend(new QDataItem(35, "mm, July 2006"));
- row.prepend(new QDataItem(28, "mm, August 2006"));
- row.prepend(new QDataItem(80, "mm, September 2006"));
- row.prepend(new QDataItem(52, "mm, October 2006"));
- row.prepend(new QDataItem(43, "mm, November 2006"));
- row.prepend(new QDataItem(44, "mm, December 2006"));
- data.prepend(row);
- row.clear();
- // 2007
- row.prepend(new QDataItem(41, "mm, January 2007"));
- row.prepend(new QDataItem(21, "mm, February 2007"));
- row.prepend(new QDataItem(30, "mm, March 2007"));
- row.prepend(new QDataItem(20, "mm, April 2007"));
- row.prepend(new QDataItem(53, "mm, May 2007"));
- row.prepend(new QDataItem(29, "mm, June 2007"));
- row.prepend(new QDataItem(139, "mm, July 2007"));
- row.prepend(new QDataItem(52, "mm, August 2007"));
- row.prepend(new QDataItem(51, "mm, September 2007"));
- row.prepend(new QDataItem(24, "mm, October 2007"));
- row.prepend(new QDataItem(47, "mm, November 2007"));
- row.prepend(new QDataItem(33, "mm, December 2007"));
- data.prepend(row);
- row.clear();
- // 2008
- row.prepend(new QDataItem(67, "mm, January 2008"));
- row.prepend(new QDataItem(19, "mm, February 2008"));
- row.prepend(new QDataItem(30, "mm, March 2008"));
- row.prepend(new QDataItem(31, "mm, April 2008"));
- row.prepend(new QDataItem(29, "mm, May 2008"));
- row.prepend(new QDataItem(79, "mm, June 2008"));
- row.prepend(new QDataItem(75, "mm, July 2008"));
- row.prepend(new QDataItem(99, "mm, August 2008"));
- row.prepend(new QDataItem(34, "mm, September 2008"));
- row.prepend(new QDataItem(52, "mm, October 2008"));
- row.prepend(new QDataItem(60, "mm, November 2008"));
- row.prepend(new QDataItem(20, "mm, December 2008"));
- data.prepend(row);
- row.clear();
- // 2009
- row.prepend(new QDataItem(9, "mm, January 2009"));
- row.prepend(new QDataItem(22, "mm, February 2009"));
- row.prepend(new QDataItem(11, "mm, March 2009"));
- row.prepend(new QDataItem(10, "mm, April 2009"));
- row.prepend(new QDataItem(69, "mm, May 2009"));
- row.prepend(new QDataItem(30, "mm, June 2009"));
- row.prepend(new QDataItem(78, "mm, July 2009"));
- row.prepend(new QDataItem(93, "mm, August 2009"));
- row.prepend(new QDataItem(70, "mm, September 2009"));
- row.prepend(new QDataItem(32, "mm, October 2009"));
- row.prepend(new QDataItem(56, "mm, November 2009"));
- row.prepend(new QDataItem(23, "mm, December 2009"));
- data.prepend(row);
- row.clear();
- // 2010
- row.prepend(new QDataItem(12, "mm, January 2010"));
- row.prepend(new QDataItem(28, "mm, February 2010"));
- row.prepend(new QDataItem(55, "mm, March 2010"));
- row.prepend(new QDataItem(20, "mm, April 2010"));
- row.prepend(new QDataItem(65, "mm, May 2010"));
- row.prepend(new QDataItem(26, "mm, June 2010"));
- row.prepend(new QDataItem(134, "mm, July 2010"));
- row.prepend(new QDataItem(57, "mm, August 2010"));
- row.prepend(new QDataItem(51, "mm, September 2010"));
- row.prepend(new QDataItem(53, "mm, October 2010"));
- row.prepend(new QDataItem(8, "mm, November 2010"));
- row.prepend(new QDataItem(9, "mm, December 2010"));
- data.prepend(row);
- row.clear();
- // 2011
- row.prepend(new QDataItem(34, "mm, January 2011"));
- row.prepend(new QDataItem(20, "mm, February 2011"));
- row.prepend(new QDataItem(30, "mm, March 2011"));
- row.prepend(new QDataItem(31, "mm, April 2011"));
- row.prepend(new QDataItem(42, "mm, May 2011"));
- row.prepend(new QDataItem(78, "mm, June 2011"));
- row.prepend(new QDataItem(85, "mm, July 2011"));
- row.prepend(new QDataItem(33, "mm, August 2011"));
- row.prepend(new QDataItem(42, "mm, September 2011"));
- row.prepend(new QDataItem(87, "mm, October 2011"));
- row.prepend(new QDataItem(41, "mm, November 2011"));
- row.prepend(new QDataItem(72, "mm, December 2011"));
- data.prepend(row);
- row.clear();
- // 2012
- row.prepend(new QDataItem(32, "mm, January 2012"));
- row.prepend(new QDataItem(42, "mm, February 2012"));
- row.prepend(new QDataItem(30, "mm, March 2012"));
- row.prepend(new QDataItem(50, "mm, April 2012"));
- row.prepend(new QDataItem(30, "mm, May 2012"));
- row.prepend(new QDataItem(70, "mm, June 2012"));
- row.prepend(new QDataItem(52, "mm, July 2012"));
- row.prepend(new QDataItem(20, "mm, August 2012"));
- row.prepend(new QDataItem(99, "mm, September 2012"));
- row.prepend(new QDataItem(70, "mm, October 2012"));
- row.prepend(new QDataItem(69, "mm, November 2012"));
- row.prepend(new QDataItem(49, "mm, December 2012"));
- data.prepend(row);
- row.clear();
+ // Prepare data to be visualized
+ // Use QDataSet adder
+
+ // Set window title
+ m_chart->setWindowTitle(QStringLiteral("Hours playing banjo"));
+
// Set up row and column names
- QVector<QString> months;
- months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
- QVector<QString> years;
- years << "2000" << "2001" << "2002" << "2003" << "2004" << "2005" << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012";
+ QVector<QString> days;
+ days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday";
+ QVector<QString> weeks;
+ weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5";
+
+ // Set up data
+ float hours[5][7] = {{2, 1, 3, 0, 1, 5, 7}
+ , {0, 1, 3, 1, 2, 2, 3}
+ , {1, 1, 2, 1, 4, 4, 4}
+ , {0, 0, 0, 0, 2, 2, 0}
+ , {3, 3, 6, 2, 2, 1, 1}};
+
+ // Create data set
+ QDataSet *dataSet = new QDataSet();
+
+ // Add labels
+ dataSet->setLabels("Day of week", "Week of year", "Hours doing something", weeks, days);
+
+ // Create data rows
+ QDataRow *dataRow;
+ for (int week = 0; week < weeks.size(); week++) {
+ dataRow = new QDataRow(weeks.at(week));
+ // Create data items
+ for (int day = 0; day < days.size(); day++) {
+ // Add data to rows
+ dataRow->addItem(new QDataItem(hours[week][day], "hours," + days.at(day)));
+ }
+ // Add row to set
+ dataSet->addRow(dataRow);
+ // Get next pointer
+ dataRow++;
+ }
+
+ // Set up sample space based on prepared data
+ m_chart->setupSampleSpace(QPoint(days.size(), weeks.size()));
+
+ // Add data to chart
+ m_chart->addDataSet(dataSet);
#endif
- m_chart->addDataSet(data, years, months);
}
void ChartDataGenerator::addBars()
diff --git a/examples/datavis3d/datavis3d.pro b/examples/datavis3d/datavis3d.pro
index bd1fe983..d127083c 100644
--- a/examples/datavis3d/datavis3d.pro
+++ b/examples/datavis3d/datavis3d.pro
@@ -1,3 +1,4 @@
TEMPLATE = subdirs
SUBDIRS += barchart \
+ rainfall \
spectrum
diff --git a/examples/datavis3d/rainfall/main.cpp b/examples/datavis3d/rainfall/main.cpp
new file mode 100644
index 00000000..4139228a
--- /dev/null
+++ b/examples/datavis3d/rainfall/main.cpp
@@ -0,0 +1,327 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "q3dbars.h"
+#include "qdataitem.h"
+
+#include <QGuiApplication>
+#include <QTimer>
+#include <QDebug>
+
+using namespace QtDataVis3D;
+
+class ChartDataGenerator : public QObject
+{
+public:
+ explicit ChartDataGenerator(Q3DBars *rainfall);
+ ~ChartDataGenerator();
+
+ void addDataSet();
+ void start();
+
+private:
+ Q3DBars *m_chart;
+ int m_columnCount;
+ int m_rowCount;
+};
+
+ChartDataGenerator::ChartDataGenerator(Q3DBars *rainfall)
+ : m_chart(rainfall)
+ , m_columnCount(12)
+ , m_rowCount(13)
+{
+ // Set up bar specifications; make the bars as wide as they are deep,
+ // and add a small space between the bars
+ m_chart->setBarSpecs(QPointF(1.0f, 1.0f), QPointF(0.2f, 0.2f), true);
+
+ // Set up sample space; make it match actual data size
+ m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount)
+ , QStringLiteral("year"), QStringLiteral("month")
+ , QStringLiteral("rainfall (in mm)"));
+
+ // Set bar type to cylinder
+ m_chart->setBarType(Q3DBars::Cylinders, false);
+
+ // Set selection mode to bar and column
+ m_chart->setSelectionMode(Q3DBars::BarAndColumn);
+
+ // Set theme
+ m_chart->setTheme(Q3DBars::ThemeBlueNcs);
+
+ // Set preset camera position
+ m_chart->setCameraPreset(Q3DBars::PresetFront);
+
+ // Set window title
+ m_chart->setWindowTitle(QStringLiteral("Monthly rainfall in Northern Finland (2000-2012)"));
+}
+
+ChartDataGenerator::~ChartDataGenerator()
+{
+ delete m_chart;
+}
+
+void ChartDataGenerator::start()
+{
+ addDataSet();
+}
+
+void ChartDataGenerator::addDataSet()
+{
+ // Fill in rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo)
+ QVector< QVector<QDataItem*> > data;
+ QVector<QDataItem*> row;
+ // 2000
+ row.prepend(new QDataItem(72, "mm, January 2000"));
+ row.prepend(new QDataItem(47, "mm, February 2000"));
+ row.prepend(new QDataItem(37, "mm, March 2000"));
+ row.prepend(new QDataItem(79, "mm, April 2000"));
+ row.prepend(new QDataItem(42, "mm, May 2000"));
+ row.prepend(new QDataItem(73, "mm, June 2000"));
+ row.prepend(new QDataItem(94, "mm, July 2000"));
+ row.prepend(new QDataItem(37, "mm, August 2000"));
+ row.prepend(new QDataItem(17, "mm, September 2000"));
+ row.prepend(new QDataItem(69, "mm, October 2000"));
+ row.prepend(new QDataItem(42, "mm, November 2000"));
+ row.prepend(new QDataItem(42, "mm, December 2000"));
+ data.prepend(row);
+ row.clear();
+ // 2001
+ row.prepend(new QDataItem(25, "mm, January 2001"));
+ row.prepend(new QDataItem(47, "mm, February 2001"));
+ row.prepend(new QDataItem(20, "mm, March 2001"));
+ row.prepend(new QDataItem(70, "mm, April 2001"));
+ row.prepend(new QDataItem(27, "mm, May 2001"));
+ row.prepend(new QDataItem(40, "mm, June 2001"));
+ row.prepend(new QDataItem(123, "mm, July 2001"));
+ row.prepend(new QDataItem(39, "mm, August 2001"));
+ row.prepend(new QDataItem(66, "mm, September 2001"));
+ row.prepend(new QDataItem(55, "mm, October 2001"));
+ row.prepend(new QDataItem(29, "mm, November 2001"));
+ row.prepend(new QDataItem(12, "mm, December 2001"));
+ data.prepend(row);
+ row.clear();
+ // 2002
+ row.prepend(new QDataItem(24, "mm, January 2002"));
+ row.prepend(new QDataItem(45, "mm, February 2002"));
+ row.prepend(new QDataItem(27, "mm, March 2002"));
+ row.prepend(new QDataItem(30, "mm, April 2002"));
+ row.prepend(new QDataItem(16, "mm, May 2002"));
+ row.prepend(new QDataItem(98, "mm, June 2002"));
+ row.prepend(new QDataItem(122, "mm, July 2002"));
+ row.prepend(new QDataItem(20, "mm, August 2002"));
+ row.prepend(new QDataItem(50, "mm, September 2002"));
+ row.prepend(new QDataItem(24, "mm, October 2002"));
+ row.prepend(new QDataItem(22, "mm, November 2002"));
+ row.prepend(new QDataItem(12, "mm, December 2002"));
+ data.prepend(row);
+ row.clear();
+ // 2003
+ row.prepend(new QDataItem(43, "mm, January 2003"));
+ row.prepend(new QDataItem(17, "mm, February 2003"));
+ row.prepend(new QDataItem(26, "mm, March 2003"));
+ row.prepend(new QDataItem(22, "mm, April 2003"));
+ row.prepend(new QDataItem(60, "mm, May 2003"));
+ row.prepend(new QDataItem(14, "mm, June 2003"));
+ row.prepend(new QDataItem(86, "mm, July 2003"));
+ row.prepend(new QDataItem(77, "mm, August 2003"));
+ row.prepend(new QDataItem(69, "mm, September 2003"));
+ row.prepend(new QDataItem(49, "mm, October 2003"));
+ row.prepend(new QDataItem(23, "mm, November 2003"));
+ row.prepend(new QDataItem(44, "mm, December 2003"));
+ data.prepend(row);
+ row.clear();
+ // 2004
+ row.prepend(new QDataItem(15, "mm, January 2004"));
+ row.prepend(new QDataItem(19, "mm, February 2004"));
+ row.prepend(new QDataItem(10, "mm, March 2004"));
+ row.prepend(new QDataItem(11, "mm, April 2004"));
+ row.prepend(new QDataItem(41, "mm, May 2004"));
+ row.prepend(new QDataItem(29, "mm, June 2004"));
+ row.prepend(new QDataItem(49, "mm, July 2004"));
+ row.prepend(new QDataItem(72, "mm, August 2004"));
+ row.prepend(new QDataItem(50, "mm, September 2004"));
+ row.prepend(new QDataItem(18, "mm, October 2004"));
+ row.prepend(new QDataItem(19, "mm, November 2004"));
+ row.prepend(new QDataItem(40, "mm, December 2004"));
+ data.prepend(row);
+ row.clear();
+ // 2005
+ row.prepend(new QDataItem(60, "mm, January 2005"));
+ row.prepend(new QDataItem(24, "mm, February 2005"));
+ row.prepend(new QDataItem(12, "mm, March 2005"));
+ row.prepend(new QDataItem(50, "mm, April 2005"));
+ row.prepend(new QDataItem(88, "mm, May 2005"));
+ row.prepend(new QDataItem(32, "mm, June 2005"));
+ row.prepend(new QDataItem(76, "mm, July 2005"));
+ row.prepend(new QDataItem(55, "mm, August 2005"));
+ row.prepend(new QDataItem(92, "mm, September 2005"));
+ row.prepend(new QDataItem(35, "mm, October 2005"));
+ row.prepend(new QDataItem(105, "mm, November 2005"));
+ row.prepend(new QDataItem(59, "mm, December 2005"));
+ data.prepend(row);
+ row.clear();
+ // 2006
+ row.prepend(new QDataItem(27, "mm, January 2006"));
+ row.prepend(new QDataItem(18, "mm, February 2006"));
+ row.prepend(new QDataItem(17, "mm, March 2006"));
+ row.prepend(new QDataItem(26, "mm, April 2006"));
+ row.prepend(new QDataItem(24, "mm, May 2006"));
+ row.prepend(new QDataItem(18, "mm, June 2006"));
+ row.prepend(new QDataItem(35, "mm, July 2006"));
+ row.prepend(new QDataItem(28, "mm, August 2006"));
+ row.prepend(new QDataItem(80, "mm, September 2006"));
+ row.prepend(new QDataItem(52, "mm, October 2006"));
+ row.prepend(new QDataItem(43, "mm, November 2006"));
+ row.prepend(new QDataItem(44, "mm, December 2006"));
+ data.prepend(row);
+ row.clear();
+ // 2007
+ row.prepend(new QDataItem(41, "mm, January 2007"));
+ row.prepend(new QDataItem(21, "mm, February 2007"));
+ row.prepend(new QDataItem(30, "mm, March 2007"));
+ row.prepend(new QDataItem(20, "mm, April 2007"));
+ row.prepend(new QDataItem(53, "mm, May 2007"));
+ row.prepend(new QDataItem(29, "mm, June 2007"));
+ row.prepend(new QDataItem(139, "mm, July 2007"));
+ row.prepend(new QDataItem(52, "mm, August 2007"));
+ row.prepend(new QDataItem(51, "mm, September 2007"));
+ row.prepend(new QDataItem(24, "mm, October 2007"));
+ row.prepend(new QDataItem(47, "mm, November 2007"));
+ row.prepend(new QDataItem(33, "mm, December 2007"));
+ data.prepend(row);
+ row.clear();
+ // 2008
+ row.prepend(new QDataItem(67, "mm, January 2008"));
+ row.prepend(new QDataItem(19, "mm, February 2008"));
+ row.prepend(new QDataItem(30, "mm, March 2008"));
+ row.prepend(new QDataItem(31, "mm, April 2008"));
+ row.prepend(new QDataItem(29, "mm, May 2008"));
+ row.prepend(new QDataItem(79, "mm, June 2008"));
+ row.prepend(new QDataItem(75, "mm, July 2008"));
+ row.prepend(new QDataItem(99, "mm, August 2008"));
+ row.prepend(new QDataItem(34, "mm, September 2008"));
+ row.prepend(new QDataItem(52, "mm, October 2008"));
+ row.prepend(new QDataItem(60, "mm, November 2008"));
+ row.prepend(new QDataItem(20, "mm, December 2008"));
+ data.prepend(row);
+ row.clear();
+ // 2009
+ row.prepend(new QDataItem(9, "mm, January 2009"));
+ row.prepend(new QDataItem(22, "mm, February 2009"));
+ row.prepend(new QDataItem(11, "mm, March 2009"));
+ row.prepend(new QDataItem(10, "mm, April 2009"));
+ row.prepend(new QDataItem(69, "mm, May 2009"));
+ row.prepend(new QDataItem(30, "mm, June 2009"));
+ row.prepend(new QDataItem(78, "mm, July 2009"));
+ row.prepend(new QDataItem(93, "mm, August 2009"));
+ row.prepend(new QDataItem(70, "mm, September 2009"));
+ row.prepend(new QDataItem(32, "mm, October 2009"));
+ row.prepend(new QDataItem(56, "mm, November 2009"));
+ row.prepend(new QDataItem(23, "mm, December 2009"));
+ data.prepend(row);
+ row.clear();
+ // 2010
+ row.prepend(new QDataItem(12, "mm, January 2010"));
+ row.prepend(new QDataItem(28, "mm, February 2010"));
+ row.prepend(new QDataItem(55, "mm, March 2010"));
+ row.prepend(new QDataItem(20, "mm, April 2010"));
+ row.prepend(new QDataItem(65, "mm, May 2010"));
+ row.prepend(new QDataItem(26, "mm, June 2010"));
+ row.prepend(new QDataItem(134, "mm, July 2010"));
+ row.prepend(new QDataItem(57, "mm, August 2010"));
+ row.prepend(new QDataItem(51, "mm, September 2010"));
+ row.prepend(new QDataItem(53, "mm, October 2010"));
+ row.prepend(new QDataItem(8, "mm, November 2010"));
+ row.prepend(new QDataItem(9, "mm, December 2010"));
+ data.prepend(row);
+ row.clear();
+ // 2011
+ row.prepend(new QDataItem(34, "mm, January 2011"));
+ row.prepend(new QDataItem(20, "mm, February 2011"));
+ row.prepend(new QDataItem(30, "mm, March 2011"));
+ row.prepend(new QDataItem(31, "mm, April 2011"));
+ row.prepend(new QDataItem(42, "mm, May 2011"));
+ row.prepend(new QDataItem(78, "mm, June 2011"));
+ row.prepend(new QDataItem(85, "mm, July 2011"));
+ row.prepend(new QDataItem(33, "mm, August 2011"));
+ row.prepend(new QDataItem(42, "mm, September 2011"));
+ row.prepend(new QDataItem(87, "mm, October 2011"));
+ row.prepend(new QDataItem(41, "mm, November 2011"));
+ row.prepend(new QDataItem(72, "mm, December 2011"));
+ data.prepend(row);
+ row.clear();
+ // 2012
+ row.prepend(new QDataItem(32, "mm, January 2012"));
+ row.prepend(new QDataItem(42, "mm, February 2012"));
+ row.prepend(new QDataItem(30, "mm, March 2012"));
+ row.prepend(new QDataItem(50, "mm, April 2012"));
+ row.prepend(new QDataItem(30, "mm, May 2012"));
+ row.prepend(new QDataItem(70, "mm, June 2012"));
+ row.prepend(new QDataItem(52, "mm, July 2012"));
+ row.prepend(new QDataItem(20, "mm, August 2012"));
+ row.prepend(new QDataItem(99, "mm, September 2012"));
+ row.prepend(new QDataItem(70, "mm, October 2012"));
+ row.prepend(new QDataItem(69, "mm, November 2012"));
+ row.prepend(new QDataItem(49, "mm, December 2012"));
+ data.prepend(row);
+ row.clear();
+ // Set up row and column names
+ QVector<QString> months;
+ months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
+ QVector<QString> years;
+ years << "2000" << "2001" << "2002" << "2003" << "2004" << "2005" << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012";
+
+ m_chart->addDataSet(data, years, months);
+}
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ Q3DBars rainfall;
+ rainfall.resize(1280, 1024);
+ rainfall.setPosition(QPoint(10, 30));
+ rainfall.show();
+
+ ChartDataGenerator *generator = new ChartDataGenerator(&rainfall);
+ generator->start();
+
+ return app.exec();
+}
diff --git a/examples/datavis3d/rainfall/rainfall.pro b/examples/datavis3d/rainfall/rainfall.pro
new file mode 100644
index 00000000..b48c1b7c
--- /dev/null
+++ b/examples/datavis3d/rainfall/rainfall.pro
@@ -0,0 +1,5 @@
+SOURCES += main.cpp
+QT += datavis3d
+
+target.path = $$[QT_INSTALL_EXAMPLES]/datavis3d/rainfall
+INSTALLS += target
diff --git a/src/datavis3d/engine/engine.pri b/src/datavis3d/engine/engine.pri
index 54f7cf6b..7ad5c5d5 100644
--- a/src/datavis3d/engine/engine.pri
+++ b/src/datavis3d/engine/engine.pri
@@ -1,12 +1,18 @@
SOURCES += $$PWD/q3dwindow.cpp \
$$PWD/q3dbars.cpp \
- $$PWD/qdataitem.cpp
+ $$PWD/qdataitem.cpp \
+ $$PWD/qdatarow.cpp \
+ $$PWD/qdataset.cpp
HEADERS += $$PWD/q3dwindow_p.h \
$$PWD/q3dwindow.h \
$$PWD/q3dbars.h \
$$PWD/q3dbars_p.h \
$$PWD/qdataitem.h \
- $$PWD/qdataitem_p.h
+ $$PWD/qdataitem_p.h \
+ $$PWD/qdatarow.h \
+ $$PWD/qdatarow_p.h \
+ $$PWD/qdataset.h \
+ $$PWD/qdataset_p.h
RESOURCES += engine/engine.qrc
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp
index f8c51d50..7c3ca016 100644
--- a/src/datavis3d/engine/q3dbars.cpp
+++ b/src/datavis3d/engine/q3dbars.cpp
@@ -43,6 +43,8 @@
#include "q3dbars_p.h"
#include "camerahelper_p.h"
#include "qdataitem_p.h"
+#include "qdatarow_p.h"
+#include "qdataset_p.h"
#include "shaderhelper_p.h"
#include "objecthelper_p.h"
#include "utils_p.h"
@@ -280,6 +282,8 @@ void Q3DBars::drawScene()
glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
+ if (d_ptr->m_dataSet.at(row).size() < (bar + 1))
+ continue;
QDataItem *item = d_ptr->m_dataSet.at(row).at(bar);
float barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer;
QMatrix4x4 modelMatrix;
@@ -471,6 +475,8 @@ void Q3DBars::drawScene()
bool barSelectionFound = false;
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
+ if (d_ptr->m_dataSet.at(row).size() < (bar + 1))
+ continue;
QDataItem *item = d_ptr->m_dataSet.at(row).at(bar);
float barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer;
if (barHeight == 0)
@@ -1104,7 +1110,7 @@ void Q3DBars::addDataRow(const QVector<float> &dataRow, const QString &labelRow
}
d_ptr->findHighestValue(sampleRow);
// The vector contains data (=height) for each bar, a row at a time
- // With each new row, the previous data set (=row) must be moved back
+ // With each new row, the previous data row must be moved back
// ie. we need as many vectors as we have rows in the sample space
d_ptr->m_dataSet.prepend(sampleRow);
// if the added data pushed us over sample space, remove the oldest data set
@@ -1122,8 +1128,7 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe
qWarning("Data set too large for sample space");
}
d_ptr->findHighestValue(row);
- // The vector contains data (=height) for each bar, a row at a time
- // With each new row, the previous data set (=row) must be moved back
+ // With each new row, the previous data row must be moved back
// ie. we need as many vectors as we have rows in the sample space
d_ptr->m_dataSet.prepend(row);
// if the added data pushed us over sample space, remove the oldest data set
@@ -1131,6 +1136,19 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe
d_ptr->resizeDataSet();
}
+void Q3DBars::addDataRow(QDataRow *dataRow)
+{
+ QDataRow *row = dataRow;
+ // Check that the input data fits into sample space, and resize if it doesn't
+ row->d_ptr->verifySize(d_ptr->m_sampleCount.x());
+ d_ptr->m_heightNormalizer = row->d_ptr->highestValue();
+ // With each new row, the previous data row must be moved back
+ // ie. we need as many vectors as we have rows in the sample space
+ d_ptr->m_dataSetTest->addRow(row);
+ // if the added data pushed us over sample space, remove the oldest data set
+ d_ptr->m_dataSetTest->d_ptr->verifySize(d_ptr->m_sampleCount.y());
+}
+
void Q3DBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QString> &labelsRow
, const QVector<QString> &labelsColumn)
{
@@ -1173,6 +1191,17 @@ void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data
d_ptr->findHighestValue(d_ptr->m_dataSet.at(i));
}
+void Q3DBars::addDataSet(QDataSet* dataSet)
+{
+ delete d_ptr->m_dataSetTest;
+ // Check sizes
+ dataSet->d_ptr->verifySize(d_ptr->m_sampleCount.y(), d_ptr->m_sampleCount.x());
+ // Take ownership of given set
+ d_ptr->m_dataSetTest = dataSet;
+ // Find highest value
+ d_ptr->m_heightNormalizer = d_ptr->m_dataSetTest->d_ptr->highestValue();
+}
+
Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q)
: q_ptr(q)
, m_paintDevice(0)
@@ -1218,6 +1247,7 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q)
, m_isInitialized(false)
, m_selectionMode(Q3DBars::Bar)
, m_selectedBar(0)
+ , m_dataSetTest(0)
{
}
diff --git a/src/datavis3d/engine/q3dbars.h b/src/datavis3d/engine/q3dbars.h
index f4c03f1a..41775549 100644
--- a/src/datavis3d/engine/q3dbars.h
+++ b/src/datavis3d/engine/q3dbars.h
@@ -51,6 +51,8 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
class Q3DBarsPrivate;
class QDataItem;
+class QDataRow;
+class QDataSet;
class QTCOMMERCIALDATAVIS3D_EXPORT Q3DBars : public Q3DWindow
{
@@ -96,12 +98,16 @@ public:
ThemeLight
};
+ // TODO: Implement modes for "zooming" into selected row/column, ie. display only selected row/column
+ // in full window and 3d chart in a small viewport
enum SelectionMode {
None = 0,
Bar,
BarAndRow,
BarAndColumn,
- BarRowAndColumn
+ BarRowAndColumn,
+ ZoomRow,
+ ZoomColumn
};
public:
@@ -119,9 +125,12 @@ public:
, const QString &labelRow = QString()
, const QVector<QString> &labelsColumn = QVector<QString>());
// TODO: Replace QVector<..> with a data row class (QDataRow)? Move labels to class.
+ // ownership of dataItems is transferred
void addDataRow(const QVector<QDataItem*> &dataRow
, const QString &labelRow = QString()
, const QVector<QString> &labelsColumn = QVector<QString>());
+ // ownership of dataRow is transferred
+ void addDataRow(QDataRow *dataRow);
// Add complete data set at a time, as a vector of data rows
// TODO: Replace QVector<QVector<..>> with a data set class (QDataSet)? Move labels to class.
@@ -130,9 +139,12 @@ public:
, const QVector<QString> &labelsColumn = QVector<QString>());
// TODO: Replace QVector<QVector<..>> with a data set class (QDataSet)? Move labels to class.
+ // ownership of dataItems is transferred
void addDataSet(const QVector< QVector<QDataItem*> > &data
, const QVector<QString> &labelsRow = QVector<QString>()
, const QVector<QString> &labelsColumn = QVector<QString>());
+ // ownership of dataSet is transferred
+ void addDataSet(QDataSet* dataSet);
// bar thickness, spacing between bars, and is spacing relative to thickness or absolute
// y -component sets the thickness/spacing of z -direction
diff --git a/src/datavis3d/engine/q3dbars_p.h b/src/datavis3d/engine/q3dbars_p.h
index 5d2d3d20..0fa88af3 100644
--- a/src/datavis3d/engine/q3dbars_p.h
+++ b/src/datavis3d/engine/q3dbars_p.h
@@ -53,6 +53,7 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
class Q3DBars;
class QDataItem;
+class QDataSet;
class ShaderHelper;
class ObjectHelper;
@@ -133,6 +134,7 @@ public:
bool m_isInitialized;
Q3DBars::SelectionMode m_selectionMode;
QDataItem *m_selectedBar;
+ QDataSet *m_dataSetTest;
};
QTCOMMERCIALDATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/q3dwindow.cpp b/src/datavis3d/engine/q3dwindow.cpp
index a2a7d37d..54300793 100644
--- a/src/datavis3d/engine/q3dwindow.cpp
+++ b/src/datavis3d/engine/q3dwindow.cpp
@@ -58,6 +58,7 @@ Q3DWindow::Q3DWindow(QWindow *parent)
{
setSurfaceType(QWindow::OpenGLSurface);
QSurfaceFormat surfaceFormat;
+ surfaceFormat.setDepthBufferSize(16);
surfaceFormat.setSamples(4);
surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
//surfaceFormat.setRenderableType(QSurfaceFormat::OpenGLES); // OpenGL crashes with ANGLE, comment out or define OpenGLES
diff --git a/src/datavis3d/engine/qdataitem.cpp b/src/datavis3d/engine/qdataitem.cpp
index 8cdd9b8b..efe48e0a 100644
--- a/src/datavis3d/engine/qdataitem.cpp
+++ b/src/datavis3d/engine/qdataitem.cpp
@@ -56,7 +56,6 @@ QDataItem::QDataItem(float value, const QString &label)
QDataItem::~QDataItem()
{
//qDebug("~QDataItem");
- delete d_ptr;
}
void QDataItem::setLabel(const QString &label, bool prepend)
@@ -70,8 +69,8 @@ void QDataItem::setValue(float value)
d_ptr->m_value = value;
}
-QDataItemPrivate::QDataItemPrivate(QDataItem *parent, float value, const QString &label)
- : q_ptr(parent)
+QDataItemPrivate::QDataItemPrivate(QDataItem *q, float value, const QString &label)
+ : q_ptr(q)
, m_value(value)
, m_label(label)
, m_prependLabel(false)
diff --git a/src/datavis3d/engine/qdataitem.h b/src/datavis3d/engine/qdataitem.h
index 7cd10fa3..a54a1f0e 100644
--- a/src/datavis3d/engine/qdataitem.h
+++ b/src/datavis3d/engine/qdataitem.h
@@ -60,9 +60,10 @@ public:
void setValue(float value);
private:
- QDataItemPrivate *d_ptr; // TODO: Why doesn't QScopedPointer work here?
+ QScopedPointer<QDataItemPrivate> d_ptr;
friend class Q3DBars;
friend class Q3DBarsPrivate;
+ friend class QDataRowPrivate;
};
QTCOMMERCIALDATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/qdataitem_p.h b/src/datavis3d/engine/qdataitem_p.h
index c7bec54f..e191a8b5 100644
--- a/src/datavis3d/engine/qdataitem_p.h
+++ b/src/datavis3d/engine/qdataitem_p.h
@@ -52,7 +52,7 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
class QDataItemPrivate
{
public:
- explicit QDataItemPrivate(QDataItem *parent, float value = 0.0f
+ explicit QDataItemPrivate(QDataItem *q, float value = 0.0f
, const QString &label = QString());
~QDataItemPrivate();
diff --git a/src/datavis3d/engine/qdatarow.cpp b/src/datavis3d/engine/qdatarow.cpp
new file mode 100644
index 00000000..0da8f487
--- /dev/null
+++ b/src/datavis3d/engine/qdatarow.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdatarow.h"
+#include "qdatarow_p.h"
+#include "qdataitem.h"
+#include "qdataitem_p.h"
+
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+QDataRow::QDataRow(const QString &label)
+ : d_ptr(new QDataRowPrivate(this, label))
+{
+ qDebug("QDataRow");
+}
+
+QDataRow::~QDataRow()
+{
+ qDebug("~QDataRow");
+}
+
+void QDataRow::setLabel(const QString &label)
+{
+ d_ptr->m_label = label;
+}
+
+void QDataRow::addItem(QDataItem *item)
+{
+ d_ptr->m_row.prepend(item);
+}
+
+QDataRowPrivate::QDataRowPrivate(QDataRow *q, const QString &label)
+ : q_ptr(q)
+ , m_label(label)
+{
+}
+
+QDataRowPrivate::~QDataRowPrivate()
+{
+ for (int itemCount = 0; itemCount < m_row.size(); itemCount++) {
+ delete m_row.at(itemCount);
+ }
+ m_row.clear();
+}
+
+QVector<QDataItem*> QDataRowPrivate::row()
+{
+ return m_row;
+}
+
+void QDataRowPrivate::verifySize(int size)
+{
+ qDebug("verifySize (QDataRow)");
+ if (size > m_row.size()) {
+ // QVector's resize doesn't delete data contained in it
+ // Delete contents of items to be removed
+ int nbrToBeRemoved = m_row.size() - size;
+ for (int itemCount = 0; itemCount < nbrToBeRemoved; itemCount++) {
+ int itemToBeRemoved = m_row.size() - itemCount - 1; // -1 to compensate index 0
+ delete m_row.at(itemToBeRemoved);
+ }
+ // Resize vector
+ m_row.resize(size);
+ }
+ else if (size < m_row.size()) {
+ qCritical("Check your sample space size! Your row is too short.");
+ }
+}
+
+float QDataRowPrivate::highestValue()
+{
+ float max = 0;
+ for (int i = 0; i < m_row.size(); i++) {
+ QDataItem *item = m_row.at(i);
+ float itemValue = item->d_ptr->value();
+ if (max < itemValue)
+ max = itemValue;
+ }
+ return max;
+}
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/qdatarow.h b/src/datavis3d/engine/qdatarow.h
new file mode 100644
index 00000000..13ca1af7
--- /dev/null
+++ b/src/datavis3d/engine/qdatarow.h
@@ -0,0 +1,72 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDATAROW_H
+#define QDATAROW_H
+
+#include "QtDataVis3D/qdatavis3dglobal.h"
+#include <QScopedPointer>
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+class QDataRowPrivate;
+class QDataItem;
+
+class QTCOMMERCIALDATAVIS3D_EXPORT QDataRow
+{
+public:
+ explicit QDataRow(const QString &label = QString());
+ ~QDataRow();
+
+ void setLabel(const QString &label); // label for value, unit for example
+ void addItem(QDataItem *item);
+
+private:
+ QScopedPointer<QDataRowPrivate> d_ptr;
+ friend class Q3DBars;
+ friend class Q3DBarsPrivate;
+ friend class QDataSetPrivate;
+};
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/engine/qdatarow_p.h b/src/datavis3d/engine/qdatarow_p.h
new file mode 100644
index 00000000..0224b225
--- /dev/null
+++ b/src/datavis3d/engine/qdatarow_p.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDATAROW_P_H
+#define QDATAROW_P_H
+
+#include "qdatavis3dglobal.h"
+#include "qdatarow.h"
+#include <QVector>
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+class QDataItem;
+
+class QDataRowPrivate
+{
+ public:
+ explicit QDataRowPrivate(QDataRow *q, const QString &label = QString());
+ ~QDataRowPrivate();
+
+ QVector<QDataItem*> row();
+ void verifySize(int size);
+ float highestValue();
+
+ private:
+ QDataRow *q_ptr;
+ QVector<QDataItem*> m_row;
+ QString m_label;
+ friend class QDataRow;
+};
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/engine/qdataset.cpp b/src/datavis3d/engine/qdataset.cpp
new file mode 100644
index 00000000..39b2f399
--- /dev/null
+++ b/src/datavis3d/engine/qdataset.cpp
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdataset.h"
+#include "qdataset_p.h"
+#include "qdatarow.h"
+#include "qdatarow_p.h"
+
+#include <QPoint>
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+QDataSet::QDataSet()
+ : d_ptr(new QDataSetPrivate(this))
+{
+ qDebug("QDataSet");
+}
+
+QDataSet::~QDataSet()
+{
+ qDebug("~QDataSet");
+}
+
+void QDataSet::setLabels(const QString &xAxis
+ , const QString &zAxis
+ , const QString &yAxis
+ , const QVector<QString> &labelsRow
+ , const QVector<QString> &labelsColumn)
+{
+ d_ptr->m_xAxis = xAxis;
+ d_ptr->m_zAxis = zAxis;
+ d_ptr->m_yAxis = yAxis;
+ d_ptr->m_labelsRow = labelsRow;
+ d_ptr->m_labelsColumn = labelsColumn;
+}
+
+void QDataSet::addRow(QDataRow *row)
+{
+ d_ptr->m_set.prepend(row);
+}
+
+QDataSetPrivate::QDataSetPrivate(QDataSet *q)
+ : q_ptr(q)
+ , m_set(QVector<QDataRow*>())
+ , m_xAxis(QString())
+ , m_zAxis(QString())
+ , m_yAxis(QString())
+ , m_labelsRow(QVector<QString>())
+ , m_labelsColumn(QVector<QString>())
+{
+}
+
+QDataSetPrivate::~QDataSetPrivate()
+{
+ for (int itemCount = 0; itemCount < m_set.size(); itemCount++) {
+ delete m_set.at(itemCount);
+ }
+ m_set.clear();
+}
+
+QVector<QDataRow*> QDataSetPrivate::set()
+{
+ return m_set;
+}
+
+QVector<QString> QDataSetPrivate::rowLabels()
+{
+ return m_labelsRow;
+}
+
+QVector<QString> QDataSetPrivate::columnLabels()
+{
+ return m_labelsColumn;
+}
+
+void QDataSetPrivate::axisLabels(QString *xAxis, QString *zAxis, QString *yAxis)
+{
+ *xAxis = m_xAxis;
+ *zAxis = m_zAxis;
+ *yAxis = m_yAxis;
+}
+
+void QDataSetPrivate::verifySize(int colSize, int rowSize)
+{
+ qDebug("verifySize (QDataSet)");
+ // First verify columns
+ // QVector's resize doesn't delete data contained in it
+ // Delete contents of rows to be removed
+ if (colSize > m_set.size()) {
+ int nbrToBeRemoved = m_set.size() - colSize;
+ for (int rowCount = 0; rowCount < nbrToBeRemoved; rowCount++) {
+ int rowToBeRemoved = m_set.size() - rowCount - 1; // -1 to compensate index 0
+ delete m_set.at(rowToBeRemoved);
+ }
+ // Resize vector
+ m_set.resize(colSize);
+ }
+ // Then verify each row left
+ if (rowSize) {
+ for (int i = 0; i < m_set.size(); i++)
+ m_set.at(i)->d_ptr->verifySize(rowSize);
+ }
+}
+
+float QDataSetPrivate::highestValue()
+{
+ float max = 0;
+ float rowMax = 0;
+ for (int i = 0; i < m_set.size(); i++) {
+ rowMax = m_set.at(i)->d_ptr->highestValue();
+ if (max < rowMax)
+ max = rowMax;
+ }
+ return max;
+}
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/qdataset.h b/src/datavis3d/engine/qdataset.h
new file mode 100644
index 00000000..76748b47
--- /dev/null
+++ b/src/datavis3d/engine/qdataset.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDATASET_H
+#define QDATASET_H
+
+#include "QtDataVis3D/qdatavis3dglobal.h"
+#include "qdataitem.h"
+#include "qdatarow.h"
+
+#include <QScopedPointer>
+#include <QVector>
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+class QDataSetPrivate;
+
+class QTCOMMERCIALDATAVIS3D_EXPORT QDataSet
+{
+public:
+ explicit QDataSet();
+ ~QDataSet();
+
+ void setLabels(const QString &xAxis = QString()
+ , const QString &zAxis = QString()
+ , const QString &yAxis = QString()
+ , const QVector<QString> &labelsRow = QVector<QString>()
+ , const QVector<QString> &labelsColumn = QVector<QString>());
+ void addRow(QDataRow *row);
+
+private:
+ QScopedPointer<QDataSetPrivate> d_ptr;
+ friend class Q3DBars;
+ friend class Q3DBarsPrivate;
+};
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
+
+#endif
diff --git a/src/datavis3d/engine/qdataset_p.h b/src/datavis3d/engine/qdataset_p.h
new file mode 100644
index 00000000..6f89b2b4
--- /dev/null
+++ b/src/datavis3d/engine/qdataset_p.h
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtDataVis3D module.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDATASET_P_H
+#define QDATASET_P_H
+
+#include "qdatavis3dglobal.h"
+#include "qdataset.h"
+#include <QVector>
+#include <QString>
+
+QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE
+
+class QDataSetPrivate
+{
+ public:
+ explicit QDataSetPrivate(QDataSet *q);
+ ~QDataSetPrivate();
+
+ QVector<QDataRow*> set();
+ QVector<QString> rowLabels();
+ QVector<QString> columnLabels();
+ void axisLabels(QString *xAxis, QString *zAxis, QString *yAxis);
+ void verifySize(int colSize, int rowSize = 0); // If rowSize is 0, don't verify rows
+ float highestValue();
+
+ private:
+ QDataSet *q_ptr;
+ QVector<QDataRow*> m_set;
+ QString m_xAxis;
+ QString m_zAxis;
+ QString m_yAxis;
+ QVector<QString> m_labelsRow;
+ QVector<QString> m_labelsColumn;
+ friend class QDataSet;
+};
+
+QTCOMMERCIALDATAVIS3D_END_NAMESPACE
+
+#endif