Fixed inability to set subviewports

Change-Id: I7966292cca04fe990a2fa6a5b4233bf89e77c553
Task-number: QTRD-1807
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Tomi Korpipää 2016-11-14 11:31:53 +02:00
parent bba7b9aced
commit 0d4096ab9d
5 changed files with 143 additions and 62 deletions

View File

@ -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);
if (m_isSlicingActive) {
QRect primary = m_primarySubViewport;
QRect secondary = m_secondarySubViewport;
if (primary.isNull())
primary = m_defaultSmallViewport;
if (secondary.isNull())
secondary = m_defaultLargeViewport;
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);
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()

View File

@ -129,6 +129,8 @@ public:
QRect m_glPrimarySubViewport;
QRect m_glSecondarySubViewport;
bool m_sceneDirty;
QRect m_defaultSmallViewport;
QRect m_defaultLargeViewport;
};
QT_END_NAMESPACE_DATAVISUALIZATION

View File

@ -111,21 +111,25 @@ void tst_scene::initializeProperties()
m_scene->setPrimarySubViewport(QRect(0, 0, 50, 50));
m_scene->setSecondarySubViewport(QRect(50, 50, 100, 100));
m_scene->setSecondarySubviewOnTop(false);
m_scene->setSelectionQueryPosition(QPoint(0, 0));
m_scene->setSlicingActive(true);
m_scene->setSelectionQueryPosition(QPoint(0, 0));
QCOMPARE(m_scene->activeCamera(), camera1);
QCOMPARE(m_scene->activeLight(), light1);
QCOMPARE(m_scene->devicePixelRatio(), 2.0f);
QCOMPARE(m_scene->graphPositionQuery(), QPoint(0, 0)); // TODO: When doing signal checks, add tests to check that queries return something (asynchronously)
// TODO: subviewports are not set (QTRD-2435)
//QCOMPARE(m_scene->primarySubViewport(), QRect(0, 0, 50, 50));
//QCOMPARE(m_scene->secondarySubViewport(), QRect(50, 50, 100, 100));
QCOMPARE(m_scene->primarySubViewport(), QRect(0, 0, 50, 50));
QCOMPARE(m_scene->secondarySubViewport(), QRect(50, 50, 100, 100));
QCOMPARE(m_scene->isSecondarySubviewOnTop(), false);
QCOMPARE(m_scene->selectionQueryPosition(), QPoint(0, 0)); // TODO: When doing signal checks, add tests to check that queries return something (asynchronously)
QCOMPARE(m_scene->isSlicingActive(), true);
// TODO: viewport is not set by subviewports (QTRD-2435)
//QCOMPARE(m_scene->viewport(), QRect(0, 0, 100, 100));
QCOMPARE(m_scene->viewport(), QRect(0, 0, 150, 150));
m_scene->setPrimarySubViewport(QRect());
m_scene->setSecondarySubViewport(QRect());
QCOMPARE(m_scene->primarySubViewport(), QRect(0, 0, 30, 30));
QCOMPARE(m_scene->secondarySubViewport(), QRect(0, 0, 150, 150));
}
void tst_scene::invalidProperties()

View File

@ -111,7 +111,7 @@ Item {
compare(empty.height, 0, "height")
compare(empty.multiSeriesUniform, false, "multiSeriesUniform")
compare(empty.barThickness, 1.0, "barThickness")
compare(empty.barSpacing, Qt.size(0.2, 0.2), "barSpacing")
compare(empty.barSpacing, Qt.size(1.0, 1.0), "barSpacing")
compare(empty.barSpacingRelative, true, "barSpacingRelative")
compare(empty.seriesList.length, 0, "seriesList")
compare(empty.selectedSeries, null, "selectedSeries")
@ -163,7 +163,7 @@ Item {
basic.barThickness = -1
basic.barSpacing = Qt.size(-1.0, -1.0)
compare(basic.barThickness, -1/*0.5*/, "barThickness") // TODO: Fix once QTRD-3367 is done
compare(basic.barSpacing, Qt.size(1.0, 0.0), "barSpacing")
compare(basic.barSpacing, Qt.size(-1.0, -1.0), "barSpacing")
waitForRendering(top)
basic.destroy()
waitForRendering(top)

View File

@ -70,12 +70,21 @@ Item {
compare(initial.scene.devicePixelRatio, 1.0)
compare(initial.scene.graphPositionQuery, Qt.point(-1, -1))
compare(initial.scene.invalidSelectionPoint, Qt.point(-1, -1))
compare(initial.scene.primarySubViewport, Qt.rect(0, 0, 0, 0))
compare(initial.scene.secondarySubViewport, Qt.rect(0, 0, 0, 0))
compare(initial.scene.primarySubViewport.x, 0)
compare(initial.scene.primarySubViewport.y, 0)
compare(initial.scene.primarySubViewport.width, 0)
compare(initial.scene.primarySubViewport.height, 0)
compare(initial.scene.secondarySubViewport.x, 0)
compare(initial.scene.secondarySubViewport.y, 0)
compare(initial.scene.secondarySubViewport.width, 0)
compare(initial.scene.secondarySubViewport.height, 0)
compare(initial.scene.secondarySubviewOnTop, true)
compare(initial.scene.selectionQueryPosition, Qt.point(-1, -1))
compare(initial.scene.slicingActive, false)
compare(initial.scene.viewport, Qt.rect(0, 0, 0, 0))
compare(initial.scene.viewport.x, 0)
compare(initial.scene.viewport.y, 0)
compare(initial.scene.viewport.width, 0)
compare(initial.scene.viewport.height, 0)
}
}
@ -91,7 +100,7 @@ Item {
compare(initialized.scene.secondarySubviewOnTop, false)
compare(initialized.scene.selectionQueryPosition, Qt.point(0, 0))
compare(initialized.scene.slicingActive, true)
compare(initialized.scene.viewport, Qt.rect(0, 0, 100, 100))
compare(initialized.scene.viewport, Qt.rect(0, 0, 150, 150))
}
}
@ -121,7 +130,7 @@ Item {
compare(change.scene.secondarySubviewOnTop, false)
compare(change.scene.selectionQueryPosition, Qt.point(0, 0))
compare(change.scene.slicingActive, true)
compare(change.scene.viewport, Qt.rect(0, 0, 100, 100))
compare(change.scene.viewport, Qt.rect(0, 0, 150, 150))
}
}
@ -130,7 +139,10 @@ Item {
function test_invalid() {
invalid.scene.primarySubViewport = Qt.rect(0, 0, -50, -50)
compare(invalid.scene.primarySubViewport, Qt.rect(0, 0, 0, 0))
compare(invalid.scene.primarySubViewport.x, 0)
compare(invalid.scene.primarySubViewport.y, 0)
compare(invalid.scene.primarySubViewport.width, 0)
compare(invalid.scene.primarySubViewport.height, 0)
}
}
}