diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-01 13:15:29 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-01 14:21:24 +0300 |
commit | 8ddb504c75949203c9982a3f6945b697b85c876d (patch) | |
tree | 60211955c2a6538270a74153e3ac069f70c261e1 | |
parent | 84ebb9cf116548d4304e6a9609b76f3c78698691 (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.cpp | 9 | ||||
-rw-r--r-- | examples/rainfall/main.cpp | 24 | ||||
-rw-r--r-- | examples/widget/chart.cpp | 11 | ||||
-rw-r--r-- | src/datavis3d/axis/qabstractaxis.cpp | 8 | ||||
-rw-r--r-- | src/datavis3d/axis/qabstractaxis.h | 7 | ||||
-rw-r--r-- | src/datavis3d/axis/qabstractaxis_p.h | 7 | ||||
-rw-r--r-- | src/datavis3d/data/qdatarow.cpp | 42 | ||||
-rw-r--r-- | src/datavis3d/data/qdatarow.h | 6 | ||||
-rw-r--r-- | src/datavis3d/data/qdatarow_p.h | 9 | ||||
-rw-r--r-- | src/datavis3d/data/qdataset.cpp | 80 | ||||
-rw-r--r-- | src/datavis3d/data/qdataset.h | 6 | ||||
-rw-r--r-- | src/datavis3d/data/qdataset_p.h | 14 | ||||
-rw-r--r-- | src/datavis3d/engine/abstract3dcontroller.cpp | 65 | ||||
-rw-r--r-- | src/datavis3d/engine/abstract3dcontroller_p.h | 16 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3dcontroller.cpp | 96 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3dcontroller_p.h | 25 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3drenderer.cpp | 95 | ||||
-rw-r--r-- | src/datavis3d/engine/bars3drenderer_p.h | 7 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.cpp | 71 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.h | 31 | ||||
-rw-r--r-- | src/datavis3dqml2/declarativebars.cpp | 4 |
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; } |