diff --git a/src/animations/animations.pri b/src/animations/animations.pri index ad06aea..c167dec 100644 --- a/src/animations/animations.pri +++ b/src/animations/animations.pri @@ -7,7 +7,9 @@ SOURCES += \ $$PWD/xyanimation.cpp \ $$PWD/pieanimation.cpp \ $$PWD/piesliceanimation.cpp \ - $$PWD/splineanimation.cpp + $$PWD/splineanimation.cpp \ + $$PWD/baranimation.cpp + PRIVATE_HEADERS += \ @@ -17,4 +19,6 @@ PRIVATE_HEADERS += \ $$PWD/xyanimation_p.h \ $$PWD/pieanimation_p.h \ $$PWD/piesliceanimation_p.h \ - $$PWD/splineanimation_p.h + $$PWD/splineanimation_p.h \ + $$PWD/baranimation_p.h + diff --git a/src/animations/baranimation.cpp b/src/animations/baranimation.cpp new file mode 100644 index 0000000..6cadd7e --- /dev/null +++ b/src/animations/baranimation.cpp @@ -0,0 +1,49 @@ +#include "baranimation_p.h" +#include "barchartitem_p.h" +#include +#include + +Q_DECLARE_METATYPE(QVector) + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +BarAnimation::BarAnimation(BarChartItem *item) + :ChartAnimation(item), + m_item(item) +{ +} + +BarAnimation::~BarAnimation() +{ +} + +void BarAnimation::updateValues(const BarLayout& layout) +{ + // TODO: + qDebug() << "BarAnimation::updateValues"; +} + + +QVariant BarAnimation::interpolated(const QVariant &from, const QVariant &to, qreal progress) const +{ + QVector startVector = qVariantValue > (from); + QVector endVector = qVariantValue > (to); + QVector result; + + Q_ASSERT(startVector.count() == endVector.count()) ; + + for(int i =0 ;i< startVector.count();i++){ + QSizeF value = startVector[i] + ((endVector[i]- endVector[i]) * progress); + result << value; + } + return qVariantFromValue(result); +} + +void BarAnimation::updateCurrentValue(const QVariant &) +{ + // TODO? +} + +#include "moc_baranimation_p.cpp" + +QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/animations/baranimation_p.h b/src/animations/baranimation_p.h new file mode 100644 index 0000000..aa14475 --- /dev/null +++ b/src/animations/baranimation_p.h @@ -0,0 +1,36 @@ +#ifndef BARANIMATION_P_H_ +#define BARANIMATION_P_H_ + +#include "chartanimation_p.h" +#include "barchartitem_p.h" + +QTCOMMERCIALCHART_BEGIN_NAMESPACE + +class BarChartItem; +class QBarSet; +class BarSetAnimation; + +class BarAnimation : public ChartAnimation +{ + Q_OBJECT + +public: + BarAnimation(BarChartItem *item); + ~BarAnimation(); + + void updateValues(const BarLayout& layout); + +public: // from QVariantAnimation + virtual QVariant interpolated (const QVariant & from, const QVariant & to, qreal progress ) const; + virtual void updateCurrentValue (const QVariant & value ); + +public Q_SLOTS: + +private: + BarChartItem *m_item; + QHash m_animations; +}; + +QTCOMMERCIALCHART_END_NAMESPACE + +#endif diff --git a/src/animations/chartanimator.cpp b/src/animations/chartanimator.cpp index 30a6eac..f9d77be 100644 --- a/src/animations/chartanimator.cpp +++ b/src/animations/chartanimator.cpp @@ -4,6 +4,8 @@ #include "splineanimation_p.h" #include "xychartitem_p.h" #include "pieanimation_p.h" +#include "baranimation_p.h" +#include "barchartitem_p.h" #include "areachartitem_p.h" #include "splinechartitem_p.h" #include "scatterchartitem_p.h" @@ -84,6 +86,19 @@ void ChartAnimator::addAnimation(PieChartItem* item) item->setAnimator(this); } +void ChartAnimator::addAnimation(BarChartItem* item) +{ + ChartAnimation* animation = m_animations.value(item); + + if(!animation) { + animation = new BarAnimation(item); + m_animations.insert(item,animation); + } + + item->setAnimator(this); +} + + void ChartAnimator::removeAnimation(ChartItem* item) { item->setAnimator(0); @@ -252,6 +267,15 @@ void ChartAnimator::updateLayout(PieChartItem* item, QPieSlice *slice, const Pie animation->updateValue(slice, sliceData); } +void ChartAnimator::updateLayout(BarChartItem* item, const BarLayout &layout) +{ + qDebug() << "ChartAnimator::updateLayout"; + BarAnimation* animation = static_cast(m_animations.value(item)); + Q_ASSERT(animation); + animation->updateValues(layout); +} + + void ChartAnimator::setState(State state,const QPointF& point) { m_state=state; diff --git a/src/animations/chartanimator_p.h b/src/animations/chartanimator_p.h index 4571707..fef1ae6 100644 --- a/src/animations/chartanimator_p.h +++ b/src/animations/chartanimator_p.h @@ -3,6 +3,7 @@ #include "qchartglobal.h" #include "chartanimation_p.h" #include "piechartitem_p.h" +#include "barchartitem_p.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -28,6 +29,7 @@ public: void addAnimation(ScatterChartItem* item); void addAnimation(LineChartItem* item); void addAnimation(SplineChartItem* item); + void addAnimation(BarChartItem* item); void removeAnimation(ChartItem* item); void animationStarted(); @@ -40,6 +42,8 @@ public: void updateLayout(PieChartItem* item, const PieLayout &layout); void updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceData &sliceData); + void updateLayout(BarChartItem* item, const BarLayout &layout); + void setState(State state,const QPointF& point = QPointF()); private: diff --git a/src/barchart/barchartitem.cpp b/src/barchart/barchartitem.cpp index 6932438..d7406fc 100644 --- a/src/barchart/barchartitem.cpp +++ b/src/barchart/barchartitem.cpp @@ -7,6 +7,7 @@ #include "qchartaxis.h" #include "qchartaxiscategories.h" #include "chartpresenter_p.h" +#include "chartanimator_p.h" #include #include @@ -22,6 +23,8 @@ BarChartItem::BarChartItem(QBarSeries *series, QChart *parent) : { connect(series,SIGNAL(showToolTip(QPoint,QString)),this,SLOT(showToolTip(QPoint,QString))); connect(series, SIGNAL(updatedBars()), this, SLOT(layoutChanged())); +//TODO: connect(series,SIGNAL("position or size has changed"), this, SLOT(handleLayoutChanged())); + connect(series, SIGNAL(restructuredBar(int)), this, SLOT(handleModelChanged(int))); setZValue(ChartPresenter::BarSeriesZValue); initAxisLabels(); dataChanged(); @@ -157,6 +160,31 @@ void BarChartItem::layoutChanged() update(); } +BarLayout BarChartItem::calculateLayout() +{ + BarLayout layout; + foreach(Bar* bar, mBars) { + layout.insert(bar,bar->boundingRect().size()); + } + + return layout; +} + +void BarChartItem::applyLayout(const BarLayout &layout) +{ + if (m_animator) + m_animator->updateLayout(this, layout); + else + setLayout(layout); +} + +void BarChartItem::setLayout(const BarLayout &layout) +{ + foreach (Bar *bar, layout.keys()) { + bar->setSize(layout.value(bar)); + } + update(); +} void BarChartItem::initAxisLabels() { @@ -228,6 +256,14 @@ void BarChartItem::handleGeometryChanged(const QRectF& rect) setPos(rect.topLeft()); } +void BarChartItem::handleLayoutChanged() +{ + BarLayout layout = calculateLayout(); + applyLayout(layout); + update(); +} + + void BarChartItem::showToolTip(QPoint pos, QString tip) { // TODO: cool tooltip instead of default diff --git a/src/barchart/barchartitem_p.h b/src/barchart/barchartitem_p.h index 6aeed0f..59bcb60 100644 --- a/src/barchart/barchartitem_p.h +++ b/src/barchart/barchartitem_p.h @@ -14,7 +14,8 @@ class BarValue; class QChartAxisCategories; class QChart; -// Common implemantation of different presenters. +typedef QHash BarLayout; + class BarChartItem : public QObject, public ChartItem { Q_OBJECT @@ -32,6 +33,11 @@ public: private slots: virtual void layoutChanged(); // layout has changed -> need to recalculate bar sizes +public: + BarLayout calculateLayout(); + void applyLayout(const BarLayout &layout); + void setLayout(const BarLayout &layout); + protected: void initAxisLabels(); @@ -39,6 +45,7 @@ public slots: void handleModelChanged(int index); void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); void handleGeometryChanged(const QRectF& size); + void handleLayoutChanged(); // Internal slots void showToolTip(QPoint pos, QString tip); // shows tooltip (if enabled) diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index d401542..93f20b5 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -162,7 +162,7 @@ void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) QBarSeries* barSeries = static_cast(series); BarChartItem* bar = new BarChartItem(barSeries,m_chart); if(m_options.testFlag(QChart::SeriesAnimations)) { - // m_animator->addAnimation(bar); + m_animator->addAnimation(bar); } m_chartTheme->decorate(barSeries, m_dataset->seriesIndex(barSeries),m_themeForce); QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&))); @@ -175,7 +175,7 @@ void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) QStackedBarSeries* stackedBarSeries = static_cast(series); StackedBarChartItem* bar = new StackedBarChartItem(stackedBarSeries,m_chart); if(m_options.testFlag(QChart::SeriesAnimations)) { - // m_animator->addAnimation(bar); + m_animator->addAnimation(bar); } m_chartTheme->decorate(stackedBarSeries, m_dataset->seriesIndex(stackedBarSeries),m_themeForce); QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&))); @@ -188,7 +188,7 @@ void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) QPercentBarSeries* percentBarSeries = static_cast(series); PercentBarChartItem* bar = new PercentBarChartItem(percentBarSeries,m_chart); if(m_options.testFlag(QChart::SeriesAnimations)) { - // m_animator->addAnimation(bar); + m_animator->addAnimation(bar); } m_chartTheme->decorate(percentBarSeries, m_dataset->seriesIndex(percentBarSeries),m_themeForce); QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),bar,SLOT(handleGeometryChanged(const QRectF&)));