axisanimationitem.cpp
107 lines
| 2.8 KiB
| text/x-c
|
CppLexer
Michal Klocek
|
r291 | #include "axisanimationitem_p.h" | ||
Michal Klocek
|
r393 | #include <QTimer> | ||
Michal Klocek
|
r291 | |||
Q_DECLARE_METATYPE(QVector<qreal>) | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
const static int duration = 500; | ||||
Michal Klocek
|
r439 | AxisAnimationItem::AxisAnimationItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) : | ||
AxisItem(axis,type,parent), | ||||
Michal Klocek
|
r393 | m_animation(new AxisAnimator(this,this)) | ||
Michal Klocek
|
r291 | { | ||
} | ||||
AxisAnimationItem::~AxisAnimationItem() | ||||
{ | ||||
} | ||||
Michal Klocek
|
r502 | void AxisAnimationItem::updateLayout(QVector<qreal>& newLayout) | ||
Michal Klocek
|
r291 | { | ||
Michal Klocek
|
r504 | |||
Michal Klocek
|
r452 | QVector<qreal> oldLayout = layout(); | ||
Michal Klocek
|
r393 | if(newLayout.count()==0) return; | ||
Michal Klocek
|
r504 | |||
Michal Klocek
|
r513 | if(zoomFactor()<0) { | ||
Michal Klocek
|
r504 | |||
Michal Klocek
|
r513 | QRectF rect = geometry(); | ||
oldLayout.resize(newLayout.count()); | ||||
Michal Klocek
|
r393 | |||
Michal Klocek
|
r513 | for(int i=0,j=oldLayout.count()-1;i<(oldLayout.count()+1)/2;i++,j--) | ||
{ | ||||
oldLayout[i]= axisType()==X_AXIS?rect.left():rect.bottom(); | ||||
oldLayout[j]= axisType()==X_AXIS?rect.right():rect.top(); | ||||
} | ||||
} | ||||
else { | ||||
int index = qMin(oldLayout.count()*zoomFactor(),newLayout.count()-1.0); | ||||
oldLayout.resize(newLayout.count()); | ||||
for(int i=0;i<oldLayout.count();i++) | ||||
{ | ||||
oldLayout[i]= oldLayout[index]; //axisType()==X_AXIS?rect.center.x():rect.center().y(); | ||||
} | ||||
Michal Klocek
|
r504 | } | ||
Michal Klocek
|
r513 | if(m_animation->state()!=QAbstractAnimation::Stopped) { | ||
m_animation->stop(); | ||||
Michal Klocek
|
r393 | } | ||
m_animation->setDuration(duration); | ||||
Michal Klocek
|
r504 | m_animation->setEasingCurve(QEasingCurve::OutQuart); | ||
Michal Klocek
|
r513 | QVariantAnimation::KeyValues value; | ||
m_animation->setKeyValues(value); //workaround for wrong interpolation call | ||||
Michal Klocek
|
r393 | m_animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout)); | ||
m_animation->setKeyValueAt(1.0, qVariantFromValue(newLayout)); | ||||
Michal Klocek
|
r513 | |||
Michal Klocek
|
r393 | QTimer::singleShot(0,m_animation,SLOT(start())); | ||
Michal Klocek
|
r291 | } | ||
void AxisAnimationItem::setLabelsAngle(int angle) | ||||
{ | ||||
AxisItem::setLabelsAngle(angle); | ||||
} | ||||
Michal Klocek
|
r303 | AxisAnimator::AxisAnimator(AxisItem *axis,QObject *parent): QVariantAnimation(parent), | ||
m_axis(axis) | ||||
Michal Klocek
|
r291 | { | ||
} | ||||
AxisAnimator::~AxisAnimator() | ||||
{ | ||||
} | ||||
QVariant AxisAnimator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const | ||||
{ | ||||
QVector<qreal> startVector = qVariantValue<QVector<qreal> >(start); | ||||
QVector<qreal> endVecotr = qVariantValue<QVector<qreal> >(end); | ||||
QVector<qreal> result; | ||||
Michal Klocek
|
r513 | |||
Michal Klocek
|
r291 | Q_ASSERT(startVector.count() == endVecotr.count()); | ||
for(int i =0 ;i< startVector.count();i++){ | ||||
qreal value = startVector[i] + ((endVecotr[i]- startVector[i]) * progress);//qBound(0.0, progress, 1.0)); | ||||
result << value; | ||||
} | ||||
return qVariantFromValue(result); | ||||
} | ||||
void AxisAnimator::updateCurrentValue (const QVariant & value ) | ||||
{ | ||||
Michal Klocek
|
r513 | //Q_ASSERT(state()!=QAbstractAnimation::Stopped); | ||
if(state()!=QAbstractAnimation::Stopped)//workaround | ||||
{ | ||||
QVector<qreal> vector = qVariantValue<QVector<qreal> >(value); | ||||
m_axis->setLayout(vector); | ||||
} | ||||
Michal Klocek
|
r291 | } | ||
#include "moc_axisanimationitem_p.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||