diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 0c6d9c16..04ae7b62 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -117,6 +117,7 @@ class QskSkin::PrivateData std::unordered_map< const QMetaObject*, SkinletData > skinletMap; QskSkinHintTable hintTable; + QskAspect::State stateMask = QskAspect::AllStates; std::unordered_map< int, QFont > fonts; std::unordered_map< int, QskColorFilter > graphicFilters; @@ -439,6 +440,22 @@ const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const return QPlatformDialogHelper::buttonLayout( orientation, policy ); } +void QskSkin::setStateMask( QskAspect::State mask ) +{ + for ( auto state : { QskControl::Disabled, QskControl::Hovered, QskControl::Focused } ) + { + if ( mask & state ) + m_data->stateMask |= state; + else + m_data->stateMask &= ~state; + } +} + +QskAspect::State QskSkin::stateMask() const +{ + return m_data->stateMask; +} + QskSkinlet* QskSkin::skinlet( const QskSkinnable* skinnable ) { for ( auto metaObject = skinnable->metaObject(); diff --git a/src/controls/QskSkin.h b/src/controls/QskSkin.h index fbafef4e..684a959e 100644 --- a/src/controls/QskSkin.h +++ b/src/controls/QskSkin.h @@ -120,6 +120,9 @@ class QSK_EXPORT QskSkin : public QObject virtual const int* dialogButtonLayout( Qt::Orientation ) const; + void setStateMask( QskAspect::State ); + QskAspect::State stateMask() const; + QskSkinlet* skinlet( const QskSkinnable* ); const QskSkinHintTable& hintTable() const; diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index cc1a5759..6a0d40f3 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -550,6 +550,11 @@ QVariant QskSkinnable::animatedValue( const QVariant& QskSkinnable::storedHint( QskAspect::Aspect aspect, QskSkinHintStatus* status ) const { + const auto skin = effectiveSkin(); + + // clearing all state bits not being handled from the skin + aspect.clearState( ~skin->stateMask() ); + QskAspect::Aspect resolvedAspect; const auto& localTable = m_data->hintTable; @@ -576,7 +581,7 @@ const QVariant& QskSkinnable::storedHint( // next we try the hints from the skin - const auto& skinTable = effectiveSkin()->hintTable(); + const auto& skinTable = skin->hintTable(); if ( skinTable.hasHints() ) { QskAspect::Aspect a = aspect; @@ -819,7 +824,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState ) if ( m_data->skinState == newState ) return; - QskControl* control = owningControl(); + auto control = owningControl(); #if DEBUG_STATE qDebug() << control->className() << ":" @@ -827,6 +832,20 @@ void QskSkinnable::setSkinState( QskAspect::State newState ) << skinStateAsPrintable( newState ); #endif + const auto skin = effectiveSkin(); + + if ( skin ) + { + const auto mask = skin->stateMask(); + if ( ( newState & mask ) == ( m_data->skinState & mask ) ) + { + // the modified bits are not handled by the skin + + m_data->skinState = newState; + return; + } + } + if ( control->window() && isTransitionAccepted( QskAspect::Aspect() ) ) { const auto placement = effectivePlacement(); @@ -838,7 +857,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState ) Aspect aspect = subControl | placement; - const auto& skinTable = effectiveSkin()->hintTable(); + const auto& skinTable = skin->hintTable(); for ( int i = 0; i <= LastType; i++ ) { @@ -894,7 +913,11 @@ void QskSkinnable::setSkinState( QskAspect::State newState ) QskSkin* QskSkinnable::effectiveSkin() const { - auto skin = effectiveSkinlet()->skin(); + QskSkin* skin = nullptr; + + if ( m_data->skinlet ) + skin = m_data->skinlet->skin(); + return skin ? skin : qskSetup->skin(); } diff --git a/src/controls/QskSkinnable.h b/src/controls/QskSkinnable.h index f7b40145..fba2d15d 100644 --- a/src/controls/QskSkinnable.h +++ b/src/controls/QskSkinnable.h @@ -134,7 +134,7 @@ class QSK_EXPORT QskSkinnable QMarginsF innerPadding( QskAspect::Aspect, const QSizeF& ) const; - virtual const QskSkinlet* effectiveSkinlet() const; + const QskSkinlet* effectiveSkinlet() const; QskSkin* effectiveSkin() const; void startTransition( QskAspect::Aspect,