summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-01 13:15:29 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-07-01 14:21:24 +0300
commit8ddb504c75949203c9982a3f6945b697b85c876d (patch)
tree60211955c2a6538270a74153e3ac069f70c261e1
parent84ebb9cf116548d4304e6a9609b76f3c78698691 (diff)
Decouple data and axes.
Note: Accessing same axes from renderer thread and main application thread without mutexes is not cool. Axis handling needs further thinking. Change-Id: I5cfd9a095583012a9dccff0a1769916e3da19c22 Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r--examples/barchart/main.cpp9
-rw-r--r--examples/rainfall/main.cpp24
-rw-r--r--examples/widget/chart.cpp11
-rw-r--r--src/datavis3d/axis/qabstractaxis.cpp8
-rw-r--r--src/datavis3d/axis/qabstractaxis.h7
-rw-r--r--src/datavis3d/axis/qabstractaxis_p.h7
-rw-r--r--src/datavis3d/data/qdatarow.cpp42
-rw-r--r--src/datavis3d/data/qdatarow.h6
-rw-r--r--src/datavis3d/data/qdatarow_p.h9
-rw-r--r--src/datavis3d/data/qdataset.cpp80
-rw-r--r--src/datavis3d/data/qdataset.h6
-rw-r--r--src/datavis3d/data/qdataset_p.h14
-rw-r--r--src/datavis3d/engine/abstract3dcontroller.cpp65
-rw-r--r--src/datavis3d/engine/abstract3dcontroller_p.h16
-rw-r--r--src/datavis3d/engine/bars3dcontroller.cpp96
-rw-r--r--src/datavis3d/engine/bars3dcontroller_p.h25
-rw-r--r--src/datavis3d/engine/bars3drenderer.cpp95
-rw-r--r--src/datavis3d/engine/bars3drenderer_p.h7
-rw-r--r--src/datavis3d/engine/q3dbars.cpp71
-rw-r--r--src/datavis3d/engine/q3dbars.h31
-rw-r--r--src/datavis3dqml2/declarativebars.cpp4
21 files changed, 274 insertions, 359 deletions
diff --git a/examples/barchart/main.cpp b/examples/barchart/main.cpp
index 6887bb0b..48d77f1a 100644
--- a/examples/barchart/main.cpp
+++ b/examples/barchart/main.cpp
@@ -40,6 +40,7 @@
#include "q3dbars.h"
#include "qdataset.h"
+#include "qcategoryaxis.h"
#include <QGuiApplication>
#include <QScreen>
@@ -229,12 +230,16 @@ void ChartDataGenerator::addDataSet()
QDataSet *dataSet = new QDataSet();
// Add labels
- dataSet->setLabels("Week of year", "Day of week", "Hours playing banjo", weeks, days);
+ m_chart->rowAxis()->setTitle("Week of year");
+ m_chart->columnAxis()->setTitle("Day of week");
+ m_chart->valueAxis()->setTitle("Hours playing banjo");
+ m_chart->rowAxis()->setLabels(weeks);
+ m_chart->columnAxis()->setLabels(days);
// Create data rows
QDataRow *dataRow;
for (int week = 0; week < weeks.size(); week++) {
- dataRow = new QDataRow(weeks.at(week));
+ dataRow = new QDataRow();
// Create data items
for (int day = 0; day < days.size(); day++) {
// Add data to rows
diff --git a/examples/rainfall/main.cpp b/examples/rainfall/main.cpp
index 519ccdb6..07917c69 100644
--- a/examples/rainfall/main.cpp
+++ b/examples/rainfall/main.cpp
@@ -40,6 +40,7 @@
#include "q3dbars.h"
#include "qdataitem.h"
+#include "qcategoryaxis.h"
#include <QGuiApplication>
#include <QFont>
@@ -72,9 +73,19 @@ RainfallChart::RainfallChart(Q3DBars *rainfall)
m_chart->setBarSpecs(QSizeF(1.0f, 1.0f), QSizeF(0.2f, 0.2f), true);
// Set up sample space; make it match actual data size
- m_chart->setupSampleSpace(m_columnCount, m_rowCount,
- QStringLiteral("year"), QStringLiteral("month"),
- QStringLiteral("rainfall (in mm)"));
+ m_chart->setupSampleSpace(m_columnCount, m_rowCount);
+
+ // Set axis labels and titles
+ 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->rowAxis()->setTitle("Year");
+ m_chart->columnAxis()->setTitle("Month");
+ m_chart->valueAxis()->setTitle("rainfall (in mm)");
+ m_chart->rowAxis()->setLabels(years);
+ m_chart->columnAxis()->setLabels(months);
// Set bar type to cylinder
m_chart->setBarType(Cylinders, false);
@@ -313,13 +324,8 @@ void RainfallChart::addDataSet()
row.append(new QDataItem(49, "mm")); //December 2012
data.append(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);
+ m_chart->addDataSet(data);
}
int main(int argc, char **argv)
diff --git a/examples/widget/chart.cpp b/examples/widget/chart.cpp
index aa2b5424..84a25724 100644
--- a/examples/widget/chart.cpp
+++ b/examples/widget/chart.cpp
@@ -39,6 +39,8 @@
****************************************************************************/
#include "chart.h"
+#include "qcategoryaxis.h"
+#include "qvalueaxis.h"
using namespace QtDataVis3D;
@@ -121,13 +123,16 @@ void ChartModifier::addDataSet()
QDataSet *dataSet = new QDataSet();
// Add labels
- dataSet->setLabels("Year", "Month", "Average temperature (" + celsiusString + ")",
- years, months);
+ m_chart->rowAxis()->setTitle("Year");
+ m_chart->columnAxis()->setTitle("Month");
+ m_chart->valueAxis()->setTitle("Average temperature (" + celsiusString + ")");
+ m_chart->rowAxis()->setLabels(years);
+ m_chart->columnAxis()->setLabels(months);
// Create data rows
QDataRow *dataRow;
for (int year = 0; year < years.size(); year++) {
- dataRow = new QDataRow(years.at(year));
+ dataRow = new QDataRow();
// Create data items
for (int month = 0; month < months.size(); month++) {
// Add data to rows
diff --git a/src/datavis3d/axis/qabstractaxis.cpp b/src/datavis3d/axis/qabstractaxis.cpp
index 2c35ed28..edb59985 100644
--- a/src/datavis3d/axis/qabstractaxis.cpp
+++ b/src/datavis3d/axis/qabstractaxis.cpp
@@ -59,7 +59,7 @@ QString QAbstractAxis::title() const
return d_ptr->m_title;
}
-QVector<QString> QAbstractAxis::labels() const
+QVector<QString> &QAbstractAxis::labels() const
{
return d_ptr->m_labels;
}
@@ -106,8 +106,10 @@ QAbstractAxisPrivate::~QAbstractAxisPrivate()
void QAbstractAxisPrivate::setDrawer(Drawer *drawer)
{
m_drawer = drawer;
- connect(m_drawer, SIGNAL(drawerChanged()), this, SLOT(updateTextures()));
- updateTextures();
+ if (m_drawer) {
+ connect(m_drawer, SIGNAL(drawerChanged()), this, SLOT(updateTextures()));
+ updateTextures();
+ }
}
void QAbstractAxisPrivate::setOrientation(QAbstractAxis::AxisOrientation orientation)
diff --git a/src/datavis3d/axis/qabstractaxis.h b/src/datavis3d/axis/qabstractaxis.h
index cecd110d..398643b1 100644
--- a/src/datavis3d/axis/qabstractaxis.h
+++ b/src/datavis3d/axis/qabstractaxis.h
@@ -81,7 +81,7 @@ public:
virtual ~QAbstractAxis();
QString title() const;
- QVector<QString> labels() const;
+ QVector<QString> &labels() const;
AxisOrientation orientation() const;
AxisType type() const;
@@ -98,8 +98,9 @@ protected:
private:
Q_DISABLE_COPY(QAbstractAxis)
- friend class QAbstractDataSetPrivate;
- friend class QDataSetPrivate;
+ friend class Abstract3DController;
+ friend class Bars3dController;
+ friend class Bars3dRenderer;
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/axis/qabstractaxis_p.h b/src/datavis3d/axis/qabstractaxis_p.h
index fa98f924..7d64c957 100644
--- a/src/datavis3d/axis/qabstractaxis_p.h
+++ b/src/datavis3d/axis/qabstractaxis_p.h
@@ -66,8 +66,8 @@ public:
virtual ~QAbstractAxisPrivate();
void setDrawer(Drawer *drawer);
- QVector<LabelItem> labelItems() { return m_labelItems; }
- LabelItem titleItem() { return m_titleItem; }
+ QVector<LabelItem> &labelItems() { return m_labelItems; }
+ LabelItem &titleItem() { return m_titleItem; }
void setOrientation(QAbstractAxis::AxisOrientation orientation);
public slots:
@@ -79,6 +79,8 @@ protected:
QAbstractAxis *q_ptr;
QString m_title;
+ // TODO: Does m_titleItem/m_drawer/m_labelItems usage need to be protected with render mutex?
+ // TODO: Replace Drawer with AbstractRenderer?
LabelItem m_titleItem;
Drawer *m_drawer; // not owned
QVector<QString> m_labels;
@@ -89,7 +91,6 @@ protected:
friend class QAbstractAxis;
friend class QValueAxis;
friend class QCategoryAxis;
- friend class QDataSetPrivate;
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/qdatarow.cpp b/src/datavis3d/data/qdatarow.cpp
index abf16571..4b4eab8f 100644
--- a/src/datavis3d/data/qdatarow.cpp
+++ b/src/datavis3d/data/qdatarow.cpp
@@ -67,8 +67,8 @@ QT_DATAVIS3D_BEGIN_NAMESPACE
*
* Constructs QDataRow.
*/
-QDataRow::QDataRow(const QString &label)
- : d_ptr(new QDataRowPrivate(this, label))
+QDataRow::QDataRow()
+ : d_ptr(new QDataRowPrivate(this))
{
}
@@ -80,23 +80,6 @@ QDataRow::~QDataRow()
}
/*!
- * \property QDataRow::label
- *
- * \a label A QString label for the row.
- *
- * Sets a label for the row.
- */
-void QDataRow::setLabel(const QString &label)
-{
- d_ptr->m_label = label;
-}
-
-QString QDataRow::label()
-{
- return d_ptr->m_label;
-}
-
-/*!
* \a item A QDataItem instance.
*
* Adds a QDataItem to the QDataRow. Ownership of QDataItem is transferred to QDataRow.
@@ -106,10 +89,8 @@ void QDataRow::addItem(QDataItem *item)
d_ptr->m_row.prepend(item);
}
-QDataRowPrivate::QDataRowPrivate(QDataRow *q, const QString &label)
- : q_ptr(q),
- m_label(label),
- m_labelItem(LabelItem())
+QDataRowPrivate::QDataRowPrivate(QDataRow *q)
+ : q_ptr(q)
{
}
@@ -169,19 +150,4 @@ QPair<GLfloat, GLfloat> QDataRowPrivate::limitValues()
return limits;
}
-QString QDataRowPrivate::label()
-{
- return m_label;
-}
-
-void QDataRowPrivate::setLabelItem(const LabelItem &item)
-{
- m_labelItem = item;
-}
-
-LabelItem QDataRowPrivate::labelItem()
-{
- return m_labelItem;
-}
-
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/data/qdatarow.h b/src/datavis3d/data/qdatarow.h
index 4964dc95..f7212e8c 100644
--- a/src/datavis3d/data/qdatarow.h
+++ b/src/datavis3d/data/qdatarow.h
@@ -44,7 +44,6 @@
#include "qdatavis3dnamespace.h"
#include <QScopedPointer>
-#include <QString>
#include <QObject>
QT_DATAVIS3D_BEGIN_NAMESPACE
@@ -55,14 +54,11 @@ class QDataItem;
class QT_DATAVIS3D_EXPORT QDataRow : public QObject
{
Q_OBJECT
- Q_PROPERTY(QString label READ label WRITE setLabel)
public:
- explicit QDataRow(const QString &label = QString());
+ explicit QDataRow();
~QDataRow();
- void setLabel(const QString &label); // label for value, unit for example
- QString label();
Q_INVOKABLE void addItem(QDataItem *item);
private:
diff --git a/src/datavis3d/data/qdatarow_p.h b/src/datavis3d/data/qdatarow_p.h
index 3a8bea5d..d8265142 100644
--- a/src/datavis3d/data/qdatarow_p.h
+++ b/src/datavis3d/data/qdatarow_p.h
@@ -54,9 +54,7 @@
#include "datavis3dglobal_p.h"
#include "qdatarow.h"
-#include "labelitem_p.h"
#include <QVector>
-#include <QString>
QT_DATAVIS3D_BEGIN_NAMESPACE
@@ -65,7 +63,7 @@ class QDataItem;
class QT_DATAVIS3D_EXPORT QDataRowPrivate
{
public:
- explicit QDataRowPrivate(QDataRow *q, const QString &label = QString());
+ explicit QDataRowPrivate(QDataRow *q);
~QDataRowPrivate();
QVector<QDataItem*> row();
@@ -74,15 +72,10 @@ public:
QDataItem *getItem(int itemIndex);
void verifySize(int size);
QPair<GLfloat, GLfloat> limitValues();
- QString label();
- void setLabelItem(const LabelItem &item);
- LabelItem labelItem();
private:
QDataRow *q_ptr;
QVector<QDataItem*> m_row;
- QString m_label;
- LabelItem m_labelItem;
friend class QDataRow;
};
diff --git a/src/datavis3d/data/qdataset.cpp b/src/datavis3d/data/qdataset.cpp
index d1086c44..1dcc8276 100644
--- a/src/datavis3d/data/qdataset.cpp
+++ b/src/datavis3d/data/qdataset.cpp
@@ -84,33 +84,6 @@ QDataSet::~QDataSet()
}
/*!
- * \a xAxis A QString label for x axis.
- *
- * \a zAxis A QString label for z axis.
- *
- * \a yAxis A QString label for y axis.
- *
- * \a labelsRow A QVector of QStrings, one for each row.
- *
- * \a labelsColumn A QVector of QStrings, one for each column.
- *
- * Sets labels for the QDataSet.
- */
-void QDataSet::setLabels(const QString &xAxis,
- const QString &zAxis,
- const QString &yAxis,
- const QVector<QString> &labelsRow,
- const QVector<QString> &labelsColumn)
-{
- d_ptr->m_axisX->setTitle(xAxis);
- d_ptr->m_axisZ->setTitle(zAxis);
- d_ptr->m_axisY->setTitle(yAxis);
-
- static_cast<QCategoryAxis *>(d_ptr->m_axisX)->setLabels(labelsRow);
- static_cast<QCategoryAxis *>(d_ptr->m_axisZ)->setLabels(labelsColumn);
-}
-
-/*!
* \a row A QDataRow instance.
*
* Adds a QDataRow instance to QDataSet. Ownership of the QDataRow instance is transferred to
@@ -123,10 +96,7 @@ void QDataSet::addRow(QDataRow *row)
QDataSetPrivate::QDataSetPrivate(QDataSet *q)
: q_ptr(q),
- m_set(QVector<QDataRow*>()),
- m_axisX(new QCategoryAxis()),
- m_axisY(new QValueAxis()),
- m_axisZ(new QCategoryAxis())
+ m_set(QVector<QDataRow*>())
{
}
@@ -137,13 +107,6 @@ QDataSetPrivate::~QDataSetPrivate()
m_set.clear();
}
-void QDataSetPrivate::setDrawer(Drawer *drawer)
-{
- m_axisX->d_ptr->setDrawer(drawer);
- m_axisY->d_ptr->setDrawer(drawer);
- m_axisZ->d_ptr->setDrawer(drawer);
-}
-
QVector<QDataRow*> QDataSetPrivate::set()
{
return m_set;
@@ -157,47 +120,6 @@ QDataRow *QDataSetPrivate::getRow(int rowIndex)
return row;
}
-QVector<QString> QDataSetPrivate::rowLabels()
-{
- // TODO get rid of this function
- return m_axisX->labels();
-}
-
-QVector<QString> QDataSetPrivate::columnLabels()
-{
- // TODO get rid of this function
- return m_axisZ->labels();
-}
-
-QVector<LabelItem> QDataSetPrivate::rowLabelItems()
-{
- // TODO get rid of this function
- return m_axisX->d_ptr->labelItems();
-}
-
-QVector<LabelItem> QDataSetPrivate::columnLabelItems()
-{
- // TODO get rid of this function
- return m_axisZ->d_ptr->labelItems();
-}
-
-void QDataSetPrivate::axisLabels(QString *xAxis, QString *zAxis, QString *yAxis)
-{
- // TODO get rid of this function
- *xAxis = m_axisX->title();
- *zAxis = m_axisZ->title();
- *yAxis = m_axisY->title();
-}
-
-void QDataSetPrivate::axisLabelItems(LabelItem *xAxisItem, LabelItem *zAxisItem,
- LabelItem *yAxisItem)
-{
- // TODO get rid of this function
- *xAxisItem = m_axisX->d_ptr->titleItem();
- *zAxisItem = m_axisZ->d_ptr->titleItem();
- *yAxisItem = m_axisY->d_ptr->titleItem();
-}
-
void QDataSetPrivate::verifySize(int colSize, int rowSize)
{
// First verify columns
diff --git a/src/datavis3d/data/qdataset.h b/src/datavis3d/data/qdataset.h
index b4f3bac4..ef727c6b 100644
--- a/src/datavis3d/data/qdataset.h
+++ b/src/datavis3d/data/qdataset.h
@@ -62,12 +62,6 @@ public:
explicit QDataSet();
~QDataSet();
- // TODO: Dataset specialized for bar chart. Generalize it to better serve other chart types.
- Q_INVOKABLE 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>());
Q_INVOKABLE void addRow(QDataRow *row);
private:
diff --git a/src/datavis3d/data/qdataset_p.h b/src/datavis3d/data/qdataset_p.h
index 1ef8b893..4a52d7af 100644
--- a/src/datavis3d/data/qdataset_p.h
+++ b/src/datavis3d/data/qdataset_p.h
@@ -54,7 +54,6 @@
#include "datavis3dglobal_p.h"
#include "qdataset.h"
-#include "qabstractaxis.h"
#include "drawer_p.h"
#include "labelitem_p.h"
#include <QVector>
@@ -70,19 +69,9 @@ public:
explicit QDataSetPrivate(QDataSet *q);
~QDataSetPrivate();
- void setDrawer(Drawer *drawer);
QVector<QDataRow *> set();
QDataRow *getRow(int rowIndex);
- // TODO: These functions need to go, these need to be asked from axes directly.
- // Also, these are called a lot an each call constructs a new vector...
- QVector<QString> rowLabels();
- QVector<QString> columnLabels();
- QVector<LabelItem> rowLabelItems();
- QVector<LabelItem> columnLabelItems();
- void axisLabels(QString *xAxis, QString *zAxis, QString *yAxis);
- void axisLabelItems(LabelItem *xAxisItem, LabelItem *zAxisItem, LabelItem *yAxisItem);
-
void verifySize(int colSize, int rowSize = 0); // If rowSize is 0, don't verify rows
// first = min, second = max
QPair<GLfloat, GLfloat> limitValues();
@@ -90,9 +79,6 @@ public:
private:
QDataSet *q_ptr;
QVector<QDataRow *> m_set;
- QAbstractAxis *m_axisX;
- QAbstractAxis *m_axisY;
- QAbstractAxis *m_axisZ;
friend class QDataSet;
};
diff --git a/src/datavis3d/engine/abstract3dcontroller.cpp b/src/datavis3d/engine/abstract3dcontroller.cpp
index 38401b49..9f3a5a46 100644
--- a/src/datavis3d/engine/abstract3dcontroller.cpp
+++ b/src/datavis3d/engine/abstract3dcontroller.cpp
@@ -40,20 +40,23 @@
****************************************************************************/
#include "abstract3dcontroller_p.h"
#include "camerahelper_p.h"
+#include "qabstractaxis_p.h"
QT_DATAVIS3D_BEGIN_NAMESPACE
Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
QObject(parent),
m_boundingRect(boundRect.x(), boundRect.y(), boundRect.width(), boundRect.height()),
- m_cameraHelper(new CameraHelper()),
m_horizontalRotation(-45.0f),
m_verticalRotation(15.0f),
- m_zoomLevel(100),
m_theme(),
m_shadowQuality(ShadowLow),
- m_labelTransparency(TransparencyFromTheme)
-
+ m_labelTransparency(TransparencyFromTheme),
+ m_cameraHelper(new CameraHelper()),
+ m_zoomLevel(100),
+ m_axisX(0),
+ m_axisY(0),
+ m_axisZ(0)
{
m_theme.useColorTheme(ThemeSystem);
}
@@ -61,6 +64,9 @@ Abstract3DController::Abstract3DController(QRect boundRect, QObject *parent) :
Abstract3DController::~Abstract3DController()
{
delete m_cameraHelper;
+ delete m_axisX;
+ delete m_axisY;
+ delete m_axisZ;
}
void Abstract3DController::setSize(const int width, const int height)
@@ -134,6 +140,57 @@ int Abstract3DController::y()
return m_boundingRect.y();
}
+void Abstract3DController::setAxisX(QAbstractAxis *axis)
+{
+ Q_ASSERT(axis);
+
+ delete m_axisX;
+ m_axisX = axis;
+ m_axisX->d_ptr->setOrientation(QAbstractAxis::AxisOrientationX);
+ m_axisX->d_ptr->setDrawer(drawer());
+
+ emit axisChanged(QAbstractAxis::AxisOrientationX, m_axisX);
+}
+
+QAbstractAxis *Abstract3DController::axisX()
+{
+ return m_axisX;
+}
+
+void Abstract3DController::setAxisY(QAbstractAxis *axis)
+{
+ Q_ASSERT(axis);
+
+ delete m_axisY;
+ m_axisY = axis;
+ m_axisY->d_ptr->setOrientation(QAbstractAxis::AxisOrientationY);
+ m_axisY->d_ptr->setDrawer(drawer());
+
+ emit axisChanged(QAbstractAxis::AxisOrientationY, m_axisY);
+}
+
+QAbstractAxis *Abstract3DController::axisY()
+{
+ return m_axisY;
+}
+
+void Abstract3DController::setAxisZ(QAbstractAxis *axis)
+{
+ Q_ASSERT(axis);
+
+ delete m_axisZ;
+ m_axisZ = axis;
+ m_axisZ->d_ptr->setOrientation(QAbstractAxis::AxisOrientationZ);
+ m_axisZ->d_ptr->setDrawer(drawer());
+
+ emit axisChanged(QAbstractAxis::AxisOrientationZ, m_axisZ);
+}
+
+QAbstractAxis *Abstract3DController::axisZ()
+{
+ return m_axisZ;
+}
+
int Abstract3DController::zoomLevel()
{
return m_zoomLevel;
diff --git a/src/datavis3d/engine/abstract3dcontroller_p.h b/src/datavis3d/engine/abstract3dcontroller_p.h
index aebc4228..dd8ffb1b 100644
--- a/src/datavis3d/engine/abstract3dcontroller_p.h
+++ b/src/datavis3d/engine/abstract3dcontroller_p.h
@@ -56,11 +56,12 @@
#include "datavis3dglobal_p.h"
#include "theme_p.h"
+#include "qabstractaxis.h"
+#include "drawer_p.h"
QT_DATAVIS3D_BEGIN_NAMESPACE
class CameraHelper;
-
class QT_DATAVIS3D_EXPORT Abstract3DController : public QObject
{
Q_OBJECT
@@ -76,6 +77,9 @@ private:
protected:
CameraHelper *m_cameraHelper;
int m_zoomLevel;
+ QAbstractAxis *m_axisX;
+ QAbstractAxis *m_axisY;
+ QAbstractAxis *m_axisZ;
explicit Abstract3DController(QRect boundRect, QObject *parent = 0);
~Abstract3DController();
@@ -97,6 +101,12 @@ public:
virtual int x();
virtual void setY(const int y);
virtual int y();
+ virtual void setAxisX(QAbstractAxis *axis);
+ virtual QAbstractAxis *axisX();
+ virtual void setAxisY(QAbstractAxis *axis);
+ virtual QAbstractAxis *axisY();
+ virtual void setAxisZ(QAbstractAxis *axis);
+ virtual QAbstractAxis *axisZ();
virtual int zoomLevel();
virtual void setZoomLevel(int zoomLevel);
@@ -127,6 +137,9 @@ public:
virtual void setLabelTransparency(LabelTransparency transparency);
virtual LabelTransparency labelTransparency();
+ // TODO: abstract renderer should have accessor for Drawer instead
+ virtual Drawer *drawer() = 0;
+
signals:
void boundingRectChanged(QRect boundingRect);
void sizeChanged(QRect boundingRect);
@@ -135,6 +148,7 @@ signals:
void themeChanged(Theme theme);
void shadowQualityChanged(ShadowQuality quality);
void labelTransparencyUpdated(LabelTransparency transparency);
+ void axisChanged(QAbstractAxis::AxisOrientation orientation, QAbstractAxis *newAxis);
};
QT_DATAVIS3D_END_NAMESPACE
diff --git a/src/datavis3d/engine/bars3dcontroller.cpp b/src/datavis3d/engine/bars3dcontroller.cpp
index 3d424d69..e8734006 100644
--- a/src/datavis3d/engine/bars3dcontroller.cpp
+++ b/src/datavis3d/engine/bars3dcontroller.cpp
@@ -46,6 +46,9 @@
#include "qdatarow_p.h"
#include "qdataset_p.h"
#include "utils_p.h"
+#include "qabstractaxis_p.h"
+#include "qvalueaxis.h"
+#include "qcategoryaxis.h"
#include <QMatrix4x4>
#include <QMouseEvent>
@@ -74,8 +77,13 @@ Bars3dController::Bars3dController(QRect boundRect)
m_isBackgroundEnabled(true),
m_tickCount(0),
m_tickStep(0),
- m_tickMinimum(0.0f)
+ m_tickMinimum(0.0f),
+ m_renderer(0)
{
+ // Default axes. Only Y axis can actually be changed by user.
+ setAxisX(new QCategoryAxis());
+ setAxisY(new QValueAxis());
+ setAxisZ(new QCategoryAxis());
}
Bars3dController::~Bars3dController()
@@ -90,6 +98,12 @@ void Bars3dController::initializeOpenGL()
return;
m_renderer = new Bars3dRenderer(this);
+ if (m_axisX)
+ m_axisX->d_ptr->setDrawer(m_renderer->drawer());
+ if (m_axisY)
+ m_axisY->d_ptr->setDrawer(m_renderer->drawer());
+ if (m_axisZ)
+ m_axisZ->d_ptr->setDrawer(m_renderer->drawer());
m_isInitialized = true;
}
@@ -98,12 +112,7 @@ void Bars3dController::render(const GLuint defaultFboHandle)
if (!m_isInitialized)
return;
- LabelItem x;
- LabelItem z;
- LabelItem y;
- m_dataSet->d_ptr->axisLabelItems(&x, &z, &y);
-
- m_renderer->render(m_dataSet->d_ptr.data(), m_cameraHelper, x, y, z, defaultFboHandle);
+ m_renderer->render(m_dataSet->d_ptr.data(), m_cameraHelper, m_axisX->d_ptr->titleItem(), m_axisY->d_ptr->titleItem(), m_axisZ->d_ptr->titleItem(), defaultFboHandle);
}
QMatrix4x4 Bars3dController::calculateViewMatrix(int zoom, int viewPortWidth, int viewPortHeight, bool showUnder)
@@ -241,6 +250,15 @@ void Bars3dController::wheelEvent(QWheelEvent *event)
m_zoomLevel = 10;
}
+// TODO: abstract renderer should have accessor for Drawer instead
+Drawer *Bars3dController::drawer()
+{
+ if (m_renderer)
+ return m_renderer->drawer();
+ else
+ return 0;
+}
+
void Bars3dController::setBarSpecs(QSizeF thickness, QSizeF spacing, bool relative)
{
@@ -317,8 +335,7 @@ void Bars3dController::setMeshFileName(const QString &objFileName)
emit objFileChanged(m_objFile);
}
-void Bars3dController::setupSampleSpace(int columnCount, int rowCount, const QString &labelRow,
- const QString &labelColumn, const QString &labelHeight)
+void Bars3dController::setupSampleSpace(int columnCount, int rowCount)
{
// Disable zoom mode if we're in it (causes crash if not, as zoom selection is deleted)
setSlicingActive(false);
@@ -330,7 +347,6 @@ void Bars3dController::setupSampleSpace(int columnCount, int rowCount, const QSt
m_rowCount = rowCount;
m_columnCount = columnCount;
- m_dataSet->setLabels(labelRow, labelColumn, labelHeight);
emit sampleSpaceChanged(columnCount, rowCount);
}
@@ -424,49 +440,29 @@ void Bars3dController::handleLimitChange()
emit limitsChanged(limits);
}
-void Bars3dController::addDataRow(const QVector<float> &dataRow, const QString &labelRow,
- const QVector<QString> &labelsColumn)
+void Bars3dController::addDataRow(const QVector<float> &dataRow)
{
- // Copy axis labels. TODO: Separate axis labels from data
- QString xAxis;
- QString zAxis;
- QString yAxis;
- m_dataSet->d_ptr->axisLabels(&xAxis, &zAxis, &yAxis);
-
// Convert to QDataRow and add to QDataSet
- QDataRow *row = new QDataRow(labelRow);
+ QDataRow *row = new QDataRow();
for (int i = 0; i < dataRow.size(); i++)
row->addItem(new QDataItem(dataRow.at(i)));
row->d_ptr->verifySize(m_columnCount);
m_dataSet->addRow(row);
handleLimitChange();
- // TODO: Separate axis labels from data
- m_dataSet->setLabels(xAxis, zAxis, yAxis,
- QVector<QString>(), labelsColumn);
m_dataSet->d_ptr->verifySize(m_rowCount);
}
-void Bars3dController::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labelRow,
- const QVector<QString> &labelsColumn)
+void Bars3dController::addDataRow(const QVector<QDataItem*> &dataRow)
{
- // Copy axis labels
- QString xAxis;
- QString zAxis;
- QString yAxis;
- m_dataSet->d_ptr->axisLabels(&xAxis, &zAxis, &yAxis);
-
// Convert to QDataRow and add to QDataSet
- QDataRow *row = new QDataRow(labelRow);
+ QDataRow *row = new QDataRow();
for (int i = 0; i < dataRow.size(); i++)
row->addItem(dataRow.at(i));
row->d_ptr->verifySize(m_columnCount);
m_dataSet->addRow(row);
handleLimitChange();
- // TODO: Separate axis labels from data
- m_dataSet->setLabels(xAxis, zAxis, yAxis,
- QVector<QString>(), labelsColumn);
m_dataSet->d_ptr->verifySize(m_rowCount);
}
@@ -482,16 +478,8 @@ void Bars3dController::addDataRow(QDataRow *dataRow)
handleLimitChange();
}
-void Bars3dController::addDataSet(const QVector< QVector<float> > &data,
- const QVector<QString> &labelsRow,
- const QVector<QString> &labelsColumn)
+void Bars3dController::addDataSet(const QVector< QVector<float> > &data)
{
- // Copy axis labels
- QString xAxis;
- QString zAxis;
- QString yAxis;
- m_dataSet->d_ptr->axisLabels(&xAxis, &zAxis, &yAxis);
-
// Disable zoom mode if we're in it (causes crash if not, as zoom selection is deleted)
setSlicingActive(false);
// Delete old data set
@@ -502,10 +490,7 @@ void Bars3dController::addDataSet(const QVector< QVector<float> > &data,
// Convert to QDataRow and add to QDataSet
QDataRow *row;
for (int rowNr = 0; rowNr < data.size(); rowNr++) {
- if (labelsRow.size() >= (rowNr + 1))
- row = new QDataRow(labelsRow.at(rowNr));
- else
- row = new QDataRow();
+ row = new QDataRow();
for (int colNr = 0; colNr < data.at(rowNr).size(); colNr++)
row->addItem(new QDataItem(data.at(rowNr).at(colNr)));
row->d_ptr->verifySize(m_columnCount);
@@ -513,23 +498,14 @@ void Bars3dController::addDataSet(const QVector< QVector<float> > &data,
row++;
}
handleLimitChange();
- m_dataSet->setLabels(xAxis, zAxis, yAxis, labelsRow, labelsColumn);
m_dataSet->d_ptr->verifySize(m_rowCount);
}
-void Bars3dController::addDataSet(const QVector< QVector<QDataItem*> > &data,
- const QVector<QString> &labelsRow,
- const QVector<QString> &labelsColumn)
+void Bars3dController::addDataSet(const QVector< QVector<QDataItem*> > &data)
{
// Disable zoom mode if we're in it (causes crash if not, as zoom selection is deleted)
setSlicingActive(false);
- // Copy axis labels
- QString xAxis;
- QString zAxis;
- QString yAxis;
- m_dataSet->d_ptr->axisLabels(&xAxis, &zAxis, &yAxis);
-
// Delete old data set
delete m_dataSet;
m_dataSet = new QDataSet();
@@ -538,10 +514,7 @@ void Bars3dController::addDataSet(const QVector< QVector<QDataItem*> > &data,
// Convert to QDataRow and add to QDataSet
QDataRow *row;
for (int rowNr = 0; rowNr < data.size(); rowNr++) {
- if (labelsRow.size() >= (rowNr + 1))
- row = new QDataRow(labelsRow.at(rowNr));
- else
- row = new QDataRow();
+ row = new QDataRow();
for (int colNr = 0; colNr < data.at(rowNr).size(); colNr++)
row->addItem(data.at(rowNr).at(colNr));
row->d_ptr->verifySize(m_columnCount);
@@ -549,7 +522,6 @@ void Bars3dController::addDataSet(const QVector< QVector<QDataItem*> > &data,
row++;
}
handleLimitChange();
- m_dataSet->setLabels(xAxis, zAxis, yAxis, labelsRow, labelsColumn);
m_dataSet->d_ptr->verifySize(m_rowCount);
}
diff --git a/src/datavis3d/engine/bars3dcontroller_p.h b/src/datavis3d/engine/bars3dcontroller_p.h
index 9c1ba5b7..18115deb 100644
--- a/src/datavis3d/engine/bars3dcontroller_p.h
+++ b/src/datavis3d/engine/bars3dcontroller_p.h
@@ -144,25 +144,17 @@ public:
// Add a row of data. Each new row is added to the front of the sample space, moving previous
// rows back (if sample space is more than one row deep)
- void addDataRow(const QVector<GLfloat> &dataRow,
- const QString &labelRow = QString(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataRow(const QVector<GLfloat> &dataRow);
// ownership of dataItems is transferred
- void addDataRow(const QVector<QDataItem*> &dataRow,
- const QString &labelRow = QString(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataRow(const QVector<QDataItem*> &dataRow);
// ownership of dataRow is transferred
void addDataRow(QDataRow *dataRow);
// Add complete data set at a time, as a vector of data rows
- void addDataSet(const QVector< QVector<GLfloat> > &data,
- const QVector<QString> &labelsRow = QVector<QString>(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataSet(const QVector< QVector<GLfloat> > &data);
// ownership of dataItems is transferred
- void addDataSet(const QVector< QVector<QDataItem*> > &data,
- const QVector<QString> &labelsRow = QVector<QString>(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataSet(const QVector< QVector<QDataItem*> > &data);
// ownership of dataSet is transferred
void addDataSet(QDataSet* dataSet);
@@ -186,10 +178,7 @@ public:
void setMeshFileName(const QString &objFileName);
// how many samples per row and column, and names for axes
- void setupSampleSpace(int samplesRow, int samplesColumn,
- const QString &labelRow = QString(),
- const QString &labelColumn = QString(),
- const QString &labelHeight = QString());
+ void setupSampleSpace(int samplesRow, int samplesColumn);
// Set tick count and step. Note; tickCount * step should be the maximum possible value of data
// set. Minimum is the absolute minimum possible value a bar can have. This is especially
@@ -218,7 +207,6 @@ public:
void setBackgroundEnabled(bool enable);
bool backgroundEnabled();
-
#if defined(Q_OS_ANDROID)
void mouseDoubleClickEvent(QMouseEvent *event);
void touchEvent(QTouchEvent *event);
@@ -228,6 +216,9 @@ public:
void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
void wheelEvent(QWheelEvent *event);
+ // TODO: abstract renderer should have accessor for Drawer instead
+ virtual Drawer *drawer();
+
signals:
void selectionModeChanged(SelectionMode mode);
void slicingActiveChanged(bool isSlicing);
diff --git a/src/datavis3d/engine/bars3drenderer.cpp b/src/datavis3d/engine/bars3drenderer.cpp
index e0e3d53f..9a567b3d 100644
--- a/src/datavis3d/engine/bars3drenderer.cpp
+++ b/src/datavis3d/engine/bars3drenderer.cpp
@@ -51,6 +51,7 @@
#include "theme_p.h"
#include "utils_p.h"
#include "drawer_p.h"
+#include "qabstractaxis_p.h"
#include <QMatrix4x4>
#include <QMouseEvent>
@@ -84,6 +85,8 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller)
m_hasNegativeValues(false),
m_selectedBar(0),
m_sliceSelection(0),
+ m_sliceAxisP(0),
+ m_sliceIndex(0),
m_tickCount(0),
m_tickStep(0),
m_xFlipped(false),
@@ -181,6 +184,14 @@ Bars3dRenderer::Bars3dRenderer(Bars3dController *controller)
updateBoundingRect(m_controller->boundingRect());
updateShadowQuality(m_controller->shadowQuality());
+
+ // TODO: Protect with mutex or redesign how axes create label items?
+ if (m_controller->axisX())
+ m_controller->axisX()->d_ptr->setDrawer(m_drawer);
+ if (m_controller->axisY())
+ m_controller->axisY()->d_ptr->setDrawer(m_drawer);
+ if (m_controller->axisZ())
+ m_controller->axisZ()->d_ptr->setDrawer(m_drawer);
}
Bars3dRenderer::~Bars3dRenderer()
@@ -335,14 +346,13 @@ void Bars3dRenderer::render(QDataSetPrivate *dataSet,
// If slice selection is on, draw the sliced scene
if (m_cachedIsSlicingActivated)
- drawSlicedScene(dataSet, camera, xLabel, yLabel, zLabel);
+ drawSlicedScene(camera, xLabel, yLabel, zLabel);
// Draw bars scene
drawScene(dataSet, camera, defaultFboHandle);
}
-void Bars3dRenderer::drawSlicedScene(QDataSetPrivate *dataSet,
- CameraHelper *camera,
+void Bars3dRenderer::drawSlicedScene(CameraHelper *camera,
const LabelItem &xLabel,
const LabelItem &yLabel,
const LabelItem &zLabel)
@@ -467,7 +477,7 @@ void Bars3dRenderer::drawSlicedScene(QDataSetPrivate *dataSet,
// Draw labels for axes
QDataItem *dummyItem = NULL;
- LabelItem sliceSelectionLabel = m_sliceSelection->d_ptr->labelItem();
+ LabelItem sliceSelectionLabel = m_sliceAxisP->labelItems().at(m_sliceIndex);
if (ModeZoomRow == m_cachedSelectionMode) {
m_drawer->drawLabel(*dummyItem, sliceSelectionLabel, viewMatrix, projectionMatrix,
QVector3D(0.0f, m_yAdjustment, zComp),
@@ -509,24 +519,25 @@ void Bars3dRenderer::drawSlicedScene(QDataSetPrivate *dataSet,
// Draw labels
LabelItem labelItem;
+ // TODO: Protect with mutex or redesign axis label handling?
if (ModeZoomRow == m_cachedSelectionMode) {
- if (dataSet->columnLabelItems().size() > col) {
+ if (m_controller->axisZ()->d_ptr->labelItems().size() > col) {
// If draw order of bars is flipped, label draw order should be too
if (m_xFlipped) {
- labelItem = dataSet->columnLabelItems().at(
- dataSet->columnLabelItems().size() - col - 1);
+ labelItem = m_controller->axisZ()->d_ptr->labelItems().at(
+ m_controller->axisZ()->d_ptr->labelItems().size() - col - 1);
} else {
- labelItem = dataSet->columnLabelItems().at(col);
+ labelItem = m_controller->axisZ()->d_ptr->labelItems().at(col);
}
}
} else {
- if (dataSet->rowLabelItems().size() > col) {
+ if (m_controller->axisX()->d_ptr->labelItems().size() > col) {
// If draw order of bars is flipped, label draw order should be too
if (m_zFlipped) {
- labelItem = dataSet->rowLabelItems().at(
- dataSet->rowLabelItems().size() - col - 1);
+ labelItem = m_controller->axisX()->d_ptr->labelItems().at(
+ m_controller->axisX()->d_ptr->labelItems().size() - col - 1);
} else {
- labelItem = dataSet->rowLabelItems().at(col);
+ labelItem = m_controller->axisX()->d_ptr->labelItems().at(col);
}
}
}
@@ -576,10 +587,10 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
// Calculate view matrix
QMatrix4x4 viewMatrix = m_controller->calculateViewMatrix(
- m_cachedZoomLevel * m_autoScaleAdjustment,
- m_mainViewPort.width(),
- m_mainViewPort.height(),
- m_hasNegativeValues);
+ m_cachedZoomLevel * m_autoScaleAdjustment,
+ m_mainViewPort.width(),
+ m_mainViewPort.height(),
+ m_hasNegativeValues);
// Calculate drawing order
// Draw order is reversed to optimize amount of drawing (ie. draw front objects first, depth test handles not needing to draw objects behind them)
@@ -873,8 +884,10 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
m_barShader->bind();
// Draw bars
- if (!m_cachedIsSlicingActivated && m_sliceSelection)
+ if (!m_cachedIsSlicingActivated && m_sliceSelection) {
m_sliceSelection->d_ptr->clear();
+ m_sliceAxisP = 0;
+ }
bool barSelectionFound = false;
for (int row = startRow; row != stopRow; row += stepRow) {
for (int bar = startBar; bar != stopBar; bar += stepBar) {
@@ -913,7 +926,7 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
QVector3D baseColor = Utils::vectorFromColor(m_cachedTheme.m_baseColor);
QVector3D heightColor = Utils::vectorFromColor(m_cachedTheme.m_heightColor) * barHeight;
QVector3D depthColor = Utils::vectorFromColor(m_cachedTheme.m_depthColor)
- * (float(row) / GLfloat(m_cachedRowCount));
+ * (float(row) / GLfloat(m_cachedRowCount));
QVector3D barColor = baseColor + heightColor + depthColor;
@@ -930,11 +943,11 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
// Insert data to QDataItem. We have no ownership, don't delete the previous one
if (!m_cachedIsSlicingActivated) {
m_selectedBar = item;
- if (dataSet->rowLabelItems().size() > row
- && dataSet->columnLabelItems().size() > bar) {
+ if (m_controller->axisX()->d_ptr->labelItems().size() > row
+ && m_controller->axisZ()->d_ptr->labelItems().size() > bar) {
m_selectedBar->setPosition(
- QPoint(dataSet->rowLabelItems().size() - row - 1,
- dataSet->columnLabelItems().size() - bar - 1));
+ QPoint(m_controller->axisX()->d_ptr->labelItems().size() - row - 1,
+ m_controller->axisZ()->d_ptr->labelItems().size() - bar - 1));
}
item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D());
barSelectionFound = true;
@@ -952,10 +965,9 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
if (!m_cachedIsSlicingActivated && ModeZoomRow == m_cachedSelectionMode) {
item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D());
m_sliceSelection->addItem(item);
- if (dataSet->rowLabelItems().size() > row) {
- m_sliceSelection->d_ptr->setLabelItem(
- dataSet->rowLabelItems().at(
- dataSet->rowLabelItems().size() - row - 1));
+ if (!m_sliceAxisP) {
+ m_sliceAxisP = m_controller->axisX()->d_ptr.data();
+ m_sliceIndex = row;
}
}
break;
@@ -967,10 +979,9 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
if (!m_cachedIsSlicingActivated && ModeZoomColumn == m_cachedSelectionMode) {
item->d_ptr->setTranslation(modelMatrix.column(3).toVector3D());
m_sliceSelection->addItem(item);
- if (dataSet->columnLabelItems().size() > bar) {
- m_sliceSelection->d_ptr->setLabelItem(
- dataSet->columnLabelItems().at(
- dataSet->columnLabelItems().size() - bar - 1));
+ if (!m_sliceAxisP) {
+ m_sliceAxisP = m_controller->axisZ()->d_ptr.data();
+ m_sliceIndex = bar;
}
}
break;
@@ -1382,12 +1393,12 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
LabelItem labelItem = m_selectedBar->d_ptr->selectionLabel();
if (firstSelection || prevItem != m_selectedBar || m_updateLabels) {
QString labelText = m_selectedBar->d_ptr->valueStr();
- if ((dataSet->columnLabels().size() > m_selectedBar->position().y())
- && (dataSet->rowLabels().size() > m_selectedBar->position().x())) {
+ if ((m_controller->axisZ()->labels().size() > m_selectedBar->position().y())
+ && (m_controller->axisX()->labels().size() > m_selectedBar->position().x())) {
labelText.append(QStringLiteral(" ("));
- labelText.append(dataSet->rowLabels().at(m_selectedBar->position().x()));
+ labelText.append(m_controller->axisX()->labels().at(m_selectedBar->position().x()));
labelText.append(QStringLiteral(", "));
- labelText.append(dataSet->columnLabels().at(m_selectedBar->position().y()));
+ labelText.append(m_controller->axisZ()->labels().at(m_selectedBar->position().y()));
labelText.append(QStringLiteral(")"));
//qDebug() << labelText;
}
@@ -1457,9 +1468,9 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
// Create a data item
QDataItem *label = new QDataItem();
label->d_ptr->setTranslation(labelPos);
- if (dataSet->rowLabelItems().size() > row) {
- label->d_ptr->setLabel(dataSet->rowLabelItems().at(
- dataSet->rowLabelItems().size() - row - 1));
+ if (m_controller->axisX()->d_ptr->labelItems().size() > row) {
+ label->d_ptr->setLabel(m_controller->axisX()->d_ptr->labelItems().at(
+ m_controller->axisX()->d_ptr->labelItems().size() - row - 1));
}
//qDebug() << "labelPos, row" << row + 1 << ":" << labelPos << dataSet->rowLabels().at(row);
@@ -1504,9 +1515,9 @@ void Bars3dRenderer::drawScene(QDataSetPrivate *dataSet,
// Create a data item
QDataItem *label = new QDataItem();
label->d_ptr->setTranslation(labelPos);
- if (dataSet->columnLabelItems().size() > bar) {
- label->d_ptr->setLabel(dataSet->columnLabelItems().at(
- dataSet->columnLabelItems().size()
+ if (m_controller->axisZ()->d_ptr->labelItems().size() > bar) {
+ label->d_ptr->setLabel(m_controller->axisZ()->d_ptr->labelItems().at(
+ m_controller->axisZ()->d_ptr->labelItems().size()
- bar - 1));
}
@@ -1603,9 +1614,9 @@ void Bars3dRenderer::updateSampleSpace(int columnCount, int rowCount)
calculateSceneScalingFactors();
}
-void Bars3dRenderer::updateDataSet(QDataSetPrivate *dataSet)
+void Bars3dRenderer::updateDataSet(QDataSetPrivate *)
{
- dataSet->setDrawer(m_drawer);
+ // TODO: Is this signal handler needed for anything?
}
void Bars3dRenderer::updateTheme(Theme theme)
diff --git a/src/datavis3d/engine/bars3drenderer_p.h b/src/datavis3d/engine/bars3drenderer_p.h
index e0bdb487..1e34885d 100644
--- a/src/datavis3d/engine/bars3drenderer_p.h
+++ b/src/datavis3d/engine/bars3drenderer_p.h
@@ -81,6 +81,7 @@ class Theme;
class Drawer;
class LabelItem;
class CameraHelper;
+class QAbstractAxisPrivate;
class QT_DATAVIS3D_EXPORT Bars3dRenderer : public QObject, protected QOpenGLFunctions
{
@@ -117,6 +118,8 @@ private:
bool m_hasNegativeValues;
QDataItem *m_selectedBar;
QDataRow *m_sliceSelection;
+ QAbstractAxisPrivate *m_sliceAxisP;
+ int m_sliceIndex;
GLint m_tickCount;
GLfloat m_tickStep;
bool m_xFlipped;
@@ -176,6 +179,8 @@ public:
const GLuint defaultFboHandle = 0);
QRect mainViewPort();
+ // TODO: Not thread-safe, needs rethinking how axes create labels
+ Drawer *drawer() { return m_drawer; }
public slots:
void updateBarSpecs(QSizeF thickness = QSizeF(1.0f, 1.0f),
@@ -208,7 +213,7 @@ signals:
private:
void initializeOpenGL();
- void drawSlicedScene(QDataSetPrivate *dataSet, CameraHelper *camera,
+ void drawSlicedScene(CameraHelper *camera,
const LabelItem &xLabel, const LabelItem &yLabel, const LabelItem &zLabel);
void drawScene(QDataSetPrivate *dataSet, CameraHelper *camera, const GLuint defaultFboHandle);
void handleResize();
diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp
index d3546131..bacf5dae 100644
--- a/src/datavis3d/engine/q3dbars.cpp
+++ b/src/datavis3d/engine/q3dbars.cpp
@@ -239,22 +239,14 @@ void Q3DBars::setBarType(BarStyle style, bool smooth)
*
* \a samplesColumn How many items there are per row.
*
- * \a labelRow QString label for the rows, ie. x -axis label.
- *
- * \a labelColumn QString label for the columns, ie. z -axis label.
- *
- * \a labelHeight QString label for height, ie. y -axis label.
- *
* Set up sample space. This must be called to initialize the sample space before adding data to the
* Q3DBars.
*
* \sa addDataRow(), addDataSet()
*/
-void Q3DBars::setupSampleSpace(int samplesRow, int samplesColumn, const QString &labelRow,
- const QString &labelColumn, const QString &labelHeight)
+void Q3DBars::setupSampleSpace(int samplesRow, int samplesColumn)
{
- d_ptr->m_shared->setupSampleSpace(samplesRow, samplesColumn, labelRow, labelColumn,
- labelHeight);
+ d_ptr->m_shared->setupSampleSpace(samplesRow, samplesColumn);
}
/*!
@@ -464,6 +456,28 @@ ShadowQuality Q3DBars::shadowQuality()
return d_ptr->m_shared->shadowQuality();
}
+QCategoryAxis *Q3DBars::rowAxis()
+{
+ return reinterpret_cast<QCategoryAxis *>(d_ptr->m_shared->axisX());
+}
+
+QCategoryAxis *Q3DBars::columnAxis()
+{
+ return reinterpret_cast<QCategoryAxis *>(d_ptr->m_shared->axisZ());
+}
+
+void Q3DBars::setValueAxis(QAbstractAxis *axis)
+{
+ Q_ASSERT(axis);
+
+ return d_ptr->m_shared->setAxisY(axis);
+}
+
+QAbstractAxis *Q3DBars::valueAxis()
+{
+ return d_ptr->m_shared->axisY();
+}
+
/*!
* \a tickCount How many ticks will be drawn. \c 5 by default.
*
@@ -484,34 +498,24 @@ void Q3DBars::setTickCount(GLint tickCount, GLfloat step, GLfloat minimum)
* \a dataRow A vector of floats representing a single row of data. Sample space must be large
* enough to hold the row.
*
- * \a labelRow A QString label for the row.
- *
- * \a labelsColumn A vector of strings, one for each item in the row.
- *
* Add a row of data. Each new row is added to the front of the sample space, moving previous
* rows back (if sample space is more than one row deep).
*/
-void Q3DBars::addDataRow(const QVector<float> &dataRow, const QString &labelRow,
- const QVector<QString> &labelsColumn)
+void Q3DBars::addDataRow(const QVector<float> &dataRow)
{
- d_ptr->m_shared->addDataRow(dataRow, labelRow, labelsColumn);
+ d_ptr->m_shared->addDataRow(dataRow);
}
/*!
* \a dataRow A vector of QDataItems representing a single row of data. Sample space must be
* large enough to hold the row. Ownership of QDataItems is transferred to Q3DBars.
*
- * \a labelRow A QString label for the row.
- *
- * \a labelsColumn A vector of strings, one for each item in the row.
- *
* Add a row of data. Each new row is added to the front of the sample space, moving previous
* rows back (if sample space is more than one row deep).
*/
-void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labelRow,
- const QVector<QString> &labelsColumn)
+void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow)
{
- d_ptr->m_shared->addDataRow(dataRow, labelRow, labelsColumn);
+ d_ptr->m_shared->addDataRow(dataRow);
}
/*!
@@ -530,35 +534,24 @@ void Q3DBars::addDataRow(QDataRow *dataRow)
* \a data A vector of vector of floats representing the whole data set. Sample space must be
* large enough to hold the set.
*
- * \a labelsRow A vector of strings, one for each column in the row.
- *
- * \a labelsColumn A vector of strings, one for each row in the column.
- *
* Adds a whole data set at once. If an old data set exists, it is deleted and replaced with the
* new one.
*/
-void Q3DBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QString> &labelsRow,
- const QVector<QString> &labelsColumn)
+void Q3DBars::addDataSet(const QVector< QVector<float> > &data)
{
- d_ptr->m_shared->addDataSet(data, labelsRow, labelsColumn);
+ d_ptr->m_shared->addDataSet(data);
}
/*!
* \a data A vector of vector of QDataItems representing the whole data set. Sample space must
* be large enough to hold the set. Ownership of QDataItems is transferred to Q3DBars.
*
- * \a labelsRow A vector of strings, one for each column in the row.
- *
- * \a labelsColumn A vector of strings, one for each row in the column.
- *
* Adds a whole data set at once. If an old data set exists, it is deleted and replaced with the
* new one.
*/
-void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data,
- const QVector<QString> &labelsRow,
- const QVector<QString> &labelsColumn)
+void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data)
{
- d_ptr->m_shared->addDataSet(data, labelsRow, labelsColumn);
+ d_ptr->m_shared->addDataSet(data);
}
/*!
diff --git a/src/datavis3d/engine/q3dbars.h b/src/datavis3d/engine/q3dbars.h
index b004e5f8..7a7efee7 100644
--- a/src/datavis3d/engine/q3dbars.h
+++ b/src/datavis3d/engine/q3dbars.h
@@ -44,7 +44,6 @@
#include "qdatavis3dnamespace.h"
#include "q3dwindow.h"
-
#include <QFont>
QT_DATAVIS3D_BEGIN_NAMESPACE
@@ -54,6 +53,8 @@ class QDataItem;
class QDataRow;
class QDataSet;
class LabelItem;
+class QAbstractAxis;
+class QCategoryAxis;
class QT_DATAVIS3D_EXPORT Q3DBars : public Q3DWindow
{
@@ -76,25 +77,17 @@ public:
// Add a row of data. Each new row is added to the front of the sample space, moving previous
// rows back (if sample space is more than one row deep)
- void addDataRow(const QVector<float> &dataRow,
- const QString &labelRow = QString(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataRow(const QVector<float> &dataRow);
// ownership of dataItems is transferred
- void addDataRow(const QVector<QDataItem*> &dataRow,
- const QString &labelRow = QString(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataRow(const QVector<QDataItem*> &dataRow);
// ownership of dataRow is transferred
void addDataRow(QDataRow *dataRow);
// Add complete data set at a time, as a vector of data rows
- void addDataSet(const QVector< QVector<float> > &data,
- const QVector<QString> &labelsRow = QVector<QString>(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataSet(const QVector< QVector<float> > &data);
// ownership of dataItems is transferred
- void addDataSet(const QVector< QVector<QDataItem*> > &data,
- const QVector<QString> &labelsRow = QVector<QString>(),
- const QVector<QString> &labelsColumn = QVector<QString>());
+ void addDataSet(const QVector< QVector<QDataItem*> > &data);
// ownership of dataSet is transferred
void addDataSet(QDataSet* dataSet);
@@ -109,10 +102,7 @@ public:
void setBarType(BarStyle style, bool smooth = false);
// how many samples per row and column, and names for axes
- void setupSampleSpace(int samplesRow, int samplesColumn,
- const QString &labelRow = QString(),
- const QString &labelColumn = QString(),
- const QString &labelHeight = QString());
+ void setupSampleSpace(int samplesRow, int samplesColumn);
// Select preset camera placement
void setCameraPreset(CameraPreset preset);
@@ -177,6 +167,13 @@ public:
void setShadowQuality(ShadowQuality quality);
ShadowQuality shadowQuality();
+ // Axes - row & column axes are fixed to category axes, value axis can be
+ // customized.
+ QCategoryAxis *rowAxis();
+ QCategoryAxis *columnAxis();
+ void setValueAxis(QAbstractAxis *axis);
+ QAbstractAxis *valueAxis();
+
public slots:
// Used to detect when shadow quality changes autonomously due to e.g. resizing.
void handleShadowQualityUpdate(ShadowQuality quality);
diff --git a/src/datavis3dqml2/declarativebars.cpp b/src/datavis3dqml2/declarativebars.cpp
index a1e7a737..8a760113 100644
--- a/src/datavis3dqml2/declarativebars.cpp
+++ b/src/datavis3dqml2/declarativebars.cpp
@@ -101,9 +101,7 @@ QSGNode *DeclarativeBars::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData
// Check if properites have changed that need to be applied while on the SGRenderThread
if (m_cachedState->m_isSampleSpaceSet) {
- m_shared->setupSampleSpace(m_cachedState->m_samplesRow, m_cachedState->m_samplesColumn,
- m_cachedState->m_labelRow, m_cachedState->m_labelColumn,
- m_cachedState->m_labelHeight);
+ m_shared->setupSampleSpace(m_cachedState->m_samplesRow, m_cachedState->m_samplesColumn);
m_cachedState->m_isSampleSpaceSet = false;
}