fix return type + add animation

This commit is contained in:
Rick Vogel 2023-11-05 20:31:57 +01:00
parent 6ed9d1f50f
commit 5223a6efe7
5 changed files with 90 additions and 18 deletions

View File

@ -25,6 +25,7 @@
#include <QskTickmarksNode.h>
#include <QskScaleTickmarks.h>
#include <QskTextLabel.h>
#include <QskAnimator.h>
#include <QGuiApplication>
@ -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:

View File

@ -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 );
}

View File

@ -1 +1,16 @@
#include "QskTickmarksMetrics.h"
#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!");

View File

@ -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;
}
}

View File

@ -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 )
{