#include "chartanimator_p.h" #include "axisanimation_p.h" #include "xyanimation_p.h" #include "xychartitem_p.h" #include "areachartitem_p.h" #include Q_DECLARE_METATYPE(QVector) Q_DECLARE_METATYPE(QVector) QTCOMMERCIALCHART_BEGIN_NAMESPACE const static int duration = 1000; ChartAnimator::ChartAnimator(QObject *parent):QObject(parent) { } ChartAnimator::~ChartAnimator() { } void ChartAnimator::addAnimation(AxisItem* item) { ChartAnimation* animation = m_animations.value(item); if(!animation) { animation = new AxisAnimation(item); m_animations.insert(item,animation); } item->setAnimator(this); } void ChartAnimator::addAnimation(XYChartItem* item) { ChartAnimation* animation = m_animations.value(item); if(!animation) { animation = new XYAnimation(item); m_animations.insert(item,animation); } item->setAnimator(this); } void ChartAnimator::removeAnimation(ChartItem* item) { item->setAnimator(0); m_animations.remove(item); } void ChartAnimator::applyLayout(AxisItem* item , QVector& newLayout) { AxisAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); QVector oldLayout = item->layout(); if(newLayout.count()==0) return; switch(m_state) { case ZoomOutState: { QRectF rect = item->geometry(); oldLayout.resize(newLayout.count()); for(int i=0,j=oldLayout.count()-1;i<(oldLayout.count()+1)/2;i++,j--) { oldLayout[i]= item->axisType()==AxisItem::X_AXIS?rect.left():rect.bottom(); oldLayout[j]= item->axisType()==AxisItem::X_AXIS?rect.right():rect.top(); } } break; case ZoomInState: { int index = qMin(oldLayout.count()*(item->axisType()==AxisItem::X_AXIS?m_point.x():(1 -m_point.y())),newLayout.count()-1.0); oldLayout.resize(newLayout.count()); for(int i=0;i0;i--,j--) { oldLayout[i]= oldLayout[j]; } } break; default: { oldLayout.resize(newLayout.count()); QRectF rect = item->geometry(); for(int i=0, j=oldLayout.count()-1;iaxisType()==AxisItem::X_AXIS?rect.left():rect.top(); } } break; } if(animation->state()!=QAbstractAnimation::Stopped) { animation->stop(); } animation->setDuration(duration); animation->setEasingCurve(QEasingCurve::OutQuart); QVariantAnimation::KeyValues value; animation->setKeyValues(value); //workaround for wrong interpolation call animation->setKeyValueAt(0.0, qVariantFromValue(oldLayout)); animation->setKeyValueAt(1.0, qVariantFromValue(newLayout)); QTimer::singleShot(0,animation,SLOT(start())); } void ChartAnimator::applyLayout(XYChartItem* item, QVector& newPoints) { XYAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); QVector oldPoints = item->points(); if(newPoints.count()==0) return; bool empty = oldPoints.count()==0; oldPoints.resize(newPoints.size()); if(animation->state()!=QAbstractAnimation::Stopped) { animation->stop(); } animation->setDuration(duration); if(!empty) animation->setAnimationType(XYAnimation::MoveDownAnimation); else animation->setAnimationType(XYAnimation::LineDrawAnimation); animation->setEasingCurve(QEasingCurve::OutQuart); animation->setValues(oldPoints,newPoints); QTimer::singleShot(0,animation,SLOT(start())); } void ChartAnimator::updateLayout(XYChartItem* item, QVector& newPoints) { XYAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); animation->setDuration(duration); animation->setAnimationType(XYAnimation::MoveDownAnimation); animation->setEasingCurve(QEasingCurve::OutQuart); animation->updateValues(newPoints); QTimer::singleShot(0,animation,SLOT(start())); } void ChartAnimator::setState(State state,const QPointF& point) { m_state=state; m_point=point; } QTCOMMERCIALCHART_END_NAMESPACE