#ifndef XYCHARTANIMATIONITEM_P_H_ #define XYCHARTANIMATIONITEM_P_H_ #include "qchartglobal.h" #include "xychartanimator_p.h" #include #include #include Q_DECLARE_METATYPE(QVector) QTCOMMERCIALCHART_BEGIN_NAMESPACE const static int duration = 1000; template class XYChartAnimationItem : public T { public: XYChartAnimationItem(U *series, QGraphicsItem *parent = 0); virtual ~XYChartAnimationItem(); void animationStarted(); protected: virtual void updatePoints(QVector& newPoints); virtual void updatePoint(QVector& newPoints); private: XYChartAnimator *m_animation; QVector m_points; bool m_dirty; }; template XYChartAnimationItem::XYChartAnimationItem(U *series,QGraphicsItem *parent): T(series,parent), m_animation(new XYChartAnimator(this,this)), m_dirty(false) { } template XYChartAnimationItem::~XYChartAnimationItem() { } template void XYChartAnimationItem::updatePoints(QVector& newPoints) { QVector oldPoints = T::points(); if(newPoints.count()==0) return; bool empty = oldPoints.count()==0; oldPoints.resize(newPoints.size()); if(m_animation->state()!=QAbstractAnimation::Stopped){ m_animation->stop(); } m_animation->setDuration(duration); if(!empty) m_animation->setAnimationType(XYChartAnimator::MoveDownAnimation); else m_animation->setAnimationType(XYChartAnimator::LineDrawAnimation); m_animation->setEasingCurve(QEasingCurve::OutQuart); 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; } template void XYChartAnimationItem::updatePoint(QVector& newPoints) { if(m_animation->state()!=QAbstractAnimation::Stopped) { m_animation->stop(); m_dirty=true; } if(m_dirty) { m_points=newPoints; m_dirty=false; } m_animation->setDuration(duration); m_animation->setAnimationType(XYChartAnimator::MoveDownAnimation); m_animation->setEasingCurve(QEasingCurve::OutQuart); m_animation->setKeyValueAt(0.0, qVariantFromValue(m_points)); m_animation->setKeyValueAt(1.0, qVariantFromValue(newPoints)); QTimer::singleShot(0,m_animation,SLOT(start())); } template void XYChartAnimationItem::animationStarted() { m_dirty=true; } QTCOMMERCIALCHART_END_NAMESPACE #endif