linechartanimationitem.cpp
111 lines
| 3.0 KiB
| text/x-c
|
CppLexer
Michal Klocek
|
r131 | #include "linechartanimationitem_p.h" | ||
Michal Klocek
|
r145 | #include "linechartitem_p.h" | ||
Michal Klocek
|
r131 | #include <QPropertyAnimation> | ||
Michal Klocek
|
r391 | #include <QTimer> | ||
Q_DECLARE_METATYPE(QVector<QPointF>) | ||||
Michal Klocek
|
r131 | |||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
const static int duration = 500; | ||||
Michal Klocek
|
r439 | LineChartAnimationItem::LineChartAnimationItem(QLineSeries* series,QGraphicsItem *parent): | ||
LineChartItem(series,parent), | ||||
Michal Klocek
|
r391 | m_animation(new LineChartAnimatator(this,this)), | ||
m_dirty(false) | ||||
Michal Klocek
|
r131 | { | ||
} | ||||
LineChartAnimationItem::~LineChartAnimationItem() | ||||
{ | ||||
} | ||||
Michal Klocek
|
r465 | void LineChartAnimationItem::updatePoints(QVector<QPointF>& newPoints) | ||
Michal Klocek
|
r131 | { | ||
Michal Klocek
|
r464 | QVector<QPointF> oldPoints = points(); | ||
Michal Klocek
|
r465 | LineChartItem::updatePoints(newPoints); | ||
Michal Klocek
|
r464 | |||
Michal Klocek
|
r391 | if(newPoints.count()==0) return; | ||
oldPoints.resize(newPoints.size()); | ||||
Michal Klocek
|
r131 | |||
Michal Klocek
|
r391 | if(m_animation->state()!=QAbstractAnimation::Stopped){ | ||
m_animation->stop(); | ||||
} | ||||
m_animation->setDuration(duration); | ||||
m_animation->setEasingCurve(QEasingCurve::InOutBack); | ||||
m_animation->setKeyValueAt(0.0, qVariantFromValue(oldPoints)); | ||||
m_animation->setKeyValueAt(1.0, qVariantFromValue(newPoints)); | ||||
QTimer::singleShot(0,m_animation,SLOT(start())); | ||||
m_points = newPoints; | ||||
m_dirty=false; | ||||
Michal Klocek
|
r464 | |||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r464 | void LineChartAnimationItem::updatePoint(int index,QPointF& newPoint) | ||
Michal Klocek
|
r131 | { | ||
Michal Klocek
|
r464 | |||
Michal Klocek
|
r391 | if(m_animation->state()!=QAbstractAnimation::Stopped){ | ||
m_animation->stop(); | ||||
m_dirty=true; | ||||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r391 | |||
if(m_dirty){ | ||||
Michal Klocek
|
r464 | m_points=points(); | ||
Michal Klocek
|
r391 | m_dirty=false; | ||
} | ||||
Michal Klocek
|
r464 | LineChartItem::updatePoint(index,newPoint); | ||
Michal Klocek
|
r391 | |||
m_animation->setDuration(duration); | ||||
m_animation->setEasingCurve(QEasingCurve::InOutBack); | ||||
m_animation->setKeyValueAt(0.0, qVariantFromValue(m_points)); | ||||
Michal Klocek
|
r464 | m_animation->setKeyValueAt(1.0, qVariantFromValue( points())); | ||
Michal Klocek
|
r391 | QTimer::singleShot(0,this,SLOT(startAnimation())); | ||
Michal Klocek
|
r464 | |||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r391 | void LineChartAnimationItem::startAnimation() | ||
Michal Klocek
|
r131 | { | ||
Michal Klocek
|
r391 | m_dirty=true; | ||
m_animation->start(); | ||||
Michal Klocek
|
r131 | } | ||
Michal Klocek
|
r391 | LineChartAnimatator::LineChartAnimatator(LineChartAnimationItem *item , QObject *parent):QVariantAnimation(parent), | ||
m_item(item) | ||||
Michal Klocek
|
r389 | { | ||
Michal Klocek
|
r391 | } | ||
Michal Klocek
|
r389 | |||
LineChartAnimatator::~LineChartAnimatator() | ||||
{ | ||||
} | ||||
QVariant LineChartAnimatator::interpolated(const QVariant &start, const QVariant & end, qreal progress ) const | ||||
{ | ||||
Michal Klocek
|
r391 | QVector<QPointF> startVector = qVariantValue<QVector<QPointF> >(start); | ||
QVector<QPointF> endVecotr = qVariantValue<QVector<QPointF> >(end); | ||||
QVector<QPointF> result; | ||||
Michal Klocek
|
r389 | Q_ASSERT(startVector.count() == endVecotr.count()); | ||
for(int i =0 ;i< startVector.count();i++){ | ||||
Michal Klocek
|
r391 | qreal x = startVector[i].x() + ((endVecotr[i].x()- startVector[i].x()) * progress);//qBound(0.0, progress, 1.0)); | ||
qreal y = startVector[i].y() + ((endVecotr[i].y()- startVector[i].y()) * progress);//qBound(0.0, progress, 1.0)); | ||||
result << QPointF(x,y); | ||||
Michal Klocek
|
r389 | } | ||
return qVariantFromValue(result); | ||||
} | ||||
void LineChartAnimatator::updateCurrentValue (const QVariant & value ) | ||||
{ | ||||
Michal Klocek
|
r391 | QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value); | ||
Michal Klocek
|
r464 | if(state()!=QAbstractAnimation::Stopped){ //workaround | ||
m_item->setGeometry(vector); | ||||
} | ||||
Michal Klocek
|
r389 | } | ||
Michal Klocek
|
r131 | #include "moc_linechartanimationitem_p.cpp" | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||