fix return type + add animation
This commit is contained in:
parent
6ed9d1f50f
commit
5223a6efe7
|
@ -25,6 +25,7 @@
|
||||||
#include <QskTickmarksNode.h>
|
#include <QskTickmarksNode.h>
|
||||||
#include <QskScaleTickmarks.h>
|
#include <QskScaleTickmarks.h>
|
||||||
#include <QskTextLabel.h>
|
#include <QskTextLabel.h>
|
||||||
|
#include <QskAnimator.h>
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
|
||||||
|
@ -147,13 +148,64 @@ class Window : public QskWindow
|
||||||
{
|
{
|
||||||
(void) new QskTextLabel("Custom", layout);
|
(void) new QskTextLabel("Custom", layout);
|
||||||
auto* const tickmarks = new Tickmarks(layout);
|
auto* const tickmarks = new Tickmarks(layout);
|
||||||
tickmarks->metrics[QskScaleTickmarks::MajorTick] = 1.0;
|
tickmarks->metrics.setMajorRatio( 1.0 );
|
||||||
tickmarks->metrics[QskScaleTickmarks::MediumTick] = 0.5;
|
tickmarks->metrics.setMediumRatio( 0.5 );
|
||||||
tickmarks->metrics[QskScaleTickmarks::MinorTick] = 0.2;
|
tickmarks->metrics.setMinorRatio( 0.2 );
|
||||||
auto* const skinlet = new TickmarksSkinlet;
|
auto* const skinlet = new TickmarksSkinlet;
|
||||||
tickmarks->setSkinlet(skinlet);
|
tickmarks->setSkinlet(skinlet);
|
||||||
skinlet->setOwnedBySkinnable(true);
|
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:
|
private:
|
||||||
|
|
|
@ -69,7 +69,7 @@ inline constexpr bool qskFuzzyCompare( qreal value1, qreal value2 )
|
||||||
return qFuzzyCompare( value1, value2 );
|
return qFuzzyCompare( value1, value2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr bool qskConstrainedRatio( qreal ratio )
|
inline constexpr qreal qskConstrainedRatio( qreal ratio )
|
||||||
{
|
{
|
||||||
return qBound( 0.0, ratio, 1.0 );
|
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 setMediumRatio( qreal ratio ) noexcept;
|
||||||
constexpr void setMinorRatio( qreal ratio ) noexcept;
|
constexpr void setMinorRatio( qreal ratio ) noexcept;
|
||||||
|
|
||||||
Q_REQUIRED_RESULT constexpr qreal operator[]( int index ) const noexcept;
|
Q_REQUIRED_RESULT constexpr qreal ratio( int index ) const noexcept;
|
||||||
Q_REQUIRED_RESULT constexpr qreal& operator[]( int index ) noexcept;
|
constexpr void setRatio(int index, qreal ratio) noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qreal m_minorRatio = 0.0;
|
qreal m_minorRatio = 0.0;
|
||||||
|
@ -98,7 +98,7 @@ inline constexpr bool QskTickmarksMetrics::operator!=(
|
||||||
return !( *this == rhs );
|
return !( *this == rhs );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline constexpr qreal QskTickmarksMetrics::operator[]( int index ) const noexcept
|
inline constexpr qreal QskTickmarksMetrics::ratio( int index ) const noexcept
|
||||||
{
|
{
|
||||||
index = index % 3;
|
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;
|
index = index % 3;
|
||||||
|
|
||||||
switch ( index )
|
switch ( index )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
return m_minorRatio;
|
setMinorRatio( ratio );
|
||||||
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
return m_mediumRatio;
|
setMediumRatio( ratio );
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return m_majorRatio;
|
setMajorRatio( ratio );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ class QskTickmarksNodePrivate final : public QSGGeometryNodePrivate
|
||||||
|
|
||||||
QRectF rect;
|
QRectF rect;
|
||||||
int lineWidth = 0;
|
int lineWidth = 0;
|
||||||
|
QskTickmarksMetrics metrics;
|
||||||
|
|
||||||
QskHashValue hash = 0;
|
QskHashValue hash = 0;
|
||||||
};
|
};
|
||||||
|
@ -60,9 +61,9 @@ void QskTickmarksNode::update(
|
||||||
|
|
||||||
if ( metrics == QskTickmarksMetrics{} )
|
if ( metrics == QskTickmarksMetrics{} )
|
||||||
{
|
{
|
||||||
metrics[QskScaleTickmarks::MinorTick] = qskTickFactor( QskScaleTickmarks::MinorTick );
|
metrics.setMinorRatio( qskTickFactor( QskScaleTickmarks::MinorTick ) );
|
||||||
metrics[QskScaleTickmarks::MediumTick] = qskTickFactor( QskScaleTickmarks::MediumTick );
|
metrics.setMediumRatio( qskTickFactor( QskScaleTickmarks::MediumTick ) );
|
||||||
metrics[QskScaleTickmarks::MajorTick] = qskTickFactor( QskScaleTickmarks::MajorTick );
|
metrics.setMajorRatio( qskTickFactor( QskScaleTickmarks::MajorTick ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( lineWidth != d->lineWidth )
|
if( lineWidth != d->lineWidth )
|
||||||
|
@ -75,10 +76,11 @@ void QskTickmarksNode::update(
|
||||||
|
|
||||||
const auto hash = tickmarks.hash( 17435 );
|
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->hash = hash;
|
||||||
d->rect = rect;
|
d->rect = rect;
|
||||||
|
d->metrics = metrics;
|
||||||
|
|
||||||
d->geometry.allocate( tickmarks.tickCount() * 2 );
|
d->geometry.allocate( tickmarks.tickCount() * 2 );
|
||||||
auto vertexData = d->geometry.vertexDataAsPoint2D();
|
auto vertexData = d->geometry.vertexDataAsPoint2D();
|
||||||
|
@ -96,7 +98,7 @@ void QskTickmarksNode::update(
|
||||||
if ( orientation == Qt::Horizontal )
|
if ( orientation == Qt::Horizontal )
|
||||||
{
|
{
|
||||||
const qreal ratio = rect.width() / range;
|
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 )
|
for( const auto tick : ticks )
|
||||||
{
|
{
|
||||||
|
@ -129,7 +131,7 @@ void QskTickmarksNode::update(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const qreal ratio = rect.height() / range;
|
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 )
|
for( const auto tick : ticks )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue