diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index e2a64d36..72d25570 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -147,13 +148,64 @@ class Window : public QskWindow { (void) new QskTextLabel("Custom", layout); auto* const tickmarks = new Tickmarks(layout); - tickmarks->metrics[QskScaleTickmarks::MajorTick] = 1.0; - tickmarks->metrics[QskScaleTickmarks::MediumTick] = 0.5; - tickmarks->metrics[QskScaleTickmarks::MinorTick] = 0.2; + tickmarks->metrics.setMajorRatio( 1.0 ); + tickmarks->metrics.setMediumRatio( 0.5 ); + tickmarks->metrics.setMinorRatio( 0.2 ); auto* const skinlet = new TickmarksSkinlet; tickmarks->setSkinlet(skinlet); skinlet->setOwnedBySkinnable(true); } + { + (void) new QskTextLabel("Custom (Major only)", layout); + auto* const tickmarks = new Tickmarks(layout); + tickmarks->metrics.setMajorRatio( 1.0 ); + tickmarks->metrics.setMediumRatio( 0.0 ); + tickmarks->metrics.setMinorRatio( 0.0 ); + auto* const skinlet = new TickmarksSkinlet; + tickmarks->setSkinlet(skinlet); + skinlet->setOwnedBySkinnable(true); + } + { + (void) new QskTextLabel("Custom (Major + Minor only)", layout); + auto* const tickmarks = new Tickmarks(layout); + tickmarks->metrics.setMajorRatio( 1.0 ); + tickmarks->metrics.setMediumRatio( 0.0 ); + tickmarks->metrics.setMinorRatio( 0.2 ); + auto* const skinlet = new TickmarksSkinlet; + tickmarks->setSkinlet(skinlet); + skinlet->setOwnedBySkinnable(true); + } + { + (void) new QskTextLabel("Custom (Animated)", layout); + auto* const tickmarks = new Tickmarks(layout); + auto* const skinlet = new TickmarksSkinlet; + tickmarks->setSkinlet(skinlet); + skinlet->setOwnedBySkinnable(true); + + class Animator final : public QskAnimator + { + public: + explicit Animator(Tickmarks& tickmarks) : tickmarks(tickmarks) + { + setAutoRepeat(true); + setDuration(2000); + } + + void advance( qreal value ) override + { + tickmarks.metrics.setMinorRatio( 0.1 + 0.1 * qFastSin(value * 2 * M_PI)); + tickmarks.metrics.setMediumRatio( 0.25 + 0.25 * qFastSin(value * 2 * M_PI)); + tickmarks.metrics.setMajorRatio( 0.5 + 0.5 * qFastSin(value * 2 * M_PI)); + tickmarks.update(); + } + + Tickmarks& tickmarks; + }; + + auto* const animator = new Animator(*tickmarks); + animator->setWindow(this); + animator->start(); + } } private: diff --git a/src/common/QskFunctions.h b/src/common/QskFunctions.h index fd7c002d..7cab17d2 100644 --- a/src/common/QskFunctions.h +++ b/src/common/QskFunctions.h @@ -69,7 +69,7 @@ inline constexpr bool qskFuzzyCompare( qreal value1, qreal value2 ) return qFuzzyCompare( value1, value2 ); } -inline constexpr bool qskConstrainedRatio( qreal ratio ) +inline constexpr qreal qskConstrainedRatio( qreal ratio ) { return qBound( 0.0, ratio, 1.0 ); } diff --git a/src/nodes/QskTickmarksMetrics.cpp b/src/nodes/QskTickmarksMetrics.cpp index 5e0c3b9a..c82da464 100644 --- a/src/nodes/QskTickmarksMetrics.cpp +++ b/src/nodes/QskTickmarksMetrics.cpp @@ -1 +1,16 @@ -#include "QskTickmarksMetrics.h" \ No newline at end of file +#include "QskTickmarksMetrics.h" + +constexpr bool test_ctor0() +{ + return QskTickmarksMetrics{} == QskTickmarksMetrics{0,0,0}; +} + +static_assert(test_ctor0(), "test failed!"); + +constexpr bool test_ctor1() +{ + QskTickmarksMetrics m; + return QskTickmarksMetrics{1,1,1} == QskTickmarksMetrics{2,2,2}; +} + +static_assert(test_ctor1(), "test failed!"); \ No newline at end of file diff --git a/src/nodes/QskTickmarksMetrics.h b/src/nodes/QskTickmarksMetrics.h index 6e1bcb2d..42448ee3 100644 --- a/src/nodes/QskTickmarksMetrics.h +++ b/src/nodes/QskTickmarksMetrics.h @@ -37,8 +37,8 @@ class QSK_EXPORT QskTickmarksMetrics constexpr void setMediumRatio( qreal ratio ) noexcept; constexpr void setMinorRatio( qreal ratio ) noexcept; - Q_REQUIRED_RESULT constexpr qreal operator[]( int index ) const noexcept; - Q_REQUIRED_RESULT constexpr qreal& operator[]( int index ) noexcept; + Q_REQUIRED_RESULT constexpr qreal ratio( int index ) const noexcept; + constexpr void setRatio(int index, qreal ratio) noexcept; private: qreal m_minorRatio = 0.0; @@ -98,7 +98,7 @@ inline constexpr bool QskTickmarksMetrics::operator!=( return !( *this == rhs ); } -inline constexpr qreal QskTickmarksMetrics::operator[]( int index ) const noexcept +inline constexpr qreal QskTickmarksMetrics::ratio( int index ) const noexcept { index = index % 3; @@ -113,18 +113,21 @@ inline constexpr qreal QskTickmarksMetrics::operator[]( int index ) const noexce } } -inline constexpr qreal& QskTickmarksMetrics::operator[]( int index ) noexcept +inline constexpr void QskTickmarksMetrics::setRatio( int index, qreal ratio ) noexcept { index = index % 3; switch ( index ) { case 0: - return m_minorRatio; + setMinorRatio( ratio ); + break; case 1: - return m_mediumRatio; + setMediumRatio( ratio ); + break; default: - return m_majorRatio; + setMajorRatio( ratio ); + break; } } diff --git a/src/nodes/QskTickmarksNode.cpp b/src/nodes/QskTickmarksNode.cpp index f3e90cd2..28208751 100644 --- a/src/nodes/QskTickmarksNode.cpp +++ b/src/nodes/QskTickmarksNode.cpp @@ -34,6 +34,7 @@ class QskTickmarksNodePrivate final : public QSGGeometryNodePrivate QRectF rect; int lineWidth = 0; + QskTickmarksMetrics metrics; QskHashValue hash = 0; }; @@ -60,9 +61,9 @@ void QskTickmarksNode::update( if ( metrics == QskTickmarksMetrics{} ) { - metrics[QskScaleTickmarks::MinorTick] = qskTickFactor( QskScaleTickmarks::MinorTick ); - metrics[QskScaleTickmarks::MediumTick] = qskTickFactor( QskScaleTickmarks::MediumTick ); - metrics[QskScaleTickmarks::MajorTick] = qskTickFactor( QskScaleTickmarks::MajorTick ); + metrics.setMinorRatio( qskTickFactor( QskScaleTickmarks::MinorTick ) ); + metrics.setMediumRatio( qskTickFactor( QskScaleTickmarks::MediumTick ) ); + metrics.setMajorRatio( qskTickFactor( QskScaleTickmarks::MajorTick ) ); } if( lineWidth != d->lineWidth ) @@ -75,10 +76,11 @@ void QskTickmarksNode::update( const auto hash = tickmarks.hash( 17435 ); - if( ( hash != d->hash ) || ( rect != d->rect ) ) + if ( ( hash != d->hash ) || ( rect != d->rect ) || ( d->metrics != metrics ) ) { d->hash = hash; d->rect = rect; + d->metrics = metrics; d->geometry.allocate( tickmarks.tickCount() * 2 ); auto vertexData = d->geometry.vertexDataAsPoint2D(); @@ -96,7 +98,7 @@ void QskTickmarksNode::update( if ( orientation == Qt::Horizontal ) { const qreal ratio = rect.width() / range; - const float len = rect.height() * metrics[tickType]; + const float len = rect.height() * d->metrics.ratio( tickType ); for( const auto tick : ticks ) { @@ -129,7 +131,7 @@ void QskTickmarksNode::update( else { const qreal ratio = rect.height() / range; - const float len = rect.width() * metrics[tickType]; + const float len = rect.width() * d->metrics.ratio( tickType ); for( const auto tick : ticks ) {