diff --git a/src/common/QskAspect.cpp b/src/common/QskAspect.cpp index c3e590f4..60a2150d 100644 --- a/src/common/QskAspect.cpp +++ b/src/common/QskAspect.cpp @@ -36,6 +36,32 @@ namespace }; } +static quint8 qskPrimitiveCount[ 3 ] = + { QskAspect::FontRole + 1, QskAspect::Border + 1, QskAspect::LinkColor + 1 }; + +quint8 QskAspect::primitiveCount( Type type ) +{ + return qskPrimitiveCount[ type ]; +} + +void QskAspect::reservePrimitives( Type type, quint8 count ) +{ + constexpr quint8 maxCount = 1 << 5; // we have 5 bits for the primitives + + Q_ASSERT( count <= maxCount ); + + if ( count > maxCount ) + { + qWarning() << "QskAspect: having more than" + << maxCount << "primitives is not supported."; + + count = maxCount; + } + + if ( count > qskPrimitiveCount[ type ] ) + qskPrimitiveCount[ type ] = count; +} + Q_GLOBAL_STATIC( AspectRegistry, qskAspectRegistry ) QskAspect::State QskAspect::registerState( @@ -201,27 +227,27 @@ static inline QDebug qskDebugEnum( return debug; } -QDebug operator<<( QDebug debug, const QskAspect::Type& type ) +QDebug operator<<( QDebug debug, QskAspect::Type type ) { return qskDebugEnum( debug, "Type", type ); } -QDebug operator<<( QDebug debug, const QskAspect::FlagPrimitive& primitive ) +QDebug operator<<( QDebug debug, QskAspect::FlagPrimitive primitive ) { return qskDebugEnum( debug, "FlagPrimitive", primitive ); } -QDebug operator<<( QDebug debug, const QskAspect::ColorPrimitive& primitive ) +QDebug operator<<( QDebug debug, QskAspect::ColorPrimitive primitive ) { return qskDebugEnum( debug, "ColorPrimitive", primitive ); } -QDebug operator<<( QDebug debug, const QskAspect::MetricPrimitive& primitive ) +QDebug operator<<( QDebug debug, QskAspect::MetricPrimitive primitive ) { return qskDebugEnum( debug, "MetricPrimitive", primitive ); } -QDebug operator<<( QDebug debug, const QskAspect::Subcontrol& subControl ) +QDebug operator<<( QDebug debug, QskAspect::Subcontrol subControl ) { QDebugStateSaver saver( debug ); @@ -233,19 +259,19 @@ QDebug operator<<( QDebug debug, const QskAspect::Subcontrol& subControl ) return debug; } -QDebug operator<<( QDebug debug, const QskAspect::Placement& placement ) +QDebug operator<<( QDebug debug, QskAspect::Placement placement ) { qskDebugEnum( debug, "Placement", placement ); return debug; } -QDebug operator<<( QDebug debug, const QskAspect::State& state ) +QDebug operator<<( QDebug debug, QskAspect::State state ) { qskDebugState( debug, nullptr, state ); return debug; } -QDebug operator<<( QDebug debug, const QskAspect::Aspect& aspect ) +QDebug operator<<( QDebug debug, QskAspect::Aspect aspect ) { qskDebugAspect( debug, nullptr, aspect ); return debug; @@ -264,8 +290,6 @@ void qskDebugState( QDebug debug, const QMetaObject* metaObject, QskAspect::Stat void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect::Aspect aspect ) { - using namespace QskAspect; - QDebugStateSaver saver( debug ); debug.resetFormat(); @@ -286,13 +310,13 @@ void qskDebugAspect( QDebug debug, const QMetaObject* metaObject, QskAspect::Asp switch ( aspect.type() ) { - case Color: + case QskAspect::Color: { if ( aspect.colorPrimitive() != 0 ) debug << ", " << qskEnumString( "ColorPrimitive", aspect.colorPrimitive() ); break; } - case Metric: + case QskAspect::Metric: { if ( aspect.metricPrimitive() != 0 ) debug << ", " << qskEnumString( "MetricPrimitive", aspect.metricPrimitive() ); diff --git a/src/common/QskAspect.h b/src/common/QskAspect.h index 524270a1..d23b6468 100644 --- a/src/common/QskAspect.h +++ b/src/common/QskAspect.h @@ -51,7 +51,7 @@ QSK_NAMESPACE( QskAspect ) }; QSK_ENUM( Type ) - enum { LastType = Color }; // max. value for all types + constexpr uint typeCount = 3; enum FlagPrimitive : quint8 { @@ -209,9 +209,9 @@ namespace QskAspect uint type : 3; uint isAnimator : 1; - uint primitive : 7; + uint primitive : 5; uint placement : 3; - uint reserved1 : 6; + uint reserved1 : 8; uint states : 16; uint reserved2 : 16; @@ -537,6 +537,10 @@ namespace QskAspect QSK_EXPORT QByteArray subControlName( Subcontrol ); QSK_EXPORT QVector< QByteArray > subControlNames( const QMetaObject* = nullptr ); QSK_EXPORT QVector< Subcontrol > subControls( const QMetaObject* ); + + QSK_EXPORT quint8 primitiveCount( Type ); + QSK_EXPORT void reservePrimitives( Type, quint8 count ); + } namespace std @@ -556,16 +560,16 @@ Q_DECLARE_TYPEINFO( QskAspect::Aspect, Q_MOVABLE_TYPE ); class QDebug; -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Aspect& ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Type& ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Subcontrol& ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Aspect ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Type ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Subcontrol ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::FlagPrimitive& ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::ColorPrimitive& ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::MetricPrimitive& ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::FlagPrimitive ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::ColorPrimitive ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::MetricPrimitive ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::Placement& ); -QSK_EXPORT QDebug operator<<( QDebug, const QskAspect::State& ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::Placement ); +QSK_EXPORT QDebug operator<<( QDebug, QskAspect::State ); QSK_EXPORT void qskDebugState( QDebug, const QMetaObject*, QskAspect::State ); QSK_EXPORT void qskDebugAspect( QDebug, const QMetaObject*, QskAspect::Aspect ); diff --git a/src/controls/QskSkinnable.cpp b/src/controls/QskSkinnable.cpp index 4b180e58..4376d848 100644 --- a/src/controls/QskSkinnable.cpp +++ b/src/controls/QskSkinnable.cpp @@ -977,7 +977,7 @@ void QskSkinnable::setSkinState( QskAspect::State newState, bool animated ) const auto& skinTable = skin->hintTable(); - for ( int i = 0; i <= QskAspect::LastType; i++ ) + for ( uint i = 0; i < QskAspect::typeCount; i++ ) { const auto type = static_cast< QskAspect::Type >( i ); @@ -989,8 +989,10 @@ void QskSkinnable::setSkinState( QskAspect::State newState, bool animated ) Starting an animator for all primitives, that differ between the states */ - for ( uint primitive = 0; - primitive <= QskAspect::LastPrimitive; primitive++ ) + + const auto primitiveCount = QskAspect::primitiveCount( type ); + + for ( uint primitive = 0; primitive < primitiveCount; primitive++ ) { aspect.setPrimitive( type, primitive );