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 <QskLinearBox.h>
#include <QskSkinManager.h>
#include <QskAnimationHint.h>
#include <QskSkinTransition.h>
#include <QskSetup.h>
#include <QskSkin.h>

View File

@ -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 );
}

View File

@ -1,10 +1,11 @@
#ifndef QSK_SKIN_TRANSITION_H
#define QSK_SKIN_TRANSITION_H
#include "QskAnimationHint.h"
#include "QskAspect.h"
#include <memory>
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

View File

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