QskSkin::stateMask added to block handling of states not being supported
from the skin
This commit is contained in:
parent
84a0927c0e
commit
a6c9af503c
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user