QskSkinTransition pimpled

This commit is contained in:
Uwe Rathmann 2022-03-24 11:17:03 +01:00
parent d81e8991af
commit a8b176aa71
4 changed files with 41 additions and 28 deletions

View File

@ -16,6 +16,7 @@
#include <QskBox.h> #include <QskBox.h>
#include <QskLinearBox.h> #include <QskLinearBox.h>
#include <QskSkinManager.h> #include <QskSkinManager.h>
#include <QskAnimationHint.h>
#include <QskSkinTransition.h> #include <QskSkinTransition.h>
#include <QskSetup.h> #include <QskSetup.h>
#include <QskSkin.h> #include <QskSkin.h>

View File

@ -2,6 +2,7 @@
#include "QskColorFilter.h" #include "QskColorFilter.h"
#include "QskControl.h" #include "QskControl.h"
#include "QskWindow.h" #include "QskWindow.h"
#include "QskAnimationHint.h"
#include "QskHintAnimator.h" #include "QskHintAnimator.h"
#include "QskSkin.h" #include "QskSkin.h"
#include "QskSkinHintTable.h" #include "QskSkinHintTable.h"
@ -518,10 +519,17 @@ namespace
Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator ) Q_GLOBAL_STATIC( AnimatorGroups, qskSkinAnimator )
QskSkinTransition::QskSkinTransition() class QskSkinTransition::PrivateData
: m_mask( QskSkinTransition::AllTypes ) {
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() QskSkinTransition::~QskSkinTransition()
@ -530,42 +538,42 @@ QskSkinTransition::~QskSkinTransition()
void QskSkinTransition::setMask( Type type ) void QskSkinTransition::setMask( Type type )
{ {
m_mask = type; m_data->mask = type;
} }
QskSkinTransition::Type QskSkinTransition::mask() const QskSkinTransition::Type QskSkinTransition::mask() const
{ {
return m_mask; return m_data->mask;
} }
void QskSkinTransition::setSourceSkin( QskSkin* skin ) void QskSkinTransition::setSourceSkin( QskSkin* skin )
{ {
m_skins[ 0 ] = skin; m_data->skins[ 0 ] = skin;
} }
QskSkin* QskSkinTransition::sourceSkin() const QskSkin* QskSkinTransition::sourceSkin() const
{ {
return m_skins[ 0 ]; return m_data->skins[ 0 ];
} }
void QskSkinTransition::setTargetSkin( QskSkin* skin ) void QskSkinTransition::setTargetSkin( QskSkin* skin )
{ {
m_skins[ 1 ] = skin; m_data->skins[ 1 ] = skin;
} }
QskSkin* QskSkinTransition::targetSkin() const QskSkin* QskSkinTransition::targetSkin() const
{ {
return m_skins[ 1 ]; return m_data->skins[ 1 ];
} }
void QskSkinTransition::setAnimation( QskAnimationHint animationHint ) void QskSkinTransition::setAnimation( QskAnimationHint animationHint )
{ {
m_animationHint = animationHint; m_data->animationHint = animationHint;
} }
QskAnimationHint QskSkinTransition::animation() const QskAnimationHint QskSkinTransition::animation() const
{ {
return m_animationHint; return m_data->animationHint;
} }
void QskSkinTransition::updateSkin( QskSkin*, QskSkin* ) void QskSkinTransition::updateSkin( QskSkin*, QskSkin* )
@ -575,7 +583,10 @@ void QskSkinTransition::updateSkin( QskSkin*, QskSkin* )
void QskSkinTransition::process() 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 // do nothing
return; return;
@ -583,32 +594,32 @@ void QskSkinTransition::process()
qskSkinAnimator->reset(); 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 // no animations, we can apply the changes
updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); updateSkin( skinFrom, skinTo );
return; return;
} }
QVector< AnimatorCandidate > candidates; QVector< AnimatorCandidate > candidates;
const auto oldFilters = m_skins[ 0 ]->graphicFilters(); const auto oldFilters = skinFrom->graphicFilters();
{ {
// copy out all hints before updating the skin // copy out all hints before updating the skin
// - would be good to have Copy on Write here // - would be good to have Copy on Write here
const auto oldTable = m_skins[ 0 ]->hintTable(); const auto oldTable = skinFrom->hintTable();
// apply the changes // apply the changes
updateSkin( m_skins[ 0 ], m_skins[ 1 ] ); updateSkin( skinFrom, skinTo );
candidates = qskAnimatorCandidates( m_mask, oldTable, oldFilters, candidates = qskAnimatorCandidates( m_data->mask, oldTable, oldFilters,
m_skins[ 1 ]->hintTable(), m_skins[ 1 ]->graphicFilters() ); skinTo->hintTable(), skinTo->graphicFilters() );
} }
if ( !candidates.isEmpty() ) if ( !candidates.isEmpty() )
{ {
bool doGraphicFilter = m_mask & QskSkinTransition::Color; bool doGraphicFilter = m_data->mask & QskSkinTransition::Color;
const auto windows = qGuiApp->topLevelWindows(); const auto windows = qGuiApp->topLevelWindows();
@ -617,7 +628,7 @@ void QskSkinTransition::process()
if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) ) if ( auto quickWindow = qobject_cast< QQuickWindow* >( window ) )
{ {
if ( !quickWindow->isVisible() || if ( !quickWindow->isVisible() ||
( qskEffectiveSkin( quickWindow ) != m_skins[ 1 ] ) ) ( qskEffectiveSkin( quickWindow ) != skinTo ) )
{ {
continue; continue;
} }
@ -627,8 +638,8 @@ void QskSkinTransition::process()
if ( doGraphicFilter ) if ( doGraphicFilter )
{ {
group->addGraphicFilterAnimators( group->addGraphicFilterAnimators(
m_animationHint, oldFilters, m_data->animationHint, oldFilters,
m_skins[ 1 ]->graphicFilters() ); skinTo->graphicFilters() );
doGraphicFilter = false; doGraphicFilter = false;
} }
@ -639,7 +650,7 @@ void QskSkinTransition::process()
*/ */
group->addAnimators( quickWindow->contentItem(), group->addAnimators( quickWindow->contentItem(),
m_animationHint, candidates, m_skins[ 1 ] ); m_data->animationHint, candidates, skinTo );
qskSkinAnimator->add( group ); qskSkinAnimator->add( group );
} }

View File

@ -1,10 +1,11 @@
#ifndef QSK_SKIN_TRANSITION_H #ifndef QSK_SKIN_TRANSITION_H
#define QSK_SKIN_TRANSITION_H #define QSK_SKIN_TRANSITION_H
#include "QskAnimationHint.h"
#include "QskAspect.h" #include "QskAspect.h"
#include <memory>
class QskSkin; class QskSkin;
class QskAnimationHint;
class QQuickWindow; class QQuickWindow;
class QVariant; class QVariant;
@ -46,9 +47,8 @@ class QSK_EXPORT QskSkinTransition
private: private:
Q_DISABLE_COPY( QskSkinTransition ) Q_DISABLE_COPY( QskSkinTransition )
QskSkin* m_skins[ 2 ]; class PrivateData;
QskAnimationHint m_animationHint; std::unique_ptr< PrivateData > m_data;
Type m_mask : 2;
}; };
#endif #endif

View File

@ -8,6 +8,7 @@
#include <QskSkin.h> #include <QskSkin.h>
#include <QskControl.h> #include <QskControl.h>
#include <QskQuick.h> #include <QskQuick.h>
#include <QskAnimationHint.h>
#include <QskSkinTransition.h> #include <QskSkinTransition.h>
#include <QQuickItem> #include <QQuickItem>