ubcontro, substitution moved to setSkinHint/resetHint

This commit is contained in:
Uwe Rathmann 2020-12-21 09:57:57 +01:00
parent 788c18e99f
commit bdc068c4d6
15 changed files with 156 additions and 120 deletions

View File

@ -30,9 +30,9 @@ CustomSlider::CustomSlider( QQuickItem* parentItem )
for ( auto state : { Pressed, Focused | Hovered, Hovered, Focused } ) for ( auto state : { Pressed, Focused | Hovered, Hovered, Focused } )
setColor( Handle | state, Orange600 ); setColor( Handle | state, Orange600 );
setAnimation( QskSlider::Handle | QskAspect::Color, 1000 ); setAnimationHint( Handle | QskAspect::Color, 1000 );
for ( auto state : { Focused | Hovered, Hovered, Focused } ) for ( auto state : { Focused | Hovered, Hovered, Focused } )
setAnimation( QskSlider::Handle | QskAspect::Color | state, 300 ); setAnimationHint( Handle | QskAspect::Color | state, 300 );
// using an individual skinlet, not known by the skin // using an individual skinlet, not known by the skin

View File

@ -53,11 +53,9 @@ void QskBox::setPadding( const QMarginsF& padding )
qMax( qreal( padding.right() ), qreal( 0.0 ) ), qMax( qreal( padding.right() ), qreal( 0.0 ) ),
qMax( qreal( padding.bottom() ), qreal( 0.0 ) ) ); qMax( qreal( padding.bottom() ), qreal( 0.0 ) ) );
if ( pd != this->padding() ) if ( pd != paddingHint( Panel ) )
{ {
const auto subControl = effectiveSubcontrol( Panel ); setPaddingHint( Panel, pd );
setPaddingHint( subControl, pd );
resetImplicitSize(); resetImplicitSize();
if ( polishOnResize() || autoLayoutChildren() ) if ( polishOnResize() || autoLayoutChildren() )

View File

@ -185,9 +185,7 @@ void QskControl::setMargins( const QMarginsF& margins )
if ( m != this->margins() ) if ( m != this->margins() )
{ {
const auto subControl = effectiveSubcontrol( QskAspect::Control ); setMarginHint( QskAspect::Control, m );
setMarginHint( subControl, m );
resetImplicitSize(); resetImplicitSize();
Q_D( const QskControl ); Q_D( const QskControl );

View File

@ -133,7 +133,7 @@ void QskGraphicLabel::setGraphicRole( int role )
{ {
const int oldRole = graphicRole(); const int oldRole = graphicRole();
QskSkinnable::setGraphicRole( effectiveSubcontrol( Graphic ), role ); QskSkinnable::setGraphicRole( Graphic, role );
if ( role != oldRole ) if ( role != oldRole )
{ {

View File

@ -388,8 +388,7 @@ void QskPopup::setOverlay( bool on )
{ {
if ( hasOverlay() != on ) if ( hasOverlay() != on )
{ {
const auto subControl = effectiveSubcontrol( QskPopup::Overlay ); setFlagHint( Overlay | QskAspect::Style, on );
setFlagHint( subControl | QskAspect::Style, on );
update(); update();
Q_EMIT overlayChanged( on ); Q_EMIT overlayChanged( on );

View File

@ -179,7 +179,7 @@ void QskProgressBar::resetBarGradient()
{ {
using namespace QskAspect; using namespace QskAspect;
if ( resetColor( Bar | Vertical ) || resetHint( Bar | Horizontal ) ) if ( resetColor( Bar | Vertical ) || resetColor( Bar | Horizontal ) )
update(); update();
} }
@ -192,7 +192,7 @@ void QskProgressBar::setExtent( qreal extent )
{ {
extent = qMax( extent, 0.0 ); extent = qMax( extent, 0.0 );
const auto aspect = effectiveSubcontrol( Groove ) | QskAspect::Size; const auto aspect = Groove | QskAspect::Size;
if ( extent != metric( aspect ) ) if ( extent != metric( aspect ) )
{ {

View File

@ -60,12 +60,9 @@ QskPushButton::~QskPushButton()
void QskPushButton::setCorner( const QskCorner& corner ) void QskPushButton::setCorner( const QskCorner& corner )
{ {
// effectiveSubcontrol TODO ... if ( corner.metrics() != boxShapeHint( Panel ) )
const auto aspect = Panel | QskAspect::Shape;
if ( corner.metrics() != boxShapeHint( aspect ) )
{ {
setBoxShapeHint( aspect, corner.metrics() ); setBoxShapeHint( Panel, corner.metrics() );
update(); update();
Q_EMIT cornerChanged(); Q_EMIT cornerChanged();
@ -74,7 +71,7 @@ void QskPushButton::setCorner( const QskCorner& corner )
QskCorner QskPushButton::corner() const QskCorner QskPushButton::corner() const
{ {
const auto shape = boxShapeHint( Panel | QskAspect::Shape ); const auto shape = boxShapeHint( Panel );
#if 1 #if 1
QskCorner corner; QskCorner corner;

View File

@ -54,7 +54,7 @@ void QskSeparator::setExtent( qreal extent )
{ {
extent = qMax( extent, 0.0 ); extent = qMax( extent, 0.0 );
const auto aspect = effectiveSubcontrol( Panel ) | QskAspect::Size; const auto aspect = Panel | QskAspect::Size;
if ( extent != metric( aspect ) ) if ( extent != metric( aspect ) )
{ {

View File

@ -111,6 +111,60 @@ static inline QVariant qskTypedNullValue( const QVariant& value )
return QVariant( vType, nullptr ); return QVariant( vType, nullptr );
} }
static inline void qskSetFlag( QskSkinnable* skinnable,
const QskAspect::Aspect aspect, int flag )
{
skinnable->setSkinHint( aspect | QskAspect::Flag, QVariant( flag ) );
}
static inline int qskFlag( const QskSkinnable* skinnable,
const QskAspect::Aspect aspect, QskSkinHintStatus* status = nullptr )
{
return skinnable->effectiveHint( aspect | QskAspect::Flag, status ).toInt();
}
static inline void qskSetMetric( QskSkinnable* skinnable,
const QskAspect::Aspect aspect, const QVariant& metric )
{
skinnable->setSkinHint( aspect | QskAspect::Metric, metric );
}
template< typename T >
static inline void qskSetMetric( QskSkinnable* skinnable,
QskAspect::Aspect aspect, const T& metric )
{
qskSetMetric( skinnable, aspect, QVariant::fromValue( metric ) );
}
template< typename T >
static inline T qskMetric( const QskSkinnable* skinnable,
QskAspect::Aspect aspect, QskSkinHintStatus* status = nullptr )
{
return skinnable->effectiveHint(
aspect | QskAspect::Metric, status ).value< T >();
}
static inline void qskSetColor( QskSkinnable* skinnable,
const QskAspect::Aspect aspect, const QVariant& color )
{
skinnable->setSkinHint( aspect | QskAspect::Color, color );
}
template< typename T >
static inline void qskSetColor( QskSkinnable* skinnable,
const QskAspect::Aspect aspect, const T& color )
{
qskSetColor( skinnable, aspect, QVariant::fromValue( color ) );
}
template< typename T >
static inline T qskColor( const QskSkinnable* skinnable,
QskAspect::Aspect aspect, QskSkinHintStatus* status = nullptr )
{
return skinnable->effectiveHint(
aspect | QskAspect::Color, status ).value< T >();
}
class QskSkinnable::PrivateData class QskSkinnable::PrivateData
{ {
public: public:
@ -197,7 +251,7 @@ const QskSkinHintTable& QskSkinnable::hintTable() const
void QskSkinnable::setFlagHint( QskAspect::Aspect aspect, int flag ) void QskSkinnable::setFlagHint( QskAspect::Aspect aspect, int flag )
{ {
m_data->hintTable.setHint( aspect, QVariant( flag ) ); qskSetFlag( this, aspect, flag );
} }
int QskSkinnable::flagHint( QskAspect::Aspect aspect ) const int QskSkinnable::flagHint( QskAspect::Aspect aspect ) const
@ -205,10 +259,9 @@ int QskSkinnable::flagHint( QskAspect::Aspect aspect ) const
return effectiveHint( aspect ).toInt(); return effectiveHint( aspect ).toInt();
} }
void QskSkinnable::setAlignmentHint( void QskSkinnable::setAlignmentHint( QskAspect::Aspect aspect, Qt::Alignment alignment )
QskAspect::Aspect aspect, Qt::Alignment alignment )
{ {
setFlagHint( aspect | QskAspect::Alignment, alignment ); qskSetFlag( this, aspect | QskAspect::Alignment, alignment );
} }
bool QskSkinnable::resetAlignmentHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetAlignmentHint( QskAspect::Aspect aspect )
@ -218,138 +271,132 @@ bool QskSkinnable::resetAlignmentHint( QskAspect::Aspect aspect )
void QskSkinnable::setColor( QskAspect::Aspect aspect, const QColor& color ) void QskSkinnable::setColor( QskAspect::Aspect aspect, const QColor& color )
{ {
m_data->hintTable.setColor( aspect, color ); qskSetColor( this, aspect, color );
} }
void QskSkinnable::setColor( QskAspect::Aspect aspect, Qt::GlobalColor color ) void QskSkinnable::setColor( QskAspect::Aspect aspect, Qt::GlobalColor color )
{ {
m_data->hintTable.setColor( aspect, color ); qskSetColor( this, aspect, QColor( color ) );
} }
void QskSkinnable::setColor( QskAspect::Aspect aspect, QRgb rgb ) void QskSkinnable::setColor( QskAspect::Aspect aspect, QRgb rgb )
{ {
m_data->hintTable.setColor( aspect, rgb ); qskSetColor( this, aspect, QColor::fromRgba( rgb ) );
} }
QColor QskSkinnable::color( QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QColor QskSkinnable::color( QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return effectiveHint( aspect | QskAspect::Color, status ).value< QColor >(); return qskColor< QColor >( this, aspect, status );
} }
void QskSkinnable::setMetric( QskAspect::Aspect aspect, qreal metric ) void QskSkinnable::setMetric( QskAspect::Aspect aspect, qreal metric )
{ {
m_data->hintTable.setMetric( aspect, metric ); qskSetMetric( this, aspect, metric );
} }
qreal QskSkinnable::metric( QskAspect::Aspect aspect, QskSkinHintStatus* status ) const qreal QskSkinnable::metric( QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return effectiveHint( aspect | QskAspect::Metric, status ).toReal(); return qskMetric< qreal >( this, aspect, status );
} }
void QskSkinnable::setStrutSizeHint( void QskSkinnable::setStrutSizeHint(
QskAspect::Aspect aspect, qreal width, qreal height ) QskAspect::Aspect aspect, qreal width, qreal height )
{ {
setStrutSizeHint( aspect, QSizeF( width, height ) ); qskSetMetric( this, aspect, QSizeF( width, height ) );
} }
void QskSkinnable::setStrutSizeHint( const QskAspect::Aspect aspect, const QSizeF& strut ) void QskSkinnable::setStrutSizeHint( const QskAspect::Aspect aspect, const QSizeF& strut )
{ {
m_data->hintTable.setStrutSize( aspect, strut ); qskSetMetric( this, aspect, strut );
} }
bool QskSkinnable::resetStrutSizeHint( const QskAspect::Aspect aspect ) bool QskSkinnable::resetStrutSizeHint( const QskAspect::Aspect aspect )
{ {
return resetHint( aspect | QskAspect::Metric | QskAspect::StrutSize ); return resetMetric( aspect | QskAspect::StrutSize );
} }
QSizeF QskSkinnable::strutSizeHint( QSizeF QskSkinnable::strutSizeHint(
const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::StrutSize; return qskMetric< QSizeF >( this, aspect | QskAspect::StrutSize, status );
return effectiveHint( asp, status ).value< QSizeF >();
} }
void QskSkinnable::setMarginHint( QskAspect::Aspect aspect, qreal margins ) void QskSkinnable::setMarginHint( QskAspect::Aspect aspect, qreal margins )
{ {
m_data->hintTable.setMargin( aspect, QskMargins( margins ) ); qskSetMetric( this, aspect | QskAspect::Margin, QskMargins( margins ) );
} }
void QskSkinnable::setMarginHint( QskAspect::Aspect aspect, const QMarginsF& margins ) void QskSkinnable::setMarginHint( QskAspect::Aspect aspect, const QMarginsF& margins )
{ {
m_data->hintTable.setMargin( aspect, margins ); qskSetMetric( this, aspect | QskAspect::Margin, QskMargins( margins ) );
} }
bool QskSkinnable::resetMarginHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetMarginHint( QskAspect::Aspect aspect )
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Margin; return resetMetric( aspect | QskAspect::Margin );
return resetHint( asp );
} }
QMarginsF QskSkinnable::marginHint( QMarginsF QskSkinnable::marginHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Margin; return qskMetric< QskMargins >( this, aspect | QskAspect::Margin, status );
return effectiveHint( asp, status ).value< QskMargins >();
} }
void QskSkinnable::setPaddingHint( QskAspect::Aspect aspect, qreal padding ) void QskSkinnable::setPaddingHint( QskAspect::Aspect aspect, qreal padding )
{ {
m_data->hintTable.setPadding( aspect, QskMargins( padding ) ); qskSetMetric( this, aspect | QskAspect::Padding, QskMargins( padding ) );
} }
void QskSkinnable::setPaddingHint( QskAspect::Aspect aspect, const QMarginsF& padding ) void QskSkinnable::setPaddingHint( QskAspect::Aspect aspect, const QMarginsF& padding )
{ {
m_data->hintTable.setPadding( aspect, padding ); qskSetMetric( this, aspect | QskAspect::Padding, QskMargins( padding ) );
} }
bool QskSkinnable::resetPaddingHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetPaddingHint( QskAspect::Aspect aspect )
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Padding; return resetMetric( aspect | QskAspect::Padding );
return resetHint( asp );
} }
QMarginsF QskSkinnable::paddingHint( QMarginsF QskSkinnable::paddingHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Padding; return qskMetric< QskMargins >( this, aspect | QskAspect::Padding, status );
return effectiveHint( asp, status ).value< QskMargins >();
} }
void QskSkinnable::setGradientHint( void QskSkinnable::setGradientHint(
QskAspect::Aspect aspect, const QskGradient& gradient ) QskAspect::Aspect aspect, const QskGradient& gradient )
{ {
m_data->hintTable.setGradient( aspect, gradient ); qskSetColor( this, aspect, gradient );
} }
QskGradient QskSkinnable::gradientHint( QskGradient QskSkinnable::gradientHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return effectiveHint( aspect | QskAspect::Color, status ).value< QskGradient >(); return qskColor< QskGradient >( this, aspect, status );
} }
void QskSkinnable::setBoxShapeHint( void QskSkinnable::setBoxShapeHint(
QskAspect::Aspect aspect, const QskBoxShapeMetrics& shape ) QskAspect::Aspect aspect, const QskBoxShapeMetrics& shape )
{ {
m_data->hintTable.setBoxShape( aspect, shape ); qskSetMetric( this, aspect | QskAspect::Shape, shape );
} }
bool QskSkinnable::resetBoxShapeHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetBoxShapeHint( QskAspect::Aspect aspect )
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Shape; return resetMetric( aspect | QskAspect::Shape );
return resetHint( asp );
} }
QskBoxShapeMetrics QskSkinnable::boxShapeHint( QskBoxShapeMetrics QskSkinnable::boxShapeHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Shape; return qskMetric< QskBoxShapeMetrics >(
return effectiveHint( asp, status ).value< QskBoxShapeMetrics >(); this, aspect | QskAspect::Shape, status );
} }
void QskSkinnable::setBoxBorderMetricsHint( void QskSkinnable::setBoxBorderMetricsHint(
QskAspect::Aspect aspect, const QskBoxBorderMetrics& border ) QskAspect::Aspect aspect, const QskBoxBorderMetrics& border )
{ {
m_data->hintTable.setBoxBorder( aspect, border ); qskSetMetric( this, aspect | QskAspect::Border, border );
} }
bool QskSkinnable::resetBoxBorderMetricsHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetBoxBorderMetricsHint( QskAspect::Aspect aspect )
@ -361,45 +408,43 @@ bool QskSkinnable::resetBoxBorderMetricsHint( QskAspect::Aspect aspect )
QskBoxBorderMetrics QskSkinnable::boxBorderMetricsHint( QskBoxBorderMetrics QskSkinnable::boxBorderMetricsHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Metric | QskAspect::Border; return qskMetric< QskBoxBorderMetrics >(
return effectiveHint( asp, status ).value< QskBoxBorderMetrics >(); this, aspect | QskAspect::Border, status );
} }
void QskSkinnable::setBoxBorderColorsHint( void QskSkinnable::setBoxBorderColorsHint(
QskAspect::Aspect aspect, const QskBoxBorderColors& colors ) QskAspect::Aspect aspect, const QskBoxBorderColors& colors )
{ {
m_data->hintTable.setBoxBorderColors( aspect, colors ); qskSetColor( this, aspect | QskAspect::Border, colors );
} }
bool QskSkinnable::resetBoxBorderColorsHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetBoxBorderColorsHint( QskAspect::Aspect aspect )
{ {
const auto asp = aspect | QskAspect::Color | QskAspect::Border; return resetColor( aspect | QskAspect::Border );
return resetHint( asp );
} }
QskBoxBorderColors QskSkinnable::boxBorderColorsHint( QskBoxBorderColors QskSkinnable::boxBorderColorsHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto asp = aspect | QskAspect::Color | QskAspect::Border; return qskColor< QskBoxBorderColors >(
return effectiveHint( asp, status ).value< QskBoxBorderColors >(); this, aspect | QskAspect::Border, status );
} }
void QskSkinnable::setIntervalHint( void QskSkinnable::setIntervalHint(
QskAspect::Aspect aspect, const QskIntervalF& interval ) QskAspect::Aspect aspect, const QskIntervalF& interval )
{ {
m_data->hintTable.setInterval( aspect, interval ); qskSetMetric( this, aspect, interval );
} }
QskIntervalF QskSkinnable::intervalHint( QskIntervalF QskSkinnable::intervalHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
const auto hint = effectiveHint( aspect | QskAspect::Metric, status ); return qskMetric< QskIntervalF >( this, aspect, status );
return hint.value< QskIntervalF >();
} }
void QskSkinnable::setSpacingHint( QskAspect::Aspect aspect, qreal spacing ) void QskSkinnable::setSpacingHint( QskAspect::Aspect aspect, qreal spacing )
{ {
m_data->hintTable.setSpacing( aspect, spacing ); qskSetMetric( this, aspect | QskAspect::Spacing, spacing );
} }
bool QskSkinnable::resetSpacingHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetSpacingHint( QskAspect::Aspect aspect )
@ -410,18 +455,18 @@ bool QskSkinnable::resetSpacingHint( QskAspect::Aspect aspect )
qreal QskSkinnable::spacingHint( qreal QskSkinnable::spacingHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return metric( aspect | QskAspect::Spacing, status ); return qskMetric< qreal >( this, aspect | QskAspect::Spacing, status );
} }
void QskSkinnable::setFontRole( QskAspect::Aspect aspect, int role ) void QskSkinnable::setFontRole( QskAspect::Aspect aspect, int role )
{ {
m_data->hintTable.setFontRole( aspect, role ); qskSetFlag( this, aspect | QskAspect::FontRole, role );
} }
int QskSkinnable::fontRole( int QskSkinnable::fontRole(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return effectiveHint( aspect | QskAspect::FontRole, status ).toInt(); return qskFlag( this, aspect | QskAspect::FontRole, status );
} }
QFont QskSkinnable::effectiveFont( QskAspect::Aspect aspect ) const QFont QskSkinnable::effectiveFont( QskAspect::Aspect aspect ) const
@ -431,13 +476,13 @@ QFont QskSkinnable::effectiveFont( QskAspect::Aspect aspect ) const
void QskSkinnable::setGraphicRole( QskAspect::Aspect aspect, int role ) void QskSkinnable::setGraphicRole( QskAspect::Aspect aspect, int role )
{ {
m_data->hintTable.setGraphicRole( aspect, role ); qskSetFlag( this, aspect | QskAspect::GraphicRole, role );
} }
int QskSkinnable::graphicRole( int QskSkinnable::graphicRole(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
return effectiveHint( aspect | QskAspect::GraphicRole, status ).toInt(); return qskFlag( this, aspect | QskAspect::GraphicRole, status );
} }
QskColorFilter QskSkinnable::effectiveGraphicFilter( QskColorFilter QskSkinnable::effectiveGraphicFilter(
@ -460,7 +505,7 @@ QskColorFilter QskSkinnable::effectiveGraphicFilter(
if ( !aspect.isAnimator() ) if ( !aspect.isAnimator() )
{ {
QVariant v = animatedValue( aspect, nullptr ); auto v = animatedValue( aspect, nullptr );
if ( v.canConvert< QskColorFilter >() ) if ( v.canConvert< QskColorFilter >() )
return v.value< QskColorFilter >(); return v.value< QskColorFilter >();
@ -485,13 +530,13 @@ QskColorFilter QskSkinnable::effectiveGraphicFilter(
return effectiveSkin()->graphicFilter( hint.toInt() ); return effectiveSkin()->graphicFilter( hint.toInt() );
} }
void QskSkinnable::setAnimation( void QskSkinnable::setAnimationHint(
QskAspect::Aspect aspect, QskAnimationHint animation ) QskAspect::Aspect aspect, QskAnimationHint animation )
{ {
m_data->hintTable.setAnimation( aspect, animation ); m_data->hintTable.setAnimation( aspect, animation );
} }
QskAnimationHint QskSkinnable::animation( QskAnimationHint QskSkinnable::animationHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
aspect.setAnimator( true ); aspect.setAnimator( true );
@ -502,7 +547,7 @@ QskAnimationHint QskSkinnable::effectiveAnimation(
QskAspect::Type type, QskAspect::Subcontrol subControl, QskAspect::Type type, QskAspect::Subcontrol subControl,
QskAspect::State state, QskSkinHintStatus* status ) const QskAspect::State state, QskSkinHintStatus* status ) const
{ {
QskAspect::Aspect aspect = subControl | type | state; auto aspect = subControl | type | state;
aspect.setAnimator( true ); aspect.setAnimator( true );
QskAnimationHint hint; QskAnimationHint hint;
@ -543,8 +588,16 @@ QskAnimationHint QskSkinnable::effectiveAnimation(
return hint; return hint;
} }
void QskSkinnable::setSkinHint( QskAspect::Aspect aspect, const QVariant& skinHint )
{
aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) );
m_data->hintTable.setHint( aspect, skinHint );
}
bool QskSkinnable::resetHint( QskAspect::Aspect aspect ) bool QskSkinnable::resetHint( QskAspect::Aspect aspect )
{ {
aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) );
if ( !m_data->hintTable.hasHint( aspect ) ) if ( !m_data->hintTable.hasHint( aspect ) )
return false; return false;
@ -557,7 +610,6 @@ bool QskSkinnable::resetHint( QskAspect::Aspect aspect )
*/ */
auto a = aspect; auto a = aspect;
a.setSubControl( effectiveSubcontrol( a.subControl() ) );
a.setPlacement( effectivePlacement() ); a.setPlacement( effectivePlacement() );
if ( a.state() == QskAspect::NoState ) if ( a.state() == QskAspect::NoState )
@ -573,9 +625,7 @@ bool QskSkinnable::resetHint( QskAspect::Aspect aspect )
QVariant QskSkinnable::effectiveHint( QVariant QskSkinnable::effectiveHint(
QskAspect::Aspect aspect, QskSkinHintStatus* status ) const QskAspect::Aspect aspect, QskSkinHintStatus* status ) const
{ {
if ( const auto subControl = aspect.subControl() ) aspect.setSubControl( effectiveSubcontrol( aspect.subControl() ) );
aspect.setSubControl( effectiveSubcontrol( subControl ) );
aspect.setPlacement( effectivePlacement() ); aspect.setPlacement( effectivePlacement() );
if ( aspect.isAnimator() ) if ( aspect.isAnimator() )

View File

@ -143,9 +143,10 @@ class QSK_EXPORT QskSkinnable
QskColorFilter effectiveGraphicFilter( QskAspect::Aspect ) const; QskColorFilter effectiveGraphicFilter( QskAspect::Aspect ) const;
void setAnimation( QskAspect::Aspect, QskAnimationHint ); void setAnimationHint( QskAspect::Aspect, QskAnimationHint );
QskAnimationHint animation( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const; QskAnimationHint animationHint( QskAspect::Aspect, QskSkinHintStatus* = nullptr ) const;
void setSkinHint( QskAspect::Aspect, const QVariant& );
bool resetHint( QskAspect::Aspect ); bool resetHint( QskAspect::Aspect );
QskAnimationHint effectiveAnimation( QskAspect::Type, QskAspect::Subcontrol, QskAnimationHint effectiveAnimation( QskAspect::Type, QskAspect::Subcontrol,

View File

@ -19,12 +19,6 @@ QSK_SYSTEM_STATE( QskSlider, Pressed, QskAspect::FirstSystemState << 2 )
QSK_SYSTEM_STATE( QskSlider, Minimum, QskAspect::FirstSystemState << 3 ) QSK_SYSTEM_STATE( QskSlider, Minimum, QskAspect::FirstSystemState << 3 )
QSK_SYSTEM_STATE( QskSlider, Maximum, QskAspect::FirstSystemState << 4 ) QSK_SYSTEM_STATE( QskSlider, Maximum, QskAspect::FirstSystemState << 4 )
static inline QskAspect::Aspect qskAspectPosition( const QskSlider* slider )
{
const auto subControl = slider->effectiveSubcontrol( QskSlider::Handle );
return subControl | QskAspect::Position | QskAspect::Metric;
}
class QskSlider::PrivateData class QskSlider::PrivateData
{ {
public: public:
@ -113,7 +107,7 @@ bool QskSlider::isTracking() const
void QskSlider::aboutToShow() void QskSlider::aboutToShow()
{ {
setMetric( qskAspectPosition( this ), valueAsRatio() ); setMetric( Handle | QskAspect::Position, valueAsRatio() );
Inherited::aboutToShow(); Inherited::aboutToShow();
} }
@ -238,13 +232,13 @@ void QskSlider::mouseReleaseEvent( QMouseEvent* event )
qreal QskSlider::handlePosition() const qreal QskSlider::handlePosition() const
{ {
return metric( qskAspectPosition( this ) ); return metric( Handle | QskAspect::Position );
} }
void QskSlider::moveHandle() void QskSlider::moveHandle()
{ {
const auto hint = animation( qskAspectPosition( this ) | skinState() ); const auto aspect = Handle | QskAspect::Metric | QskAspect::Position;
moveHandleTo( value(), hint ); moveHandleTo( value(), animationHint( aspect | skinState() ) );
} }
void QskSlider::moveHandleTo( qreal value, const QskAnimationHint& hint ) void QskSlider::moveHandleTo( qreal value, const QskAnimationHint& hint )
@ -252,7 +246,8 @@ void QskSlider::moveHandleTo( qreal value, const QskAnimationHint& hint )
setSkinStateFlag( QskSlider::Minimum, value <= minimum() ); setSkinStateFlag( QskSlider::Minimum, value <= minimum() );
setSkinStateFlag( QskSlider::Maximum, value >= maximum() ); setSkinStateFlag( QskSlider::Maximum, value >= maximum() );
const auto aspect = qskAspectPosition( this ); auto aspect = Handle | QskAspect::Metric | QskAspect::Position;
const qreal pos = valueAsRatio( value ); const qreal pos = valueAsRatio( value );
if ( hint.duration > 0 ) if ( hint.duration > 0 )
@ -260,6 +255,10 @@ void QskSlider::moveHandleTo( qreal value, const QskAnimationHint& hint )
const qreal oldPos = metric( aspect ); const qreal oldPos = metric( aspect );
setMetric( aspect, pos ); setMetric( aspect, pos );
#if 1
// startTransition should do this: TODO ...
aspect.setSubControl( effectiveSubcontrol( Handle ) );
#endif
startTransition( aspect, hint, oldPos, pos ); startTransition( aspect, hint, oldPos, pos );
} }
else else

View File

@ -62,8 +62,7 @@ void QskSubWindow::setDecorated( bool on )
if ( on == isDecorated() ) if ( on == isDecorated() )
return; return;
const auto subControl = effectiveSubcontrol( QskSubWindow::Panel ); setFlagHint( Panel | QskAspect::Decoration, on );
setFlagHint( subControl | QskAspect::Decoration, on );
resetImplicitSize(); // in case some parent wants to layout resetImplicitSize(); // in case some parent wants to layout

View File

@ -45,7 +45,7 @@ QskTabView::QskTabView( Qsk::Position tabPosition, QQuickItem* parent )
m_data->stackBox->setObjectName( QStringLiteral( "QskTabViewStackBox" ) ); m_data->stackBox->setObjectName( QStringLiteral( "QskTabViewStackBox" ) );
#if 1 #if 1
const auto hint = animation( Page ); const auto hint = animationHint( Page );
if ( hint.duration > 0 ) if ( hint.duration > 0 )
{ {
// When changing the skin, we have to update the animator. TODO ... // When changing the skin, we have to update the animator. TODO ...

View File

@ -526,16 +526,14 @@ int QskTextInput::fontRole() const
void QskTextInput::setFontRole( int role ) void QskTextInput::setFontRole( int role )
{ {
const int oldRole = fontRole(); if ( role != fontRole() )
QskSkinnable::setFontRole( effectiveSubcontrol( Text ), role );
if ( oldRole != role )
{ {
QskSkinnable::setFontRole( Text, role );
polish(); polish();
resetImplicitSize(); resetImplicitSize();
Qt::InputMethodQueries queries = Qt::ImCursorRectangle | Qt::ImFont; auto queries = Qt::ImCursorRectangle | Qt::ImFont;
#if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 ) #if QT_VERSION >= QT_VERSION_CHECK( 5, 7, 0 )
queries |= Qt::ImAnchorRectangle; queries |= Qt::ImAnchorRectangle;
#endif #endif
@ -549,9 +547,7 @@ void QskTextInput::setAlignment( Qt::Alignment alignment )
{ {
if ( alignment != this->alignment() ) if ( alignment != this->alignment() )
{ {
const auto subControl = effectiveSubcontrol( Text ); setAlignmentHint( Text, alignment );
setAlignmentHint( subControl, alignment );
m_data->textInput->setAlignment( alignment ); m_data->textInput->setAlignment( alignment );
polish(); polish();

View File

@ -171,7 +171,7 @@ void QskTextLabel::setFontRole( int role )
{ {
const int oldRole = fontRole(); const int oldRole = fontRole();
QskSkinnable::setFontRole( effectiveSubcontrol( Text ), role ); QskSkinnable::setFontRole( Text, role );
if ( oldRole != role ) if ( oldRole != role )
{ {
@ -189,13 +189,13 @@ int QskTextLabel::fontRole() const
void QskTextLabel::setTextColor( const QColor& color ) void QskTextLabel::setTextColor( const QColor& color )
{ {
const QColor oldColor = textColor(); if ( color != textColor() )
QskSkinnable::setColor( effectiveSubcontrol( Text ), color );
if ( oldColor != color )
{ {
update(); QskSkinnable::setColor( Text, color );
if ( !m_data->text.isEmpty() )
update();
Q_EMIT textColorChanged( color ); Q_EMIT textColorChanged( color );
} }
} }
@ -212,16 +212,15 @@ Qt::Alignment QskTextLabel::alignment() const
void QskTextLabel::setAlignment( Qt::Alignment alignment ) void QskTextLabel::setAlignment( Qt::Alignment alignment )
{ {
if ( alignment == this->alignment() ) if ( alignment != this->alignment() )
return; {
setAlignmentHint( Text, alignment );
const auto subControl = effectiveSubcontrol( Text ); if ( !m_data->text.isEmpty() )
setAlignmentHint( subControl, alignment ); update();
if ( m_data->text.isEmpty() ) Q_EMIT alignmentChanged();
update(); }
Q_EMIT alignmentChanged();
} }
QFont QskTextLabel::font() const QFont QskTextLabel::font() const