QskSkinTransition pimpled
This commit is contained in:
parent
d81e8991af
commit
a8b176aa71
@ -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>
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <QskSkin.h>
|
||||
#include <QskControl.h>
|
||||
#include <QskQuick.h>
|
||||
#include <QskAnimationHint.h>
|
||||
#include <QskSkinTransition.h>
|
||||
|
||||
#include <QQuickItem>
|
||||
|
Loading…
x
Reference in New Issue
Block a user