QskSkinTransition pimpled
This commit is contained in:
parent
d81e8991af
commit
a8b176aa71
@ -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>
|
||||||
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user