From 1941fbc8476c55cbf1524ecc99a8c65618645cab Mon Sep 17 00:00:00 2001 From: Uwe Rathmann Date: Tue, 10 Mar 2020 10:30:44 +0100 Subject: [PATCH] QskControl::LayoutOutWhenHidden flag added --- src/controls/QskControl.h | 9 ++++++++- src/layouts/QskGridLayoutEngine.cpp | 2 +- src/layouts/QskLayoutEngine2D.cpp | 17 +++++++++++++++++ src/layouts/QskLayoutEngine2D.h | 1 + src/layouts/QskLinearLayoutEngine.cpp | 2 +- src/layouts/QskStackBox.cpp | 4 ++++ 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/controls/QskControl.h b/src/controls/QskControl.h index 752ee031..69eb3d79 100644 --- a/src/controls/QskControl.h +++ b/src/controls/QskControl.h @@ -59,7 +59,14 @@ class QSK_EXPORT QskControl : public QskQuickItem, public QskSkinnable enum LayoutHint { // How to be treated by layouts - RetainSizeWhenHidden = 1 << 0 + RetainSizeWhenHidden = 1 << 0, + + /* + Adjust the item even, even when being hidden + Depending on the type of layout the value only works + in combination with RetainSizeWhenHidden + */ + LayoutOutWhenHidden = 1 << 1 }; Q_ENUM( LayoutHint ) diff --git a/src/layouts/QskGridLayoutEngine.cpp b/src/layouts/QskGridLayoutEngine.cpp index dad083eb..1fa47bef 100644 --- a/src/layouts/QskGridLayoutEngine.cpp +++ b/src/layouts/QskGridLayoutEngine.cpp @@ -581,7 +581,7 @@ void QskGridLayoutEngine::layoutItems() { auto item = element.item(); - if ( item && qskIsVisibleToParent( item ) ) + if ( requiresAdjustment( item ) ) { const auto grid = m_data->effectiveGrid( element ); layoutItem( item, grid ); diff --git a/src/layouts/QskLayoutEngine2D.cpp b/src/layouts/QskLayoutEngine2D.cpp index a60d10dd..f324bc7c 100644 --- a/src/layouts/QskLayoutEngine2D.cpp +++ b/src/layouts/QskLayoutEngine2D.cpp @@ -6,6 +6,7 @@ #include "QskLayoutEngine2D.h" #include "QskLayoutChain.h" #include "QskLayoutHint.h" +#include "QskControl.h" #include "QskQuick.h" #include @@ -652,3 +653,19 @@ QskSizePolicy::ConstraintType QskLayoutEngine2D::constraintType() const return static_cast< QskSizePolicy::ConstraintType >( m_data->constraintType ); } +bool QskLayoutEngine2D::requiresAdjustment( const QQuickItem* item ) const +{ + if ( qskIsVisibleToParent( item ) ) + return true; + + if ( auto control = qskControlCast( item ) ) + { + constexpr auto mask = + QskControl::RetainSizeWhenHidden | QskControl::LayoutOutWhenHidden; + + if ( control->layoutHints() & mask ) + return true; + } + + return false; +} diff --git a/src/layouts/QskLayoutEngine2D.h b/src/layouts/QskLayoutEngine2D.h index c5b4abe8..9231c1a2 100644 --- a/src/layouts/QskLayoutEngine2D.h +++ b/src/layouts/QskLayoutEngine2D.h @@ -67,6 +67,7 @@ class QskLayoutEngine2D }; void invalidate( int what ); + bool requiresAdjustment( const QQuickItem* ) const; private: Q_DISABLE_COPY( QskLayoutEngine2D ) diff --git a/src/layouts/QskLinearLayoutEngine.cpp b/src/layouts/QskLinearLayoutEngine.cpp index 446686dd..363ba65b 100644 --- a/src/layouts/QskLinearLayoutEngine.cpp +++ b/src/layouts/QskLinearLayoutEngine.cpp @@ -348,7 +348,7 @@ void QskLinearLayoutEngine::layoutItems() if ( auto item = element.item() ) { - if ( qskIsVisibleToParent( item ) ) + if ( requiresAdjustment( item ) ) { const QRect grid( col, row, 1, 1 ); layoutItem( item, grid ); diff --git a/src/layouts/QskStackBox.cpp b/src/layouts/QskStackBox.cpp index 76ffdcec..3d85d709 100644 --- a/src/layouts/QskStackBox.cpp +++ b/src/layouts/QskStackBox.cpp @@ -331,6 +331,10 @@ void QskStackBox::updateLayout() if ( maybeUnresized() ) return; +#if 1 + // what about QskControl::LayoutOutWhenHidden +#endif + const auto index = m_data->currentIndex; if ( index >= 0 )