summaryrefslogtreecommitdiffstats
path: root/src/datavisualization
diff options
context:
space:
mode:
authorTomi Korpipää <tomi.korpipaa@qt.io>2016-11-14 11:31:53 +0200
committerTomi Korpipää <tomi.korpipaa@qt.io>2016-11-14 10:39:07 +0000
commit0d4096ab9d7785d05da7f3174070f0b5e91306d9 (patch)
tree0a67f90837c9cac02272407de6d5cd636a67a0c0 /src/datavisualization
parentbba7b9aced07a5183b3ba53c4c4cbccee471a691 (diff)
Fixed inability to set subviewports
Change-Id: I7966292cca04fe990a2fa6a5b4233bf89e77c553 Task-number: QTRD-1807 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/datavisualization')
-rw-r--r--src/datavisualization/engine/q3dscene.cpp161
-rw-r--r--src/datavisualization/engine/q3dscene_p.h2
2 files changed, 114 insertions, 49 deletions
diff --git a/src/datavisualization/engine/q3dscene.cpp b/src/datavisualization/engine/q3dscene.cpp
index b1a96a2d..93056bfc 100644
--- a/src/datavisualization/engine/q3dscene.cpp
+++ b/src/datavisualization/engine/q3dscene.cpp
@@ -87,14 +87,19 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION
* \qmlproperty rect Scene3D::primarySubViewport
*
* This property contains the current subviewport rectangle inside the viewport where the
- * primary view of the data visualization is targeted to.
+ * primary view of the data visualization is targeted to. If slicingActive is false, it will be
+ * equal to viewport. If slicingActive is true and it hasn't been explicitly set, it will be one
+ * fifth of viewport.
+ * \note Setting primarySubViewport larger than or outside of viewport resizes viewport accordingly.
*/
/*!
* \qmlproperty rect Scene3D::secondarySubViewport
*
* This property contains the secondary viewport rectangle inside the viewport. The secondary
- * viewport is used for drawing the 2D slice view in some visualizations.
+ * viewport is used for drawing the 2D slice view in some visualizations. If it hasn't been
+ * explicitly set, it will be null, or viewport if slicingActive is true.
+ * \note Setting secondarySubViewport larger than or outside of viewport resizes viewport accordingly.
*/
/*!
@@ -204,24 +209,49 @@ QRect Q3DScene::viewport() const
* \property Q3DScene::primarySubViewport
*
* This property contains the current subviewport rectangle inside the viewport where the
- * primary view of the data visualization is targeted to.
+ * primary view of the data visualization is targeted to. If isSlicingActive() is false, it will be
+ * equal to viewport(). If isSlicingActive() is true and it hasn't been explicitly set, it will be
+ * one fifth of viewport().
+ * \note Setting primarySubViewport larger than or outside of viewport resizes viewport accordingly.
*/
QRect Q3DScene::primarySubViewport() const
{
- return d_ptr->m_primarySubViewport;
+ QRect primary = d_ptr->m_primarySubViewport;
+ if (primary.isNull()) {
+ if (d_ptr->m_isSlicingActive)
+ primary = d_ptr->m_defaultSmallViewport;
+ else
+ primary = d_ptr->m_defaultLargeViewport;
+ }
+ return primary;
}
void Q3DScene::setPrimarySubViewport(const QRect &primarySubViewport)
{
- QRect clipRect = QRect(0, 0, d_ptr->m_viewport.width(), d_ptr->m_viewport.height());
- QRect intersectedViewport = primarySubViewport.intersected(clipRect);
- if (d_ptr->m_primarySubViewport != intersectedViewport) {
- d_ptr->m_primarySubViewport = intersectedViewport;
+ if (d_ptr->m_primarySubViewport != primarySubViewport) {
+ if (!primarySubViewport.isValid() && !primarySubViewport.isNull()) {
+ qWarning("Viewport is invalid.");
+ return;
+ }
+
+ // If viewport is smaller than primarySubViewport, enlarge it
+ if ((d_ptr->m_viewport.width() < (primarySubViewport.width()
+ + primarySubViewport.x()))
+ || (d_ptr->m_viewport.height() < (primarySubViewport.height()
+ + primarySubViewport.y()))) {
+ d_ptr->m_viewport.setWidth(qMax(d_ptr->m_viewport.width(),
+ primarySubViewport.width() + primarySubViewport.x()));
+ d_ptr->m_viewport.setHeight(qMax(d_ptr->m_viewport.height(),
+ primarySubViewport.height() + primarySubViewport.y()));
+ d_ptr->calculateSubViewports();
+ }
+
+ d_ptr->m_primarySubViewport = primarySubViewport;
d_ptr->updateGLSubViewports();
d_ptr->m_changeTracker.primarySubViewportChanged = true;
d_ptr->m_sceneDirty = true;
- emit primarySubViewportChanged(intersectedViewport);
+ emit primarySubViewportChanged(primarySubViewport);
emit d_ptr->needRender();
}
}
@@ -236,9 +266,9 @@ bool Q3DScene::isPointInPrimarySubView(const QPoint &point)
{
int x = point.x();
int y = point.y();
- bool isInSecondary = d_ptr->isInArea(d_ptr->m_secondarySubViewport, x, y);
+ bool isInSecondary = d_ptr->isInArea(secondarySubViewport(), x, y);
if (!isInSecondary || (isInSecondary && !d_ptr->m_isSecondarySubviewOnTop))
- return d_ptr->isInArea(d_ptr->m_primarySubViewport, x, y);
+ return d_ptr->isInArea(primarySubViewport(), x, y);
else
return false;
}
@@ -253,9 +283,9 @@ bool Q3DScene::isPointInSecondarySubView(const QPoint &point)
{
int x = point.x();
int y = point.y();
- bool isInPrimary = d_ptr->isInArea(d_ptr->m_primarySubViewport, x, y);
+ bool isInPrimary = d_ptr->isInArea(primarySubViewport(), x, y);
if (!isInPrimary || (isInPrimary && d_ptr->m_isSecondarySubviewOnTop))
- return d_ptr->isInArea(d_ptr->m_secondarySubViewport, x, y);
+ return d_ptr->isInArea(secondarySubViewport(), x, y);
else
return false;
}
@@ -264,24 +294,46 @@ bool Q3DScene::isPointInSecondarySubView(const QPoint &point)
* \property Q3DScene::secondarySubViewport
*
* This property contains the secondary viewport rectangle inside the viewport. The secondary
- * viewport is used for drawing the 2D slice view in some visualizations.
+ * viewport is used for drawing the 2D slice view in some visualizations. If it hasn't been
+ * explicitly set, it will be equal to QRect(), or viewport() if isSlicingActive() is true.
+ * \note Setting secondarySubViewport larger than or outside of viewport resizes viewport accordingly.
*/
QRect Q3DScene::secondarySubViewport() const
{
- return d_ptr->m_secondarySubViewport;
+ QRect secondary = d_ptr->m_secondarySubViewport;
+ if (secondary.isNull() && d_ptr->m_isSlicingActive)
+ secondary = d_ptr->m_defaultLargeViewport;
+ return secondary;
}
void Q3DScene::setSecondarySubViewport(const QRect &secondarySubViewport)
{
- QRect clipRect = QRect(0, 0, d_ptr->m_viewport.width(), d_ptr->m_viewport.height());
- QRect intersectedViewport = secondarySubViewport.intersected(clipRect);
- if (d_ptr->m_secondarySubViewport != intersectedViewport) {
- d_ptr->m_secondarySubViewport = intersectedViewport;
+ if (d_ptr->m_secondarySubViewport != secondarySubViewport) {
+ if (!secondarySubViewport.isValid() && !secondarySubViewport.isNull()) {
+ qWarning("Viewport is invalid.");
+ return;
+ }
+
+ // If viewport is smaller than secondarySubViewport, enlarge it
+ if ((d_ptr->m_viewport.width() < (secondarySubViewport.width()
+ + secondarySubViewport.x()))
+ || (d_ptr->m_viewport.height() < (secondarySubViewport.height()
+ + secondarySubViewport.y()))) {
+ d_ptr->m_viewport.setWidth(qMax(d_ptr->m_viewport.width(),
+ secondarySubViewport.width()
+ + secondarySubViewport.x()));
+ d_ptr->m_viewport.setHeight(qMax(d_ptr->m_viewport.height(),
+ secondarySubViewport.height()
+ + secondarySubViewport.y()));
+ d_ptr->calculateSubViewports();
+ }
+
+ d_ptr->m_secondarySubViewport = secondarySubViewport;
d_ptr->updateGLSubViewports();
d_ptr->m_changeTracker.secondarySubViewportChanged = true;
d_ptr->m_sceneDirty = true;
- emit secondarySubViewportChanged(intersectedViewport);
+ emit secondarySubViewportChanged(secondarySubViewport);
emit d_ptr->needRender();
}
}
@@ -527,6 +579,7 @@ Q3DScenePrivate::Q3DScenePrivate(Q3DScene *q) :
m_isSlicingActive(false),
m_selectionQueryPosition(Q3DScene::invalidSelectionPoint()),
m_graphPositionQueryPosition(Q3DScene::invalidSelectionPoint()),
+ m_windowSize(QSize(0, 0)),
m_sceneDirty(true)
{
}
@@ -608,7 +661,7 @@ void Q3DScenePrivate::sync(Q3DScenePrivate &other)
void Q3DScenePrivate::setViewport(const QRect &viewport)
{
- if (m_viewport != viewport) {
+ if (m_viewport != viewport && viewport.isValid()) {
m_viewport = viewport;
calculateSubViewports();
emit needRender();
@@ -617,8 +670,7 @@ void Q3DScenePrivate::setViewport(const QRect &viewport)
void Q3DScenePrivate::setViewportSize(int width, int height)
{
- if (m_viewport.width() != width
- || m_viewport.height() != height) {
+ if (m_viewport.width() != width || m_viewport.height() != height) {
m_viewport.setWidth(width);
m_viewport.setHeight(height);
calculateSubViewports();
@@ -650,18 +702,14 @@ QSize Q3DScenePrivate::windowSize() const
void Q3DScenePrivate::calculateSubViewports()
{
- // Calculates the default subviewport layout
+ // Calculates the default subviewport layout, used when slicing
const float smallerViewPortRatio = 0.2f;
- if (m_isSlicingActive) {
- q_ptr->setPrimarySubViewport(QRect(0,
- 0,
- m_viewport.width() * smallerViewPortRatio,
- m_viewport.height() * smallerViewPortRatio));
- q_ptr->setSecondarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height()));
- } else {
- q_ptr->setPrimarySubViewport(QRect(0, 0, m_viewport.width(), m_viewport.height()));
- q_ptr->setSecondarySubViewport(QRect(0, 0, 0, 0));
- }
+ m_defaultSmallViewport = QRect(0, 0,
+ m_viewport.width() * smallerViewPortRatio,
+ m_viewport.height() * smallerViewPortRatio);
+ m_defaultLargeViewport = QRect(0, 0,
+ m_viewport.width(),
+ m_viewport.height());
updateGLViewport();
}
@@ -685,21 +733,36 @@ void Q3DScenePrivate::updateGLViewport()
void Q3DScenePrivate::updateGLSubViewports()
{
- m_glPrimarySubViewport.setX((m_primarySubViewport.x() + m_viewport.x()) * m_devicePixelRatio);
- m_glPrimarySubViewport.setY((m_windowSize.height() - (m_primarySubViewport.y() + m_viewport.y()
- + m_primarySubViewport.height()))
- * m_devicePixelRatio);
- m_glPrimarySubViewport.setWidth(m_primarySubViewport.width() * m_devicePixelRatio);
- m_glPrimarySubViewport.setHeight(m_primarySubViewport.height() * m_devicePixelRatio);
-
- m_glSecondarySubViewport.setX((m_secondarySubViewport.x() + m_viewport.x())
- * m_devicePixelRatio);
- m_glSecondarySubViewport.setY((m_windowSize.height() - (m_secondarySubViewport.y()
- + m_viewport.y()
- + m_secondarySubViewport.height()))
- * m_devicePixelRatio);
- m_glSecondarySubViewport.setWidth(m_secondarySubViewport.width() * m_devicePixelRatio);
- m_glSecondarySubViewport.setHeight(m_secondarySubViewport.height() * m_devicePixelRatio);
+ if (m_isSlicingActive) {
+ QRect primary = m_primarySubViewport;
+ QRect secondary = m_secondarySubViewport;
+ if (primary.isNull())
+ primary = m_defaultSmallViewport;
+ if (secondary.isNull())
+ secondary = m_defaultLargeViewport;
+
+ m_glPrimarySubViewport.setX((primary.x() + m_viewport.x()) * m_devicePixelRatio);
+ m_glPrimarySubViewport.setY((m_windowSize.height()
+ - (primary.y() + primary.height() + m_viewport.y()))
+ * m_devicePixelRatio);
+ m_glPrimarySubViewport.setWidth(primary.width() * m_devicePixelRatio);
+ m_glPrimarySubViewport.setHeight(primary.height() * m_devicePixelRatio);
+
+ m_glSecondarySubViewport.setX((secondary.x() + m_viewport.x()) * m_devicePixelRatio);
+ m_glSecondarySubViewport.setY((m_windowSize.height()
+ - (secondary.y() + secondary.height() + m_viewport.y()))
+ * m_devicePixelRatio);
+ m_glSecondarySubViewport.setWidth(secondary.width() * m_devicePixelRatio);
+ m_glSecondarySubViewport.setHeight(secondary.height() * m_devicePixelRatio);
+ } else {
+ m_glPrimarySubViewport.setX(m_viewport.x() * m_devicePixelRatio);
+ m_glPrimarySubViewport.setY((m_windowSize.height() - (m_viewport.y() + m_viewport.height()))
+ * m_devicePixelRatio);
+ m_glPrimarySubViewport.setWidth(m_viewport.width() * m_devicePixelRatio);
+ m_glPrimarySubViewport.setHeight(m_viewport.height() * m_devicePixelRatio);
+
+ m_glSecondarySubViewport = QRect();
+ }
}
QRect Q3DScenePrivate::glViewport()
diff --git a/src/datavisualization/engine/q3dscene_p.h b/src/datavisualization/engine/q3dscene_p.h
index 0ae5d91a..4056e89d 100644
--- a/src/datavisualization/engine/q3dscene_p.h
+++ b/src/datavisualization/engine/q3dscene_p.h
@@ -129,6 +129,8 @@ public:
QRect m_glPrimarySubViewport;
QRect m_glSecondarySubViewport;
bool m_sceneDirty;
+ QRect m_defaultSmallViewport;
+ QRect m_defaultLargeViewport;
};
QT_END_NAMESPACE_DATAVISUALIZATION