summaryrefslogtreecommitdiffstats
path: root/src/datavis3d/engine/bars3dcontroller.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@digia.com>2013-08-22 12:08:47 +0300
committerMiikka Heikkinen <miikka.heikkinen@digia.com>2013-08-22 13:17:36 +0300
commit44f83ac64537ca6ac13a97a2c267492bdd288fe7 (patch)
tree19399700a719b18dda5c060a2b57ea76a85e1211 /src/datavis3d/engine/bars3dcontroller.cpp
parent3ab324d0a6d6ff5fa7d15588ee2dc613f0c5e4b9 (diff)
Selection improvements for bars:
- Signal to notify of selection change - Setting selection via API Change-Id: I87c71005d76b15dd259f745392ff7b5112d146b5 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Diffstat (limited to 'src/datavis3d/engine/bars3dcontroller.cpp')
-rw-r--r--src/datavis3d/engine/bars3dcontroller.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/datavis3d/engine/bars3dcontroller.cpp b/src/datavis3d/engine/bars3dcontroller.cpp
index 42284c56..d54aeace 100644
--- a/src/datavis3d/engine/bars3dcontroller.cpp
+++ b/src/datavis3d/engine/bars3dcontroller.cpp
@@ -37,6 +37,7 @@ Bars3dController::Bars3dController(QRect boundRect)
m_mouseState(MouseNone),
m_mousePos(QPoint(0, 0)),
m_isSlicingActivated(false),
+ m_selectedBarPos(noSelectionPoint()),
m_isBarSpecRelative(true),
m_barThicknessRatio(1.0f),
m_barSpacing(QSizeF(1.0, 1.0)),
@@ -68,6 +69,9 @@ void Bars3dController::initializeOpenGL()
m_renderer = new Bars3dRenderer(this);
setRenderer(m_renderer);
synchDataToRenderer();
+
+ QObject::connect(m_renderer, &Bars3dRenderer::selectedBarPosChanged, this,
+ &Bars3dController::handleSelectedBarPosChanged, Qt::QueuedConnection);
}
void Bars3dController::synchDataToRenderer()
@@ -93,6 +97,11 @@ void Bars3dController::synchDataToRenderer()
m_changeTracker.barSpecsChanged = false;
}
+ if (m_changeTracker.selectedBarPosChanged) {
+ m_renderer->updateSelectedBarPos(m_selectedBarPos);
+ m_changeTracker.selectedBarPosChanged = false;
+ }
+
if (m_isDataDirty) {
m_renderer->updateDataModel(m_data);
m_isDataDirty = false;
@@ -267,6 +276,7 @@ void Bars3dController::setDataProxy(QBarDataProxy *proxy)
adjustValueAxisRange();
m_isDataDirty = true;
+ setSelectedBarPos(noSelectionPoint());
}
QBarDataProxy *Bars3dController::dataProxy()
@@ -279,6 +289,7 @@ void Bars3dController::handleArrayReset()
setSlicingActive(false);
adjustValueAxisRange();
m_isDataDirty = true;
+ setSelectedBarPos(noSelectionPoint());
}
void Bars3dController::handleRowsAdded(int startIndex, int count)
@@ -312,6 +323,9 @@ void Bars3dController::handleRowsRemoved(int startIndex, int count)
setSlicingActive(false);
adjustValueAxisRange();
m_isDataDirty = true;
+ // TODO this will break once data window offset is implemented
+ if (startIndex >= m_data->rowCount())
+ setSelectedBarPos(noSelectionPoint());
}
void Bars3dController::handleRowsInserted(int startIndex, int count)
@@ -336,6 +350,17 @@ void Bars3dController::handleItemChanged(int rowIndex, int columnIndex)
m_isDataDirty = true;
}
+void Bars3dController::handleSelectedBarPosChanged(const QPoint &position)
+{
+ QPoint pos = position;
+ if (pos == QPoint(255, 255))
+ pos = noSelectionPoint();
+ if (pos != m_selectedBarPos) {
+ m_selectedBarPos = pos;
+ emit selectedBarPosChanged(pos);
+ }
+}
+
void Bars3dController::handleAxisAutoAdjustRangeChangedInOrientation(
QAbstractAxis::AxisOrientation orientation, bool autoAdjust)
{
@@ -344,6 +369,12 @@ void Bars3dController::handleAxisAutoAdjustRangeChangedInOrientation(
adjustValueAxisRange();
}
+QPoint Bars3dController::noSelectionPoint()
+{
+ static QPoint noSelectionPos(-1, -1);
+ return noSelectionPos;
+}
+
void Bars3dController::setBarSpecs(GLfloat thicknessRatio, QSizeF spacing, bool relative)
{
m_barThicknessRatio = thicknessRatio;
@@ -400,6 +431,9 @@ void Bars3dController::setDataWindow(int rowCount, int columnCount)
adjustValueAxisRange();
+ if (m_selectedBarPos.x() >= rowCount || m_selectedBarPos.y() >= columnCount)
+ setSelectedBarPos(noSelectionPoint());
+
m_changeTracker.sampleSpaceChanged = true;
emit sampleSpaceChanged(rowCount, columnCount);
}
@@ -411,6 +445,28 @@ void Bars3dController::setSelectionMode(QDataVis::SelectionMode mode)
Abstract3DController::setSelectionMode(mode);
}
+void Bars3dController::setSelectedBarPos(const QPoint &position)
+{
+ // TODO this will break once data window offset is implemented
+ QPoint pos = position;
+ if (pos.x() < 0 || pos.y() < 0
+ || pos.x() >= m_data->rowCount()
+ || pos.y() >= m_data->rowAt(pos.x())->size()) {
+ pos = noSelectionPoint();
+ }
+
+ if (pos != m_selectedBarPos) {
+ m_selectedBarPos = pos;
+ m_changeTracker.selectedBarPosChanged = true;
+ emit selectedBarPosChanged(pos);
+ }
+}
+
+QPoint Bars3dController::selectedBarPos() const
+{
+ return m_selectedBarPos;
+}
+
QPoint Bars3dController::mousePosition()
{
return m_mousePos;