diff --git a/src/controls/QskBox.cpp b/src/controls/QskBox.cpp index ba2a64ac..19ae5a76 100644 --- a/src/controls/QskBox.cpp +++ b/src/controls/QskBox.cpp @@ -8,7 +8,13 @@ QSK_SUBCONTROL( QskBox, Panel ) QskBox::QskBox( QQuickItem* parent ) + : QskBox( true, parent ) +{ +} + +QskBox::QskBox( bool hasPanel, QQuickItem* parent ) : Inherited( parent ) + , m_hasPanel( hasPanel ) { } @@ -16,13 +22,36 @@ QskBox::~QskBox() { } +void QskBox::setPanel( bool on ) +{ + if ( on != m_hasPanel ) + { + m_hasPanel = on; + + resetImplicitSize(); + polish(); + update(); + } +} + +bool QskBox::hasPanel() const +{ + return m_hasPanel; +} + QRectF QskBox::layoutRectForSize( const QSizeF& size ) const { + if ( !m_hasPanel ) + return Inherited::layoutRectForSize( size ); + return innerBox( Panel, subControlRect( size, Panel ) ); } QSizeF QskBox::contentsSizeHint() const { + if ( !m_hasPanel ) + return Inherited::contentsSizeHint(); + QSizeF size( -1, -1 ); if ( autoLayoutChildren() ) diff --git a/src/controls/QskBox.h b/src/controls/QskBox.h index 73e638e0..0284a0f2 100644 --- a/src/controls/QskBox.h +++ b/src/controls/QskBox.h @@ -14,14 +14,28 @@ class QSK_EXPORT QskBox : public QskControl using Inherited = QskControl; + Q_PROPERTY( bool panel READ hasPanel + WRITE setPanel NOTIFY panelChanged FINAL ) + public: QSK_SUBCONTROLS( Panel ) QskBox( QQuickItem* parent = nullptr ); + QskBox( bool hasPanel, QQuickItem* parent = nullptr ); + ~QskBox() override; + void setPanel( bool ); + bool hasPanel() const; + QRectF layoutRectForSize( const QSizeF& ) const override; QSizeF contentsSizeHint() const override; + + Q_SIGNALS: + void panelChanged( bool ); + + private: + bool m_hasPanel; }; #endif diff --git a/src/controls/QskBoxSkinlet.cpp b/src/controls/QskBoxSkinlet.cpp index 0098969c..ae817509 100644 --- a/src/controls/QskBoxSkinlet.cpp +++ b/src/controls/QskBoxSkinlet.cpp @@ -30,10 +30,15 @@ QRectF QskBoxSkinlet::subControlRect( const QskSkinnable* skinnable, QSGNode* QskBoxSkinlet::updateSubNode( const QskSkinnable* skinnable, quint8 nodeRole, QSGNode* node ) const { + const auto box = static_cast< const QskBox* >( skinnable ); + switch ( nodeRole ) { case PanelRole: { + if ( !box->hasPanel() ) + return nullptr; + return updateBoxNode( skinnable, node, QskBox::Panel ); } }