diff --git a/src/areachart/areachartitem_p.h b/src/areachart/areachartitem_p.h index 9820dda..d329de4 100644 --- a/src/areachart/areachartitem_p.h +++ b/src/areachart/areachartitem_p.h @@ -51,8 +51,8 @@ public: ~AreaBoundItem(){}; - void applyGeometry(QVector& points){ - LineChartItem::applyGeometry(points); + void setGeometry(QVector& points){ + LineChartItem::setGeometry(points); m_item->updatePath(); } diff --git a/src/linechart/linechartanimationitem.cpp b/src/linechart/linechartanimationitem.cpp index f980422..858c428 100644 --- a/src/linechart/linechartanimationitem.cpp +++ b/src/linechart/linechartanimationitem.cpp @@ -20,8 +20,12 @@ LineChartAnimationItem::~LineChartAnimationItem() { } -void LineChartAnimationItem::updateItem(QVector& oldPoints,QVector& newPoints) +void LineChartAnimationItem::updateAllPoints() { + QVector oldPoints = points(); + LineChartItem::updateAllPoints(); + QVector newPoints = points(); + if(newPoints.count()==0) return; oldPoints.resize(newPoints.size()); @@ -35,31 +39,35 @@ void LineChartAnimationItem::updateItem(QVector& oldPoints,QVectorsetKeyValueAt(1.0, qVariantFromValue(newPoints)); QTimer::singleShot(0,m_animation,SLOT(start())); - oldPoints = newPoints; + m_points = newPoints; m_dirty=false; + } -void LineChartAnimationItem::updateItem(QVector& oldPoints,int index,QPointF& newPoint) +void LineChartAnimationItem::updatePoint(int index,QPointF& newPoint) { + if(m_animation->state()!=QAbstractAnimation::Stopped){ m_animation->stop(); m_dirty=true; } if(m_dirty){ - m_points=oldPoints; + m_points=points(); m_dirty=false; } - oldPoints.replace(index,newPoint); + LineChartItem::updatePoint(index,newPoint); m_animation->setDuration(duration); m_animation->setEasingCurve(QEasingCurve::InOutBack); m_animation->setKeyValueAt(0.0, qVariantFromValue(m_points)); - m_animation->setKeyValueAt(1.0, qVariantFromValue(oldPoints)); + m_animation->setKeyValueAt(1.0, qVariantFromValue( points())); + QTimer::singleShot(0,this,SLOT(startAnimation())); + } void LineChartAnimationItem::startAnimation() @@ -95,7 +103,9 @@ QVariant LineChartAnimatator::interpolated(const QVariant &start, const QVariant void LineChartAnimatator::updateCurrentValue (const QVariant & value ) { QVector vector = qVariantValue >(value); - m_item->applyGeometry(vector); + if(state()!=QAbstractAnimation::Stopped){ //workaround + m_item->setGeometry(vector); + } } #include "moc_linechartanimationitem_p.cpp" diff --git a/src/linechart/linechartanimationitem_p.h b/src/linechart/linechartanimationitem_p.h index 62d7d9f..1128a8c 100644 --- a/src/linechart/linechartanimationitem_p.h +++ b/src/linechart/linechartanimationitem_p.h @@ -19,8 +19,8 @@ public: virtual ~LineChartAnimationItem(); protected: - virtual void updateItem(QVector& oldPoints,QVector& newPoints); - virtual void updateItem(QVector& oldPoints,int index,QPointF& newPoint); + virtual void updateAllPoints(); + virtual void updatePoint(int index,QPointF& newPoint); private slots: void startAnimation(); diff --git a/src/linechart/linechartitem.cpp b/src/linechart/linechartitem.cpp index ea10997..9a0963f 100644 --- a/src/linechart/linechartitem.cpp +++ b/src/linechart/linechartitem.cpp @@ -78,19 +78,43 @@ QVector LineChartItem::calculateGeometryPoints() const return points; } -void LineChartItem::updateItem(QVector& oldPoints,QVector& newPoints) +void LineChartItem::updateAllPoints() { - applyGeometry(newPoints); - oldPoints = newPoints; + QVector points = calculateGeometryPoints(); + + int diff = m_points.size() - points.size(); + + if(diff>0) { + clearPoints(diff); + } + else if(diff<0) { + createPoints(-diff); + } + + setGeometry(points); } -void LineChartItem::updateItem(QVector& oldPoints,int index,QPointF& newPoint) +void LineChartItem::updatePoints(QVector& points) { - oldPoints.replace(index,newPoint); - applyGeometry(oldPoints); + int diff = m_points.size() - points.size(); + + if(diff>0) { + clearPoints(diff); + } + else if(diff<0) { + createPoints(-diff); + } + + setGeometry(points); +} + +void LineChartItem::updatePoint(int index,QPointF& newPoint) +{ + m_points.replace(index,newPoint); + setGeometry(m_points); } -void LineChartItem::applyGeometry(QVector& points) +void LineChartItem::setGeometry(QVector& points) { if(points.size()==0) return; @@ -122,6 +146,7 @@ void LineChartItem::applyGeometry(QVector& points) prepareGeometryChange(); m_path = path; m_rect = path.boundingRect(); + m_points = points; } void LineChartItem::setPen(const QPen& pen) @@ -140,18 +165,20 @@ void LineChartItem::handlePointAdded(int index) createPoints(1); QVector points = m_points; points.insert(index,point); - updateItem(m_points,points); + + updatePoints(points); update(); } void LineChartItem::handlePointRemoved(int index) { Q_ASSERT(indexcount()); Q_ASSERT(index>=0); + QPointF point = calculateGeometryPoint(index); clearPoints(1); QVector points = m_points; points.remove(index); - updateItem(m_points,points); + updatePoints(points); update(); } @@ -160,7 +187,7 @@ void LineChartItem::handlePointReplaced(int index) Q_ASSERT(indexcount()); Q_ASSERT(index>=0); QPointF point = calculateGeometryPoint(index); - updateItem(m_points,index,point); + updatePoint(index,point); update(); } @@ -171,21 +198,8 @@ void LineChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qrea m_minY=minY; m_maxY=maxY; - if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return; - if(!m_clipRect.isValid()) return; - - QVector points = calculateGeometryPoints(); - - int diff = m_points.size() - points.size(); - - if(diff>0) { - clearPoints(diff); - } - else if(diff<0) { - createPoints(-diff); - } - - updateItem(m_points,points); + if(isEmpty()) return; + updateAllPoints(); update(); } @@ -196,20 +210,8 @@ void LineChartItem::handleGeometryChanged(const QRectF& rect) m_clipRect=rect.translated(-rect.topLeft()); setPos(rect.topLeft()); - if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return; - - QVector points = calculateGeometryPoints(); - - int diff = m_points.size() - points.size(); - - if(diff>0) { - clearPoints(diff); - } - else if(diff<0) { - createPoints(-diff); - } - - updateItem(m_points,points); + if(isEmpty()) return; + updateAllPoints(); update(); } @@ -233,6 +235,10 @@ void LineChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt painter->restore(); } +bool LineChartItem::isEmpty() +{ + return !m_clipRect.isValid() || m_maxX - m_minX == 0 || m_maxY - m_minY ==0 ; +} #include "moc_linechartitem_p.cpp" diff --git a/src/linechart/linechartitem_p.h b/src/linechart/linechartitem_p.h index 0579461..d874e4c 100644 --- a/src/linechart/linechartitem_p.h +++ b/src/linechart/linechartitem_p.h @@ -33,14 +33,18 @@ public slots: void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); void handleGeometryChanged(const QRectF& size); -public: - virtual void updateItem(QVector& oldPoints,QVector& newPoints); - virtual void updateItem(QVector& oldPoints,int index,QPointF& newPoint); - virtual void applyGeometry(QVector& points); +protected: + virtual void updateAllPoints(); + virtual void updatePoints(QVector& points); + virtual void updatePoint(int index,QPointF& newPoint); + virtual void setGeometry(QVector& points); + + QVector points() {return m_points;} void createPoints(int count); void clearPoints(int count); QPointF calculateGeometryPoint(int index) const; QVector calculateGeometryPoints() const; + inline bool isEmpty(); protected: qreal m_minX; @@ -56,6 +60,8 @@ protected: QVector m_points; QPen m_pen; + friend class LineChartAnimatator; + }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/splinechart/splinechartitem.cpp b/src/splinechart/splinechartitem.cpp index 0b5a1e1..01541c6 100644 --- a/src/splinechart/splinechartitem.cpp +++ b/src/splinechart/splinechartitem.cpp @@ -21,7 +21,7 @@ QPointF SplineChartItem::calculateGeometryControlPoint(int index) const return QPointF(x,y); } -void SplineChartItem::applyGeometry(QVector& points) +void SplineChartItem::setGeometry(QVector& points) { if(points.size()==0) return; diff --git a/src/splinechart/splinechartitem_p.h b/src/splinechart/splinechartitem_p.h index e84889b..ac3209d 100644 --- a/src/splinechart/splinechartitem_p.h +++ b/src/splinechart/splinechartitem_p.h @@ -16,7 +16,7 @@ public: void updateGeometry(); - void applyGeometry(QVector& points); + void setGeometry(QVector& points); QPointF calculateGeometryControlPoint(int index) const;