QskSkin::stateMask added to block handling of states not being supported

from the skin
This commit is contained in:
Uwe Rathmann 2020-03-19 14:10:50 +01:00
parent 84a0927c0e
commit a6c9af503c
4 changed files with 48 additions and 5 deletions

View File

@ -117,6 +117,7 @@ class QskSkin::PrivateData
std::unordered_map< const QMetaObject*, SkinletData > skinletMap; std::unordered_map< const QMetaObject*, SkinletData > skinletMap;
QskSkinHintTable hintTable; QskSkinHintTable hintTable;
QskAspect::State stateMask = QskAspect::AllStates;
std::unordered_map< int, QFont > fonts; std::unordered_map< int, QFont > fonts;
std::unordered_map< int, QskColorFilter > graphicFilters; std::unordered_map< int, QskColorFilter > graphicFilters;
@ -439,6 +440,22 @@ const int* QskSkin::dialogButtonLayout( Qt::Orientation orientation ) const
return QPlatformDialogHelper::buttonLayout( orientation, policy ); 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 ) QskSkinlet* QskSkin::skinlet( const QskSkinnable* skinnable )
{ {
for ( auto metaObject = skinnable->metaObject(); for ( auto metaObject = skinnable->metaObject();

View File

@ -120,6 +120,9 @@ class QSK_EXPORT QskSkin : public QObject
virtual const int* dialogButtonLayout( Qt::Orientation ) const; virtual const int* dialogButtonLayout( Qt::Orientation ) const;
void setStateMask( QskAspect::State );
QskAspect::State stateMask() const;
QskSkinlet* skinlet( const QskSkinnable* ); QskSkinlet* skinlet( const QskSkinnable* );
const QskSkinHintTable& hintTable() const; const QskSkinHintTable& hintTable() const;

View File

@ -550,6 +550,11 @@ QVariant QskSkinnable::animatedValue(
const QVariant& QskSkinnable::storedHint( const QVariant& QskSkinnable::storedHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const 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; QskAspect::Aspect resolvedAspect;
const auto& localTable = m_data->hintTable; const auto& localTable = m_data->hintTable;
@ -576,7 +581,7 @@ const QVariant& QskSkinnable::storedHint(
// next we try the hints from the skin // next we try the hints from the skin
const auto& skinTable = effectiveSkin()->hintTable(); const auto& skinTable = skin->hintTable();
if ( skinTable.hasHints() ) if ( skinTable.hasHints() )
{ {
QskAspect::Aspect a = aspect; QskAspect::Aspect a = aspect;
@ -819,7 +824,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState )
if ( m_data->skinState == newState ) if ( m_data->skinState == newState )
return; return;
QskControl* control = owningControl(); auto control = owningControl();
#if DEBUG_STATE #if DEBUG_STATE
qDebug() << control->className() << ":" qDebug() << control->className() << ":"
@ -827,6 +832,20 @@ void QskSkinnable::setSkinState( QskAspect::State newState )
<< skinStateAsPrintable( newState ); << skinStateAsPrintable( newState );
#endif #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() ) ) if ( control->window() && isTransitionAccepted( QskAspect::Aspect() ) )
{ {
const auto placement = effectivePlacement(); const auto placement = effectivePlacement();
@ -838,7 +857,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState )
Aspect aspect = subControl | placement; Aspect aspect = subControl | placement;
const auto& skinTable = effectiveSkin()->hintTable(); const auto& skinTable = skin->hintTable();
for ( int i = 0; i <= LastType; i++ ) for ( int i = 0; i <= LastType; i++ )
{ {
@ -894,7 +913,11 @@ void QskSkinnable::setSkinState( QskAspect::State newState )
QskSkin* QskSkinnable::effectiveSkin() const 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(); return skin ? skin : qskSetup->skin();
} }

View File

@ -134,7 +134,7 @@ class QSK_EXPORT QskSkinnable
QMarginsF innerPadding( QskAspect::Aspect, const QSizeF& ) const; QMarginsF innerPadding( QskAspect::Aspect, const QSizeF& ) const;
virtual const QskSkinlet* effectiveSkinlet() const; const QskSkinlet* effectiveSkinlet() const;
QskSkin* effectiveSkin() const; QskSkin* effectiveSkin() const;
void startTransition( QskAspect::Aspect, void startTransition( QskAspect::Aspect,