diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-03 15:12:34 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-07-04 13:08:51 +0300 |
commit | 0963cf7feda67225700f4291264e68c9060046f6 (patch) | |
tree | 7a3e03f116e5ff2466c6e1311c9d3de4ed4f8034 /src/datavis3d/engine/bars3dcontroller.cpp | |
parent | 28ed69c2f6ba8520dc0202b94a4a3f8260ccda7e (diff) |
Data proxy implementation for bars.
Old QDataSet can be used with custom QOldDataProxy. This will be
removed entirely once we have a viable variant based proxy to use,
as it provides no real additional value over just using default
proxy directly.
Change-Id: Iee492152eec5d33b7a488053447fae6027409d71
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
Diffstat (limited to 'src/datavis3d/engine/bars3dcontroller.cpp')
-rw-r--r-- | src/datavis3d/engine/bars3dcontroller.cpp | 232 |
1 files changed, 98 insertions, 134 deletions
diff --git a/src/datavis3d/engine/bars3dcontroller.cpp b/src/datavis3d/engine/bars3dcontroller.cpp index e8734006..90390149 100644 --- a/src/datavis3d/engine/bars3dcontroller.cpp +++ b/src/datavis3d/engine/bars3dcontroller.cpp @@ -42,13 +42,11 @@ #include "bars3dcontroller_p.h" #include "bars3drenderer_p.h" #include "camerahelper_p.h" -#include "qdataitem_p.h" -#include "qdatarow_p.h" -#include "qdataset_p.h" #include "utils_p.h" #include "qabstractaxis_p.h" #include "qvalueaxis.h" #include "qcategoryaxis.h" +#include "qbardataproxy_p.h" #include <QMatrix4x4> #include <QMouseEvent> @@ -61,7 +59,6 @@ QT_DATAVIS3D_BEGIN_NAMESPACE Bars3dController::Bars3dController(QRect boundRect) : Abstract3DController(boundRect), m_isInitialized(false), - m_dataSet(new QDataSet()), m_rowCount(0), m_columnCount(0), m_mouseState(MouseNone), @@ -78,7 +75,8 @@ Bars3dController::Bars3dController(QRect boundRect) m_tickCount(0), m_tickStep(0), m_tickMinimum(0.0f), - m_renderer(0) + m_renderer(0), + m_data(new QBarDataProxy) { // Default axes. Only Y axis can actually be changed by user. setAxisX(new QCategoryAxis()); @@ -88,7 +86,7 @@ Bars3dController::Bars3dController(QRect boundRect) Bars3dController::~Bars3dController() { - delete m_dataSet; + delete m_data; } void Bars3dController::initializeOpenGL() @@ -112,7 +110,10 @@ void Bars3dController::render(const GLuint defaultFboHandle) if (!m_isInitialized) return; - 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); + // TODO do not give the entire data array, just the data window + QMutexLocker(m_data->mutex()); + m_renderer->render(m_data->array(), 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) @@ -164,16 +165,18 @@ void Bars3dController::touchEvent(QTouchEvent *event) QPointF distance = points.at(0).pos() - points.at(1).pos(); int newDistance = distance.manhattanLength(); int zoomRate = 1; - if (m_zoomLevel > 100) + int zoomLevel = m_zoomLevel; + if (zoomLevel > 100) zoomRate = 5; if (newDistance > prevDistance) - m_zoomLevel += zoomRate; + zoomLevel += zoomRate; else - m_zoomLevel -= zoomRate; - if (m_zoomLevel > 500) - m_zoomLevel = 500; - else if (m_zoomLevel < 10) - m_zoomLevel = 10; + zoomLevel -= zoomRate; + if (zoomLevel > 500) + zoomLevel = 500; + else if (zoomLevel < 10) + zoomLevel = 10; + setZoomLevel(zoomLevel); prevDistance = newDistance; //qDebug() << "distance" << distance.manhattanLength(); } @@ -238,16 +241,19 @@ void Bars3dController::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos void Bars3dController::wheelEvent(QWheelEvent *event) { - if (m_zoomLevel > 100) - m_zoomLevel += event->angleDelta().y() / 12; - else if (m_zoomLevel > 50) - m_zoomLevel += event->angleDelta().y() / 60; + int zoomLevel = m_zoomLevel; + if (zoomLevel > 100) + zoomLevel += event->angleDelta().y() / 12; + else if (zoomLevel > 50) + zoomLevel += event->angleDelta().y() / 60; else - m_zoomLevel += event->angleDelta().y() / 120; - if (m_zoomLevel > 500) - m_zoomLevel = 500; - else if (m_zoomLevel < 10) - m_zoomLevel = 10; + zoomLevel += event->angleDelta().y() / 120; + if (zoomLevel > 500) + zoomLevel = 500; + else if (zoomLevel < 10) + zoomLevel = 10; + + setZoomLevel(zoomLevel); } // TODO: abstract renderer should have accessor for Drawer instead @@ -259,6 +265,70 @@ Drawer *Bars3dController::drawer() return 0; } +void Bars3dController::setDataProxy(QBarDataProxy *proxy) +{ + delete m_data; + m_data = proxy; + + QObject::connect(m_data, &QBarDataProxy::arrayReset, this, &Bars3dController::handleArrayReset); + QObject::connect(m_data, &QBarDataProxy::rowsAdded, this, &Bars3dController::handleRowsAdded); + QObject::connect(m_data, &QBarDataProxy::rowsChanged, this, &Bars3dController::handleRowsChanged); + QObject::connect(m_data, &QBarDataProxy::rowsRemoved, this, &Bars3dController::handleRowsRemoved); + QObject::connect(m_data, &QBarDataProxy::rowsInserted, this, &Bars3dController::handleRowsInserted); + + // emit something? +} + +QBarDataProxy *Bars3dController::dataProxy() +{ + return m_data; +} + +void Bars3dController::handleArrayReset() +{ + setSlicingActive(false); + handleLimitChange(); +} + +void Bars3dController::handleRowsAdded(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + // TODO check if affects data window + // TODO should update slice instead of deactivating? + setSlicingActive(false); + handleLimitChange(); +} + +void Bars3dController::handleRowsChanged(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + // TODO check if affects data window + // TODO should update slice instead of deactivating? + setSlicingActive(false); + handleLimitChange(); +} + +void Bars3dController::handleRowsRemoved(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + // TODO check if affects data window + // TODO should update slice instead of deactivating? + setSlicingActive(false); + handleLimitChange(); +} + +void Bars3dController::handleRowsInserted(int startIndex, int count) +{ + Q_UNUSED(startIndex) + Q_UNUSED(count) + // TODO check if affects data window + // TODO should update slice instead of deactivating? + setSlicingActive(false); + handleLimitChange(); +} void Bars3dController::setBarSpecs(QSizeF thickness, QSizeF spacing, bool relative) { @@ -290,8 +360,8 @@ QString Bars3dController::objFile() QPair<GLfloat, GLfloat> Bars3dController::limits() { - if (m_dataSet->d_ptr) - return m_dataSet->d_ptr->limitValues(); + if (m_data) + return m_data->dptr()->limitValues(0, m_rowCount, 0, m_columnCount); return qMakePair(0.f, 0.f); } @@ -335,16 +405,12 @@ void Bars3dController::setMeshFileName(const QString &objFileName) emit objFileChanged(m_objFile); } +// TODO: This sets data window. Needs more parameters, now assumes window always starts at 0,0. 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); - // Recreate data set - delete m_dataSet; - m_dataSet = new QDataSet(); - emit dataSetChanged(m_dataSet->d_ptr.data()); - m_rowCount = rowCount; m_columnCount = columnCount; @@ -434,112 +500,10 @@ int Bars3dController::rowCount() void Bars3dController::handleLimitChange() { - // Get the limits - QPair<GLfloat, GLfloat> limits = m_dataSet->d_ptr->limitValues(); + // Get the limits for data window + QPair<GLfloat, GLfloat> limits = m_data->dptr()->limitValues(0, m_rowCount, 0, m_columnCount); emit limitsChanged(limits); } -void Bars3dController::addDataRow(const QVector<float> &dataRow) -{ - // Convert to QDataRow and add to QDataSet - 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(); - - m_dataSet->d_ptr->verifySize(m_rowCount); -} - -void Bars3dController::addDataRow(const QVector<QDataItem*> &dataRow) -{ - // Convert to QDataRow and add to QDataSet - 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(); - - m_dataSet->d_ptr->verifySize(m_rowCount); -} - -void Bars3dController::addDataRow(QDataRow *dataRow) -{ - // Check that the input data fits into sample space, and resize if it doesn't - dataRow->d_ptr->verifySize(m_columnCount); - // With each new row, the previous data row must be moved back - // ie. we need as many vectors as we have rows in the sample space - m_dataSet->addRow(dataRow); - // if the added data pushed us over sample space, remove the oldest data set - m_dataSet->d_ptr->verifySize(m_rowCount); - handleLimitChange(); -} - -void Bars3dController::addDataSet(const QVector< QVector<float> > &data) -{ - // Disable zoom mode if we're in it (causes crash if not, as zoom selection is deleted) - setSlicingActive(false); - // Delete old data set - delete m_dataSet; - m_dataSet = new QDataSet(); - emit dataSetChanged(m_dataSet->d_ptr.data()); - - // Convert to QDataRow and add to QDataSet - QDataRow *row; - for (int rowNr = 0; rowNr < data.size(); rowNr++) { - 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); - m_dataSet->addRow(row); - row++; - } - handleLimitChange(); - m_dataSet->d_ptr->verifySize(m_rowCount); -} - -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); - - // Delete old data set - delete m_dataSet; - m_dataSet = new QDataSet(); - emit dataSetChanged(m_dataSet->d_ptr.data()); - - // Convert to QDataRow and add to QDataSet - QDataRow *row; - for (int rowNr = 0; rowNr < data.size(); rowNr++) { - 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); - m_dataSet->addRow(row); - row++; - } - handleLimitChange(); - m_dataSet->d_ptr->verifySize(m_rowCount); -} - -void Bars3dController::addDataSet(QDataSet* dataSet) -{ - // Disable zoom mode if we're in it (causes crash if not, as zoom selection is deleted) - setSlicingActive(false); - - // Check sizes - dataSet->d_ptr->verifySize(m_rowCount, m_columnCount); - - // Delete old data set - delete m_dataSet; - // Take ownership of given set - m_dataSet = dataSet; - handleLimitChange(); - - emit dataSetChanged(m_dataSet->d_ptr.data()); -} - QT_DATAVIS3D_END_NAMESPACE |