fix return type + add animation
This commit is contained in:
parent
6ed9d1f50f
commit
5223a6efe7
|
@ -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:
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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!");
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue