diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 3a764814..996bcd02 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/src/controls/QskSkinTransition.cpp b/src/controls/QskSkinTransition.cpp index 5e20ca9f..ef3d6ec6 100644 --- a/src/controls/QskSkinTransition.cpp +++ b/src/controls/QskSkinTransition.cpp @@ -2,6 +2,7 @@ #include "QskColorFilter.h" #include "QskControl.h" #include "QskWindow.h" +#include "QskAnimationHint.h" #include "QskHintAnimator.h" #include "QskSkin.h" #include "QskSkinHintTable.h" @@ -518,10 +519,17 @@ namespace Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) -QskSkinTransition::QskSkinTransition() - : m_mask( QskSkinTransition::AllTypes ) +class QskSkinTransition::PrivateData +{ + public: + QskSkin* skins[ 2 ] = {}; + QskAnimationHint animationHint; + Type mask = QskSkinTransition::AllTypes; +}; + +QskSkinTransition::QskSkinTransition() + : m_data( new PrivateData() ) { - m_skins[ 0 ] = m_skins[ 1 ] = nullptr; } QskSkinTransition::~QskSkinTransition() @@ -530,42 +538,42 @@ QskSkinTransition::~QskSkinTransition() void QskSkinTransition::setMask( Type type ) { - m_mask = type; + m_data->mask = type; } QskSkinTransition::Type QskSkinTransition::mask() const { - return m_mask; + return m_data->mask; } void QskSkinTransition::setSourceSkin( QskSkin* skin ) { - m_skins[ 0 ] = skin; + m_data->skins[ 0 ] = skin; } QskSkin* QskSkinTransition::sourceSkin() const { - return m_skins[ 0 ]; + return m_data->skins[ 0 ]; } void QskSkinTransition::setTargetSkin( QskSkin* skin ) { - m_skins[ 1 ] = skin; + m_data->skins[ 1 ] = skin; } QskSkin* QskSkinTransition::targetSkin() const { - return m_skins[ 1 ]; + return m_data->skins[ 1 ]; } void QskSkinTransition::setAnimation( QskAnimationHint animationHint ) { - m_animationHint = animationHint; + m_data->animationHint = animationHint; } QskAnimationHint QskSkinTransition::animation() const { - return m_animationHint; + return m_data->animationHint; } void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) @@ -575,7 +583,10 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) void QskSkinTransition::process() { - if ( ( m_skins[ 0 ] == nullptr ) || ( m_skins[ 1 ] == nullptr ) ) + auto skinFrom = m_data->skins[ 0 ]; + auto skinTo = m_data->skins[ 1 ]; + + if ( ( skinFrom == nullptr ) || ( skinTo == nullptr ) ) { // do nothing return; @@ -583,32 +594,32 @@ void QskSkinTransition::process() qskSkinAnimator->reset(); - if ( ( m_animationHint.duration <= 0 ) || ( m_mask == 0 ) ) + if ( ( m_data->animationHint.duration <= 0 ) || ( m_data->mask == 0 ) ) { // no animations, we can apply the changes - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); return; } QVector< AnimatorCandidate > candidates; - const auto oldFilters = m_skins[ 0 ]->graphicFilters(); + const auto oldFilters = skinFrom->graphicFilters(); { // copy out all hints before updating the skin // - would be good to have Copy on Write here - const auto oldTable = m_skins[ 0 ]->hintTable(); + const auto oldTable = skinFrom->hintTable(); // apply the changes - updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); + updateSkin( skinFrom, skinTo ); - candidates = qskAnimatorCandidates( m_mask, oldTable, oldFilters, - m_skins[ 1 ]->hintTable(), m_skins[ 1 ]->graphicFilters() ); + candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters, + skinTo->hintTable(), skinTo->graphicFilters() ); } if ( !candidates.isEmpty() ) { - bool doGraphicFilter = m_mask & QskSkinTransition::Color; + bool doGraphicFilter = m_data->mask & QskSkinTransition::Color; const auto windows = qGuiApp->topLevelWindows(); @@ -617,7 +628,7 @@ void QskSkinTransition::process() if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) { if ( !quickWindow->isVisible() || - ( qskEffectiveSkin( quickWindow ) != m_skins[ 1 ] ) ) + ( qskEffectiveSkin( quickWindow ) != skinTo ) ) { continue; } @@ -627,8 +638,8 @@ void QskSkinTransition::process() if ( doGraphicFilter ) { group->addGraphicFilterAnimators( - m_animationHint, oldFilters, - m_skins[ 1 ]->graphicFilters() ); + m_data->animationHint, oldFilters, + skinTo->graphicFilters() ); doGraphicFilter = false; } @@ -639,7 +650,7 @@ void QskSkinTransition::process() */ group->addAnimators( quickWindow->contentItem(), - m_animationHint, candidates, m_skins[ 1 ] ); + m_data->animationHint, candidates, skinTo ); qskSkinAnimator->add( group ); } diff --git a/src/controls/QskSkinTransition.h b/src/controls/QskSkinTransition.h index 5174569b..6fc13f1b 100644 --- a/src/controls/QskSkinTransition.h +++ b/src/controls/QskSkinTransition.h @@ -1,10 +1,11 @@ #ifndef QSK_SKIN_TRANSITION_H #define QSK_SKIN_TRANSITION_H -#include "QskAnimationHint.h" #include "QskAspect.h" +#include class QskSkin; +class QskAnimationHint; class QQuickWindow; class QVariant; @@ -46,9 +47,8 @@ class QSK_EXPORT QskSkinTransition private: Q_DISABLE_COPY( QskSkinTransition ) - QskSkin* m_skins[ 2 ]; - QskAnimationHint m_animationHint; - Type m_mask : 2; + class PrivateData; + std::unique_ptr< PrivateData > m_data; }; #endif diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 44a3d423..670405ca 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include