From 86afa1b4ff5f219d7cadcb1ff03fbf2403fc5656 2012-03-05 07:27:45 From: Michal Klocek Date: 2012-03-05 07:27:45 Subject: [PATCH] Refactor domain model * rewrites doman hadnling to support better mulitaxis * rewrites zoom in zoom out handling * makes domain a qobject * adds domain unit test * updates chartdataset unit test * renames signlas and slots for domain handling --- diff --git a/src/areachart/areachartitem.cpp b/src/areachart/areachartitem.cpp index 7a2df4b..c3e6aa0 100644 --- a/src/areachart/areachartitem.cpp +++ b/src/areachart/areachartitem.cpp @@ -1,7 +1,6 @@ #include "areachartitem_p.h" #include "qareaseries.h" #include "qlineseries.h" -#include "chartpresenter_p.h" #include @@ -9,20 +8,17 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE //TODO: optimize : remove points which are not visible -AreaChartItem::AreaChartItem(ChartPresenter* presenter, QAreaSeries* areaSeries,QGraphicsItem *parent):ChartItem(parent), -m_presenter(presenter), +AreaChartItem::AreaChartItem(QAreaSeries* areaSeries,QGraphicsItem *parent):ChartItem(parent), m_series(areaSeries), m_upper(0), m_lower(0) { //m_items.setZValue(ChartPresenter::LineChartZValue); - m_upper = new AreaBoundItem(this,presenter,m_series->upperSeries()); + m_upper = new AreaBoundItem(this,m_series->upperSeries()); if(m_series->lowerSeries()){ - m_lower = new AreaBoundItem(this,presenter,m_series->lowerSeries()); + m_lower = new AreaBoundItem(this,m_series->lowerSeries()); } - setZValue(ChartPresenter::LineChartZValue); - QObject::connect(presenter,SIGNAL(geometryChanged(const QRectF&)),this,SLOT(handleGeometryChanged(const QRectF&))); QObject::connect(areaSeries,SIGNAL(updated()),this,SLOT(handleUpdated())); handleUpdated(); @@ -82,11 +78,11 @@ void AreaChartItem::handleUpdated() update(); } -void AreaChartItem::handleDomainChanged(const Domain& domain) +void AreaChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY) { - m_upper->handleDomainChanged(domain); + m_upper->handleDomainChanged(minX,maxX,minY,maxY); if(m_lower) - m_lower->handleDomainChanged(domain); + m_lower->handleDomainChanged(minX,maxX,minY,maxY); } void AreaChartItem::handleGeometryChanged(const QRectF& rect) diff --git a/src/areachart/areachartitem_p.h b/src/areachart/areachartitem_p.h index d2464b9..9820dda 100644 --- a/src/areachart/areachartitem_p.h +++ b/src/areachart/areachartitem_p.h @@ -15,7 +15,7 @@ class AreaChartItem : public QObject ,public ChartItem { Q_OBJECT public: - AreaChartItem(ChartPresenter* presenter, QAreaSeries* areaSeries, QGraphicsItem *parent = 0); + AreaChartItem(QAreaSeries* areaSeries, QGraphicsItem *parent = 0); ~ AreaChartItem(); //from QGraphicsItem @@ -29,15 +29,14 @@ public: void updatePath(); public slots: void handleUpdated(); - void handleDomainChanged(const Domain& domain); + void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); void handleGeometryChanged(const QRectF& size); private: - ChartPresenter* m_presenter; - QPainterPath m_path; QAreaSeries* m_series; LineChartItem* m_upper; LineChartItem* m_lower; + QPainterPath m_path; QRectF m_rect; QRectF m_clipRect; QPen m_pen; @@ -47,7 +46,7 @@ private: class AreaBoundItem : public LineChartItem { public: - AreaBoundItem(AreaChartItem* item,ChartPresenter* presenter, QLineSeries* lineSeries):LineChartItem(presenter,lineSeries), + AreaBoundItem(AreaChartItem* item,QLineSeries* lineSeries):LineChartItem(lineSeries), m_item(item){}; ~AreaBoundItem(){}; diff --git a/src/axisanimationitem.cpp b/src/axisanimationitem.cpp index d2138ad..c05563d 100644 --- a/src/axisanimationitem.cpp +++ b/src/axisanimationitem.cpp @@ -7,8 +7,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE const static int duration = 500; -AxisAnimationItem::AxisAnimationItem(AxisType type,QGraphicsItem* parent) : -AxisItem(type,parent), +AxisAnimationItem::AxisAnimationItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) : +AxisItem(axis,type,parent), m_animation(new AxisAnimator(this,this)) { } diff --git a/src/axisanimationitem_p.h b/src/axisanimationitem_p.h index 6b89cb5..3cfe36e 100644 --- a/src/axisanimationitem_p.h +++ b/src/axisanimationitem_p.h @@ -15,7 +15,7 @@ class AxisAnimationItem : public AxisItem Q_OBJECT public: - AxisAnimationItem(AxisType type = X_AXIS,QGraphicsItem* parent = 0); + AxisAnimationItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0); ~AxisAnimationItem(); void setLabelsAngle(int angle); diff --git a/src/axisitem.cpp b/src/axisitem.cpp index ac29053..1aceb6b 100644 --- a/src/axisitem.cpp +++ b/src/axisitem.cpp @@ -8,8 +8,9 @@ static int label_padding = 5; QTCOMMERCIALCHART_BEGIN_NAMESPACE -AxisItem::AxisItem(AxisType type,QGraphicsItem* parent) : +AxisItem::AxisItem(QChartAxis* axis,AxisType type,QGraphicsItem* parent) : ChartItem(parent), +m_chartAxis(axis), m_type(type), m_labelsAngle(0), m_grid(parent), @@ -22,6 +23,8 @@ m_axis(parent) m_shades.setZValue(ChartPresenter::ShadesZValue); m_grid.setZValue(ChartPresenter::GridZValue); setFlags(QGraphicsItem::ItemHasNoContents); + + QObject::connect(m_chartAxis,SIGNAL(updated()),this,SLOT(handleAxisUpdated())); } AxisItem::~AxisItem() @@ -74,72 +77,27 @@ void AxisItem::updateItems(QVector& oldLayout,QVector& newLayout) oldLayout=newLayout; } -void AxisItem::handleAxisUpdate(QChartAxis* axis) +QStringList AxisItem::createLabels(int ticks, qreal min, qreal max) { - if(m_layoutVector.count()==0) return; - if(axis->isAxisVisible()) { - setAxisOpacity(100); - } - else { - setAxisOpacity(0); - } - if(axis->isGridVisible()) { - setGridOpacity(100); - } - else { - setGridOpacity(0); - } + Q_ASSERT(max>=min); - if(axis->labelsVisible()) - { - setLabelsOpacity(100); - } - else { - setLabelsOpacity(0); - } + QStringList labels; - if(axis->shadesVisible()) { - setShadesOpacity(axis->shadesOpacity()); - } - else { - setShadesOpacity(0); - } - - setLabelsAngle(axis->labelsAngle()); - setAxisPen(axis->axisPen()); - setLabelsPen(axis->labelsPen()); - setLabelsBrush(axis->labelsBrush()); - setLabelsFont(axis->labelsFont()); - setGridPen(axis->gridPen()); - setShadesPen(axis->shadesPen()); - setShadesBrush(axis->shadesBrush()); -} - -void AxisItem::handleRangeChanged(QChartAxis* axis,const QStringList& labels) -{ - int diff = m_thicksList.size() - labels.size(); + //int ticks = axis->ticksCount()-1; - if(diff>0){ - clear(diff); - }else if(diff<0){ - createItems(-diff); + for(int i=0; i<= ticks; i++) { + qreal value = min + (i * (max - min)/ ticks); + QString label ;//= axis->axisTickLabel(value); + if(label.isEmpty()) { + labels << QString::number(value); + } + else { + labels << label; + } } - m_thicksList=labels; - QVector vector = calculateLayout(); - updateItems(m_layoutVector,vector); - if(diff!=0) handleAxisUpdate(axis); -} - -void AxisItem::handleGeometryChanged(const QRectF& rect) -{ - m_rect = rect; - - if(m_thicksList.size()==0) return; - - QVector vector = calculateLayout(); - updateItems(m_layoutVector,vector); + return labels; } void AxisItem::setAxisOpacity(qreal opacity) @@ -334,6 +292,85 @@ void AxisItem::applyLayout(const QVector& points) } } +//handlers + +void AxisItem::handleAxisUpdated() +{ + if(m_layoutVector.count()==0) return; + + if(m_chartAxis->isAxisVisible()) { + setAxisOpacity(100); + } + else { + setAxisOpacity(0); + } + + if(m_chartAxis->isGridVisible()) { + setGridOpacity(100); + } + else { + setGridOpacity(0); + } + + if(m_chartAxis->labelsVisible()) + { + setLabelsOpacity(100); + } + else { + setLabelsOpacity(0); + } + + if(m_chartAxis->shadesVisible()) { + setShadesOpacity(m_chartAxis->shadesOpacity()); + } + else { + setShadesOpacity(0); + } + + setLabelsAngle(m_chartAxis->labelsAngle()); + setAxisPen(m_chartAxis->axisPen()); + setLabelsPen(m_chartAxis->labelsPen()); + setLabelsBrush(m_chartAxis->labelsBrush()); + setLabelsFont(m_chartAxis->labelsFont()); + setGridPen(m_chartAxis->gridPen()); + setShadesPen(m_chartAxis->shadesPen()); + setShadesBrush(m_chartAxis->shadesBrush()); +} + +void AxisItem::handleRangeChanged(qreal min, qreal max) +{ + if(min == max) return; + + QStringList labels = createLabels(4,min,max); + + int diff = m_thicksList.size() - labels.size(); + + if(diff>0){ + clear(diff); + }else if(diff<0){ + createItems(-diff); + } + m_thicksList=labels; + + if(m_rect.isEmpty()) return; + + QVector vector = calculateLayout(); + + updateItems(m_layoutVector,vector); + + if(diff!=0) handleAxisUpdated(); +} + +void AxisItem::handleGeometryChanged(const QRectF& rect) +{ + m_rect = rect; + + if(m_thicksList.size()==0) return; + + QVector vector = calculateLayout(); + updateItems(m_layoutVector,vector); +} + //TODO "nice numbers algorithm" #include "moc_axisitem_p.cpp" diff --git a/src/axisitem_p.h b/src/axisitem_p.h index 48e8d6d..e709965 100644 --- a/src/axisitem_p.h +++ b/src/axisitem_p.h @@ -15,7 +15,7 @@ class AxisItem : public QObject, public ChartItem public: enum AxisType{X_AXIS,Y_AXIS}; - AxisItem(AxisType type = X_AXIS,QGraphicsItem* parent = 0); + AxisItem(QChartAxis* axis,AxisType type = X_AXIS,QGraphicsItem* parent = 0); ~AxisItem(); //from QGraphicsItem @@ -50,9 +50,10 @@ public: void setLabelsFont(const QFont& font); public slots: - void handleAxisUpdate(QChartAxis* axis); //look and feel - void handleRangeChanged(QChartAxis* axis,const QStringList& labels); //labels from dataset - void handleGeometryChanged(const QRectF& size); // geometry from presenter + void handleAxisUpdated();//qchartaxis update calls + void handleRangeChanged(qreal min , qreal max); //domain update calls + void handleGeometryChanged(const QRectF& size); //geometry update calls + public: virtual void updateItems(QVector& oldLayout,QVector& newLayout); QVector calculateLayout() const; @@ -61,7 +62,9 @@ public: private: void clear(int count); void createItems(int count); + QStringList createLabels(int ticks, qreal min, qreal max); private: + QChartAxis* m_chartAxis; AxisType m_type; QRectF m_rect; int m_labelsAngle; diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp index ab2281d..ef2a4b2 100644 --- a/src/chartdataset.cpp +++ b/src/chartdataset.cpp @@ -22,425 +22,265 @@ ChartDataSet::ChartDataSet(QObject *parent):QObject(parent), ChartDataSet::~ChartDataSet() { - // TODO Auto-generated destructor stub -} - -const Domain ChartDataSet::domain(QChartAxis *axisY) const -{ - int i = m_domainMap.count(axisY); - if(i == 0){ - return Domain(); - } - i = i - m_domainIndex -1; - return m_domainMap.values(axisY).at(i); } void ChartDataSet::addSeries(QSeries* series, QChartAxis *axisY) { - // TODO: we should check the series not already added + if(axisY==0) axisY = m_axisY; - series->setParent(this);// take ownership - clearDomains(); + QChartAxis* axis = m_seriesAxisMap.value(series); - if(axisY==0) axisY = m_axisY; - axisY->setParent(this);// take ownership + if(axis) { + qWarning() << "Can not add series. Series already on the chart"; + return; + } - QList seriesList = m_seriesMap.values(axisY); + if(!series->parent()){ + series->setParent(this); // take ownership + }; - QList domainList = m_domainMap.values(axisY); + if(!axisY->parent()){ + axisY->setParent(this); // take ownership + } - Q_ASSERT(domainList.size()<=1); + Domain* domain = m_axisDomainMap.value(axisY); - Domain domain; + if(!domain) { + domain = new Domain(); - if(domainList.size()>0) domain = domainList.at(0); + QObject::connect(axisY,SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeXChanged(qreal,qreal))); + QObject::connect(axisX(),SIGNAL(rangeChanged(qreal,qreal)),domain,SLOT(handleAxisRangeYChanged(qreal,qreal))); - switch(series->type()) - { - case QSeries::SeriesTypeLine: { - - QLineSeries* lineSeries = static_cast(series); - - for (int i = 0; i < lineSeries->count(); i++) - { - qreal x = lineSeries->x(i); - qreal y = lineSeries->y(i); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - } - break; + m_axisDomainMap.insert(axisY,domain); + emit axisAdded(axisY,domain); } - case QSeries::SeriesTypeArea: { - QAreaSeries* areaSeries = static_cast(series); + if(!m_axisXInitialized){ + emit axisAdded(axisX(),domain); + m_axisXInitialized=true; + } - QLineSeries* upperSeries = areaSeries->upperSeries(); - QLineSeries* lowerSeries = areaSeries->lowerSeries(); + calculateDomain(series,domain); - for (int i = 0; i < upperSeries->count(); i++) - { - qreal x = upperSeries->x(i); - qreal y = upperSeries->y(i); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - } - if(lowerSeries){ - for (int i = 0; i < lowerSeries->count(); i++) - { - qreal x = lowerSeries->x(i); - qreal y = lowerSeries->y(i); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - }} - break; - } - case QSeries::SeriesTypeBar: { - qDebug() << "QChartSeries::SeriesTypeBar"; - QBarSeries* barSeries = static_cast(series); - qreal x = barSeries->categoryCount(); - qreal y = barSeries->max(); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - break; - } - case QSeries::SeriesTypeStackedBar: { - qDebug() << "QChartSeries::SeriesTypeStackedBar"; - - QStackedBarSeries* stackedBarSeries = static_cast(series); - qreal x = stackedBarSeries->categoryCount(); - qreal y = stackedBarSeries->maxCategorySum(); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - break; - } - case QSeries::SeriesTypePercentBar: { - qDebug() << "QChartSeries::SeriesTypePercentBar"; - - QPercentBarSeries* percentBarSeries = static_cast(series); - qreal x = percentBarSeries->categoryCount(); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = 0; - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = 100; - break; - } + m_seriesAxisMap.insert(series,axisY); + emit seriesAdded(series,domain); - case QSeries::SeriesTypePie: { - QPieSeries *pieSeries = static_cast(series); - // TODO: domain stuff - break; - } +} - case QSeries::SeriesTypeScatter: { - QScatterSeries *scatterSeries = qobject_cast(series); - Q_ASSERT(scatterSeries); - foreach (QPointF point, scatterSeries->data()) { - domain.m_minX = qMin(domain.m_minX, point.x()); - domain.m_maxX = qMax(domain.m_maxX, point.x()); - domain.m_minY = qMin(domain.m_minY, point.y()); - domain.m_maxY = qMax(domain.m_maxY, point.y()); - } - break; - } +void ChartDataSet::removeSeries(QSeries* series) +{ - case QSeries::SeriesTypeSpline: { - QSplineSeries* splineSeries = static_cast(series); - - for (int i = 0; i < splineSeries->count(); i++) - { - qreal x = splineSeries->x(i); - qreal y = splineSeries->y(i); - domain.m_minX = qMin(domain.m_minX,x); - domain.m_minY = qMin(domain.m_minY,y); - domain.m_maxX = qMax(domain.m_maxX,x); - domain.m_maxY = qMax(domain.m_maxY,y); - } - break; - } + QChartAxis* axis = m_seriesAxisMap.value(series); - default: { - qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported"; + if(!axis){ + qWarning()<<"Can not remove series. Series not found on the chart."; return; - break; } + emit seriesRemoved(series); + m_seriesAxisMap.remove(series); + if(series->parent()==this){ + delete series; + series=0; } - if(!m_domainMap.contains(axisY)) - { - emit axisAdded(axisY); - QObject::connect(axisY,SIGNAL(rangeChanged(QChartAxis*)),this,SLOT(handleRangeChanged(QChartAxis*))); - QObject::connect(axisY,SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*))); - } - - if(!m_axisXInitialized) - { - emit axisAdded(axisX()); - QObject::connect(axisX(),SIGNAL(rangeChanged(QChartAxis*)),this,SLOT(handleRangeChanged(QChartAxis*))); - QObject::connect(axisX(),SIGNAL(ticksChanged(QChartAxis*)),this,SLOT(handleTickChanged(QChartAxis*))); - m_axisXInitialized=true; - } + QList axes = m_seriesAxisMap.values(); - m_domainMap.replace(axisY,domain); - m_seriesMap.insert(axisY,series); - emit seriesAdded(series); - setDomain(m_domainIndex,axisY); + int i = axes.indexOf(axis); -} + if(i==-1){ + Domain* domain = m_axisDomainMap.take(axis); + emit axisRemoved(axis); + delete domain; + } -void ChartDataSet::removeSeries(QSeries* series) -{ - QList keys = m_seriesMap.uniqueKeys(); - foreach(QChartAxis* axis , keys) { - if(m_seriesMap.contains(axis,series)) { - emit seriesRemoved(series); - m_seriesMap.remove(axis,series); - //remove axis if no longer there - if(!m_seriesMap.contains(axis)) { - emit axisRemoved(axis); - m_domainMap.remove(axis); - if(axis != m_axisY) - delete axis; - } - series->setParent(0); - break; - } + if(m_seriesAxisMap.values().size()==0) + { + m_axisXInitialized=false; + emit axisRemoved(axisX()); } } void ChartDataSet::removeAllSeries() { - QList keys = m_seriesMap.uniqueKeys(); - foreach(QChartAxis* axis , keys) { - QList seriesList = m_seriesMap.values(axis); - for(int i =0; i < seriesList.size();i++ ) - { - emit seriesRemoved(seriesList.at(i)); - delete(seriesList.at(i)); - } - m_seriesMap.remove(axis); - m_domainMap.remove(axis); - emit axisRemoved(axis); - if(axis != m_axisY) delete axis; - } - m_domainIndex=0; -} -bool ChartDataSet::nextDomain() -{ - int limit = (m_domainMap.values().size()/m_domainMap.uniqueKeys().size())-1; + QList series = m_seriesAxisMap.keys(); - if (m_domainIndex < limit) { - m_domainIndex++; - setDomain(m_domainIndex); - return true; - } - else { - return false; + foreach(QSeries* s , series) { + removeSeries(s); } -} -bool ChartDataSet::previousDomain() -{ - if (m_domainIndex > 0) { - m_domainIndex--; - setDomain(m_domainIndex); - return true; - } - else { - return false; - } + Q_ASSERT(m_seriesAxisMap.count()==0); + Q_ASSERT(m_axisDomainMap.count()==0); + } -void ChartDataSet::setDomain(int index) +//to be removed with PIMPL +void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const { - QList domainList = m_domainMap.uniqueKeys(); - - if(domainList.count()==0) return; + switch(series->type()) + { + case QSeries::SeriesTypeLine: { - Domain domain; + QLineSeries* lineSeries = static_cast(series); - foreach (QChartAxis* axis , domainList) { - int i = m_domainMap.count(axis) - index -1; - Q_ASSERT(i>=0); - domain = m_domainMap.values(axis).at(i); - QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY); - QList seriesList = m_seriesMap.values(axis); - foreach(QSeries* series, seriesList) { - emit seriesDomainChanged(series,domain); + for (int i = 0; i < lineSeries->count(); i++) + { + qreal x = lineSeries->x(i); + qreal y = lineSeries->y(i); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + } + break; } - axis->updateRange(domain.m_minY,domain.m_maxY); - emit axisRangeChanged(axis,labels); + case QSeries::SeriesTypeArea: { - } + QAreaSeries* areaSeries = static_cast(series); - QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX); - axisX()->updateRange(domain.m_minX,domain.m_maxY); - emit axisRangeChanged(axisX(),labels); -} + QLineSeries* upperSeries = areaSeries->upperSeries(); + QLineSeries* lowerSeries = areaSeries->lowerSeries(); -void ChartDataSet::setDomain(int index,QChartAxis* axis) -{ - int i = m_domainMap.count(axis) - index -1; - Q_ASSERT(i>=0); - Domain domain = m_domainMap.values(axis).at(i); - { - QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY); - QList seriesList = m_seriesMap.values(axis); - foreach(QSeries* series, seriesList) { - emit seriesDomainChanged(series,domain); + for (int i = 0; i < upperSeries->count(); i++) + { + qreal x = upperSeries->x(i); + qreal y = upperSeries->y(i); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + } + if(lowerSeries) { + for (int i = 0; i < lowerSeries->count(); i++) + { + qreal x = lowerSeries->x(i); + qreal y = lowerSeries->y(i); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + }} + break; + } + case QSeries::SeriesTypeBar: { + qDebug() << "QChartSeries::SeriesTypeBar"; + QBarSeries* barSeries = static_cast(series); + qreal x = barSeries->categoryCount(); + qreal y = barSeries->max(); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + break; + } + case QSeries::SeriesTypeStackedBar: { + qDebug() << "QChartSeries::SeriesTypeStackedBar"; + + QStackedBarSeries* stackedBarSeries = static_cast(series); + qreal x = stackedBarSeries->categoryCount(); + qreal y = stackedBarSeries->maxCategorySum(); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + break; + } + case QSeries::SeriesTypePercentBar: { + qDebug() << "QChartSeries::SeriesTypePercentBar"; + + QPercentBarSeries* percentBarSeries = static_cast(series); + qreal x = percentBarSeries->categoryCount(); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(0); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(100); + break; } - axis->updateRange(domain.m_minY,domain.m_maxY); - emit axisRangeChanged(axis,labels); - } - QStringList labels = createLabels(axisX(),domain.m_minX,domain.m_maxX); - axisX()->updateRange(domain.m_minX,domain.m_maxY); - emit axisRangeChanged(axisX(),labels); -} + case QSeries::SeriesTypePie: { + QPieSeries *pieSeries = static_cast(series); + // TODO: domain stuff + break; + } -void ChartDataSet::clearDomains(int toIndex) -{ - Q_ASSERT(toIndex>=0); + case QSeries::SeriesTypeScatter: { + QScatterSeries *scatterSeries = qobject_cast(series); + Q_ASSERT(scatterSeries); + foreach (QPointF point, scatterSeries->data()) { + domain->setMinX(qMin(domain->minX(), point.x())); + domain->setMinY(qMax(domain->maxX(), point.x())); + domain->setMaxX(qMin(domain->minY(), point.y())); + domain->setMaxY(qMax(domain->maxY(), point.y())); + } + break; + } - m_domainIndex = toIndex; + case QSeries::SeriesTypeSpline: { + QSplineSeries* splineSeries = static_cast(series); - QList keys = m_domainMap.uniqueKeys(); + for (int i = 0; i < splineSeries->count(); i++) + { + qreal x = splineSeries->x(i); + qreal y = splineSeries->y(i); + domain->setMinX(qMin(domain->minX(),x)); + domain->setMinY(qMin(domain->minY(),y)); + domain->setMaxX(qMax(domain->maxX(),x)); + domain->setMaxY(qMax(domain->maxY(),y)); + } + break; + } - foreach (QChartAxis* key , keys) - { - QList domains = m_domainMap.values(key); - m_domainMap.remove(key); - int i = domains.size() - toIndex - 1; - while(i--) { - domains.removeFirst(); + default: { + qDebug()<<__FUNCTION__<<"type" << series->type()<<"not supported"; + return; + break; } - for(int j=domains.size()-1; j>=0;j--) - m_domainMap.insert(key,domains.at(j)); + } } -void ChartDataSet::addDomain(const QRectF& rect, const QRectF& viewport) +void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size) { - Q_ASSERT(rect.isValid()); - Q_ASSERT(viewport.isValid()); - - clearDomains(m_domainIndex); - - QList domainList = m_domainMap.uniqueKeys(); - - Domain domain; - - foreach (QChartAxis* axis , domainList) { - domain = m_domainMap.value(axis).subDomain(rect,viewport.width(),viewport.height()); - m_domainMap.insert(axis,domain); + QMapIterator i( m_axisDomainMap); + while (i.hasNext()) { + i.next(); + i.value()->zoomIn(rect,size); } +} - setDomain(++m_domainIndex); +void ChartDataSet::zoomOutDomain(const QRectF& rect, const QSizeF& size) +{ + QMapIterator i( m_axisDomainMap); + while (i.hasNext()) { + i.next(); + i.value()->zoomOut(rect,size); + } } QChartAxis* ChartDataSet::axisY(QSeries* series) const { if(series == 0) return m_axisY; - - QList keys = m_seriesMap.uniqueKeys(); - - foreach(QChartAxis* axis , keys) { - if(m_seriesMap.contains(axis,series)) { - return axis; - } - } - return 0; + return m_seriesAxisMap.value(series); } -QStringList ChartDataSet::createLabels(QChartAxis* axis,qreal min, qreal max) +Domain* ChartDataSet::domain(QSeries* series) const { - Q_ASSERT(max>=min); - - QStringList labels; - - int ticks = axis->ticksCount()-1; - - for(int i=0; i<= ticks; i++) { - qreal value = min + (i * (max - min)/ ticks); - QString label = axis->axisTickLabel(value); - if(label.isEmpty()) { - labels << QString::number(value); - } - else { - labels << label; - } - } - return labels; + QChartAxis* axis = m_seriesAxisMap.value(series); + if(axis){ + return m_axisDomainMap.value(axis); + }else + return 0; } -void ChartDataSet::handleRangeChanged(QChartAxis* axis) +Domain* ChartDataSet::domain(QChartAxis* axis) const { - qreal min = axis->min(); - qreal max = axis->max(); - - if(axis==axisX()) { - - m_domainIndex=0; - - clearDomains(m_domainIndex); - - QList domainList = m_domainMap.uniqueKeys(); - - foreach (QChartAxis* axis , domainList) { - - Q_ASSERT(m_domainMap.values(axis).size()==1); - - Domain domain = m_domainMap.value(axis); - domain.m_minX=min; - domain.m_maxX=max; - m_domainMap.replace(axis,domain); - } - - setDomain(m_domainIndex); - - } - else { - - QList domains = m_domainMap.values(axis); - m_domainMap.remove(axis); - - for(int i=0;i=0;j--) - m_domainMap.insert(axis,domains.at(j)); - - setDomain(m_domainIndex,axis); - } - + return m_axisDomainMap.value(axis); } -void ChartDataSet::handleTickChanged(QChartAxis* axis) +QChartAxis* ChartDataSet::axis(QSeries* series) const { - if(axis==axisX()) { - Domain domain = m_domainMap.value(axisY()); - QStringList labels = createLabels(axis,domain.m_minX,domain.m_maxX); - emit axisRangeChanged(axis,labels); - } - else { - Domain domain = m_domainMap.value(axis); - QStringList labels = createLabels(axis,domain.m_minY,domain.m_maxY); - emit axisRangeChanged(axis,labels); - } + return m_seriesAxisMap.value(series); } #include "moc_chartdataset_p.cpp" diff --git a/src/chartdataset_p.h b/src/chartdataset_p.h index f8e449b..1fdfe6d 100644 --- a/src/chartdataset_p.h +++ b/src/chartdataset_p.h @@ -19,38 +19,33 @@ public: void addSeries(QSeries* series,QChartAxis *axisY = 0); void removeSeries(QSeries* series); void removeAllSeries(); - void addDomain(const QRectF& rect, const QRectF& viewport); - bool nextDomain(); - bool previousDomain(); - void clearDomains(int toIndex =0); - const Domain domain(QChartAxis *axisY) const; - int domainIndex() const {return m_domainIndex;} - void setDomain(int index); - void setDomain(int index,QChartAxis* axis); + + void zoomInDomain(const QRectF& rect, const QSizeF& size); + void zoomOutDomain(const QRectF& rect, const QSizeF& size); + + Domain* domain(QSeries* series) const; + Domain* domain(QChartAxis* axis) const; + QChartAxis* axis(QSeries* series) const; QChartAxis* axisX() const { return m_axisX;}; QChartAxis* axisY(QSeries* series = 0) const; signals: - void seriesAdded(QSeries* series); + void seriesAdded(QSeries* series,Domain* domain); void seriesRemoved(QSeries* series); - void axisAdded(QChartAxis* axis); + void axisAdded(QChartAxis* axis,Domain* domain); void axisRemoved(QChartAxis* axis); - void axisRangeChanged(QChartAxis* axis, const QStringList& labels); - void seriesDomainChanged(QSeries* series,const Domain& domain); - -private slots: - void handleRangeChanged(QChartAxis*); - void handleTickChanged(QChartAxis*); private: QStringList createLabels(QChartAxis* axis,qreal min, qreal max); + void calculateDomain(QSeries* series,Domain* domain) const; private: - QMultiMap m_domainMap; - QMultiMap m_seriesMap; + QMap m_seriesAxisMap; + QMap m_axisDomainMap; QChartAxis* m_axisX; QChartAxis* m_axisY; + int m_domainIndex; bool m_axisXInitialized; }; diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index 903c44f..d8db236 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -31,13 +31,13 @@ ChartPresenter::ChartPresenter(QChart* chart,ChartDataSet* dataset):QObject(char m_chart(chart), m_dataset(dataset), m_chartTheme(0), + m_zoomIndex(0), m_marginSize(0), m_rect(QRectF(QPoint(0,0),m_chart->size())), - m_options(0) + m_options(QChart::NoAnimation) { createConnections(); setChartTheme(QChart::ChartThemeDefault); - } ChartPresenter::~ChartPresenter() @@ -47,12 +47,10 @@ ChartPresenter::~ChartPresenter() void ChartPresenter::createConnections() { QObject::connect(m_chart,SIGNAL(geometryChanged()),this,SLOT(handleGeometryChanged())); - QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*)),this,SLOT(handleSeriesAdded(QSeries*))); + QObject::connect(m_dataset,SIGNAL(seriesAdded(QSeries*,Domain*)),this,SLOT(handleSeriesAdded(QSeries*,Domain*))); QObject::connect(m_dataset,SIGNAL(seriesRemoved(QSeries*)),this,SLOT(handleSeriesRemoved(QSeries*))); - QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*)),this,SLOT(handleAxisAdded(QChartAxis*))); + QObject::connect(m_dataset,SIGNAL(axisAdded(QChartAxis*,Domain*)),this,SLOT(handleAxisAdded(QChartAxis*,Domain*))); QObject::connect(m_dataset,SIGNAL(axisRemoved(QChartAxis*)),this,SLOT(handleAxisRemoved(QChartAxis*))); - QObject::connect(m_dataset,SIGNAL(seriesDomainChanged(QSeries*,const Domain&)),this,SLOT(handleSeriesDomainChanged(QSeries*,const Domain&))); - QObject::connect(m_dataset,SIGNAL(axisRangeChanged(QChartAxis*,const QStringList&)),this,SLOT(handleAxisRangeChanged(QChartAxis*,const QStringList&))); } @@ -63,8 +61,26 @@ QRectF ChartPresenter::geometry() const void ChartPresenter::handleGeometryChanged() { - m_rect = QRectF(QPoint(0,0),m_chart->size()); - m_rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize); + QRectF rect(QPoint(0,0),m_chart->size()); + rect.adjust(m_marginSize,m_marginSize, -m_marginSize, -m_marginSize); + + //rewrite zoom stack + for(int i=0;iaxisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart); + item = new AxisItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart); }else{ - item = new AxisAnimationItem(axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart); + item = new AxisAnimationItem(axis,axis==m_dataset->axisX()?AxisItem::X_AXIS : AxisItem::Y_AXIS,m_chart); + } + if(axis==m_dataset->axisX()){ + QObject::connect(domain,SIGNAL(rangeXChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal))); + //initialize + item->handleRangeChanged(domain->minX(),domain->maxX()); + } + else{ + QObject::connect(domain,SIGNAL(rangeYChanged(qreal,qreal)),item,SLOT(handleRangeChanged(qreal,qreal))); + //initialize + item->handleRangeChanged(domain->minY(),domain->maxY()); } QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); - QObject::connect(axis,SIGNAL(update(QChartAxis*)),item,SLOT(handleAxisUpdate(QChartAxis*))); - - item->handleAxisUpdate(axis); + //initialize item->handleGeometryChanged(m_rect); m_chartTheme->decorate(axis,item); m_axisItems.insert(axis,item); @@ -108,7 +132,7 @@ void ChartPresenter::handleAxisRemoved(QChartAxis* axis) } -void ChartPresenter::handleSeriesAdded(QSeries* series) +void ChartPresenter::handleSeriesAdded(QSeries* series,Domain* domain) { switch(series->type()) { @@ -117,13 +141,18 @@ void ChartPresenter::handleSeriesAdded(QSeries* series) QLineSeries* lineSeries = static_cast(series); LineChartItem* item; if(m_options.testFlag(QChart::SeriesAnimations)){ - item = new LineChartAnimationItem(this,lineSeries,m_chart); + item = new LineChartAnimationItem(lineSeries,m_chart); }else{ - item = new LineChartItem(this,lineSeries,m_chart); + item = new LineChartItem(lineSeries,m_chart); } + QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); + QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); + //initialize + item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY()); + if(m_rect.isValid()) item->handleGeometryChanged(m_rect); + //decorate m_chartTheme->decorate(item,lineSeries,m_chartItems.count()); m_chartItems.insert(series,item); - if(m_rect.isValid()) item->handleGeometryChanged(m_rect); break; } @@ -132,14 +161,19 @@ void ChartPresenter::handleSeriesAdded(QSeries* series) QAreaSeries* areaSeries = static_cast(series); AreaChartItem* item; if(m_options.testFlag(QChart::SeriesAnimations)) { - item = new AreaChartItem(this,areaSeries,m_chart); + item = new AreaChartItem(areaSeries,m_chart); } else { - item = new AreaChartItem(this,areaSeries,m_chart); + item = new AreaChartItem(areaSeries,m_chart); } + QObject::connect(this,SIGNAL(geometryChanged(const QRectF&)),item,SLOT(handleGeometryChanged(const QRectF&))); + QObject::connect(domain,SIGNAL(domainChanged(qreal,qreal,qreal,qreal)),item,SLOT(handleDomainChanged(qreal,qreal,qreal,qreal))); + //initialize + item->handleDomainChanged(domain->minX(),domain->maxX(),domain->minY(),domain->maxY()); + if(m_rect.isValid()) item->handleGeometryChanged(m_rect); + //decorate m_chartTheme->decorate(item,areaSeries,m_chartItems.count()); m_chartItems.insert(series,item); - if(m_rect.isValid()) item->handleGeometryChanged(m_rect); break; } @@ -228,6 +262,8 @@ void ChartPresenter::handleSeriesAdded(QSeries* series) break; } } + + zoomReset(); } void ChartPresenter::handleSeriesRemoved(QSeries* series) @@ -236,16 +272,6 @@ void ChartPresenter::handleSeriesRemoved(QSeries* series) delete item; } -void ChartPresenter::handleSeriesDomainChanged(QSeries* series, const Domain& domain) -{ - m_chartItems.value(series)->handleDomainChanged(domain); -} - -void ChartPresenter::handleAxisRangeChanged(QChartAxis* axis,const QStringList& labels) -{ - m_axisItems.value(axis)->handleRangeChanged(axis,labels); -} - void ChartPresenter::setChartTheme(QChart::ChartTheme theme) { delete m_chartTheme; @@ -281,25 +307,52 @@ void ChartPresenter::setAnimationOptions(QChart::AnimationOptions options) m_options=options; //recreate elements - QList axisList = m_axisItems.uniqueKeys(); QList seriesList = m_chartItems.uniqueKeys(); foreach(QChartAxis* axis, axisList) { handleAxisRemoved(axis); - handleAxisAdded(axis); + handleAxisAdded(axis,m_dataset->domain(axis)); } foreach(QSeries* series, seriesList) { handleSeriesRemoved(series); - handleSeriesAdded(series); + handleSeriesAdded(series,m_dataset->domain(series)); } - - //now reintialize view data - //TODO: make it more nice - m_dataset->setDomain(m_dataset->domainIndex()); } } +void ChartPresenter::zoomIn() +{ + QRectF rect = geometry(); + rect.setWidth(rect.width()/2); + rect.setHeight(rect.height()/2); + rect.moveCenter(geometry().center()); + zoomIn(rect); +} + +void ChartPresenter::zoomIn(const QRectF& rect) +{ + QRectF r = rect.normalized(); + r.translate(-m_marginSize, -m_marginSize); + m_dataset->zoomInDomain(r,geometry().size()); + m_zoomStack<zoomOutDomain(m_zoomStack[m_zoomIndex-1],geometry().size()); + m_zoomIndex--; + m_zoomStack.resize(m_zoomIndex); +} + +void ChartPresenter::zoomReset() +{ + m_zoomIndex=0; + m_zoomStack.resize(m_zoomIndex); +} + QChart::AnimationOptions ChartPresenter::animationOptions() const { return m_options; diff --git a/src/chartpresenter_p.h b/src/chartpresenter_p.h index ef9bf81..3fcb629 100644 --- a/src/chartpresenter_p.h +++ b/src/chartpresenter_p.h @@ -43,26 +43,34 @@ public: void setAnimationOptions(QChart::AnimationOptions options); QChart::AnimationOptions animationOptions() const; + void zoomIn(); + void zoomIn(const QRectF& rect); + void zoomOut(); + void zoomReset(); + + private: void createConnections(); public slots: - void handleSeriesAdded(QSeries* series); + void handleSeriesAdded(QSeries* series,Domain* domain); void handleSeriesRemoved(QSeries* series); - void handleAxisAdded(QChartAxis* axis); + void handleAxisAdded(QChartAxis* axis,Domain* domain); void handleAxisRemoved(QChartAxis* axis); - void handleSeriesDomainChanged(QSeries* series, const Domain& domain); - void handleAxisRangeChanged(QChartAxis* axis, const QStringList& labels); void handleGeometryChanged(); + signals: void geometryChanged(const QRectF& rect); + private: - QMap m_chartItems; - QMap m_axisItems; QChart* m_chart; ChartDataSet* m_dataset; ChartTheme *m_chartTheme; + int m_zoomIndex; int m_marginSize; + QMap m_chartItems; + QMap m_axisItems; + QVector m_zoomStack; QRectF m_rect; QChart::AnimationOptions m_options; diff --git a/src/domain.cpp b/src/domain.cpp index 2516cbd..ccb5a65 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -2,11 +2,11 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -Domain::Domain(qreal minX, qreal maxX, qreal minY, qreal maxY): -m_minX(minX), -m_maxX(maxX), -m_minY(minY), -m_maxY(maxY) +Domain::Domain(QObject* parent):QObject(parent), +m_minX(0), +m_maxX(0), +m_minY(0), +m_maxY(0) { } @@ -14,16 +14,69 @@ Domain::~Domain() { } +void Domain::setRange(qreal minX, qreal maxX, qreal minY, qreal maxY) +{ + bool changed = false; + + if(m_minX!=minX || m_maxX!=maxX) + { + m_minX=minX; + m_maxX=maxX; + changed=true; + emit rangeXChanged(minX,maxX); + } + + if(m_minY!=minY || m_maxY!=maxY){ + m_minY=minY; + m_maxY=maxY; + changed=true; + emit rangeYChanged(minY,maxY); + } + + if(changed){ + emit domainChanged(m_minX, m_maxX, m_minY, m_maxY); + } +} +void Domain::setRangeX(qreal min, qreal max) +{ + setRange(min,max,m_minY, m_maxY); +} +void Domain::setRangeY(qreal min, qreal max) +{ + setRange(m_minX, m_maxX, min, max); +} + +void Domain::setMinX(qreal min) +{ + setRange(min, m_maxX, m_minY, m_maxY); +} + +void Domain::setMaxX(qreal max) +{ + setRange(m_minX, max, m_minY, m_maxY); +} + +void Domain::setMinY(qreal min) +{ + setRange(m_minX, m_maxX, min, m_maxY); +} + +void Domain::setMaxY(qreal max) +{ + setRange(m_minX, m_maxX, m_minY, max); + +} + qreal Domain::spanX() const { - Q_ASSERT(m_maxX >= m_minX); - return m_maxX - m_minX; + Q_ASSERT(m_maxX >= m_minX); + return m_maxX - m_minX; } qreal Domain::spanY() const { - Q_ASSERT(m_maxY >= m_minY); - return m_maxY - m_minY; + Q_ASSERT(m_maxY >= m_minY); + return m_maxY - m_minY; } bool Domain::isEmpty() const @@ -31,27 +84,52 @@ bool Domain::isEmpty() const return spanX()==0 || spanY()==0; } -Domain Domain::subDomain(const QRectF& rect, qreal maxWidth,qreal maxHeight) const +void Domain::zoomIn(const QRectF& rect, const QSizeF& size) { - Domain domain; + qreal dx = spanX() / size.width(); + qreal dy = spanY() / size.height(); - qreal dx = spanX() / maxWidth; - qreal dy = spanY() / maxHeight; + m_maxX = m_minX + dx * rect.right(); + m_minX = m_minX + dx * rect.left(); + m_minY = m_maxY - dy * rect.bottom(); + m_maxY = m_maxY - dy * rect.top(); + + emit domainChanged(m_minX, m_maxX, m_minY, m_maxY); + emit rangeXChanged(m_minX, m_maxX); + emit rangeYChanged(m_minY, m_maxY); +} + +void Domain::zoomOut(const QRectF& rect, const QSizeF& size) +{ + qreal dx = spanX() / rect.width(); + qreal dy = spanY() / rect.height(); - domain.m_minX = m_minX + dx * rect.left(); - domain.m_maxX = m_minX + dx * rect.right(); - domain.m_minY = m_maxY - dy * rect.bottom(); - domain.m_maxY = m_maxY - dy * rect.top(); + m_minX = m_maxX - dx * rect.right(); + m_maxX = m_minX + dx * size.width(); + m_maxY = m_minY + dy * rect.bottom(); + m_minY = m_maxY - dy * size.height(); - return domain; + emit domainChanged(m_minX, m_maxX, m_minY, m_maxY); + emit rangeXChanged(m_minX, m_maxX); + emit rangeYChanged(m_minY, m_maxY); +} + +void Domain::handleAxisRangeXChanged(qreal min,qreal max) +{ + setRangeX(min,max); +} + +void Domain::handleAxisRangeYChanged(qreal min,qreal max) +{ + setRangeY(min,max); } bool operator== (const Domain &domain1, const Domain &domain2) { return (domain1.m_maxX == domain2.m_maxX && - domain1.m_maxY == domain2.m_maxY && - domain1.m_minX == domain2.m_minX && - domain1.m_minY == domain2.m_minY); + domain1.m_maxY == domain2.m_maxY && + domain1.m_minX == domain2.m_minX && + domain1.m_minY == domain2.m_minY); } bool operator!= (const Domain &domain1, const Domain &domain2) @@ -59,11 +137,12 @@ bool operator!= (const Domain &domain1, const Domain &domain2) return !(domain1 == domain2); } - QDebug operator<<(QDebug dbg, const Domain &domain) { dbg.nospace() << "Domain("< +#include +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class Domain { +class Domain: public QObject { + Q_OBJECT public: - Domain(qreal minX=0, qreal maxX=0, qreal minY=0, qreal maxY=0); - virtual ~Domain(); - - qreal spanX() const; - qreal spanY() const; - bool isEmpty() const; - - friend bool operator== (const Domain &domain1, const Domain &domain2); - friend bool operator!= (const Domain &domain1, const Domain &domain2); - friend QDebug operator<<(QDebug dbg, const Domain &domain); - - Domain subDomain(const QRectF& rect, qreal maxWidth, qreal maxHeight) const; - -public: - qreal m_minX; - qreal m_maxX; - qreal m_minY; - qreal m_maxY; + explicit Domain(QObject* object=0); + virtual ~Domain(); + + void setRange(qreal minX, qreal maxX, qreal minY, qreal maxY); + void setRangeX(qreal min, qreal max); + void setRangeY(qreal min, qreal max); + void setMinX(qreal min); + void setMaxX(qreal max); + void setMinY(qreal min); + void setMaxY(qreal max); + + qreal minX() const {return m_minX;}; + qreal maxX() const {return m_maxX;}; + qreal minY() const {return m_minY;}; + qreal maxY() const {return m_maxY;}; + + qreal spanX() const; + qreal spanY() const; + bool isEmpty() const; + + friend bool operator== (const Domain &domain1, const Domain &domain2); + friend bool operator!= (const Domain &domain1, const Domain &domain2); + friend QDebug operator<<(QDebug dbg, const Domain &domain); + + void zoomIn(const QRectF& rect, const QSizeF& size); + void zoomOut(const QRectF& rect, const QSizeF& size); + +signals: + void domainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); + void rangeXChanged(qreal min, qreal max); + void rangeYChanged(qreal min, qreal max); + +public slots: + void handleAxisRangeXChanged(qreal min,qreal max); + void handleAxisRangeYChanged(qreal min,qreal max); + +private: + qreal m_minX; + qreal m_maxX; + qreal m_minY; + qreal m_maxY; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/linechart/linechartanimationitem.cpp b/src/linechart/linechartanimationitem.cpp index 0f67dc5..f980422 100644 --- a/src/linechart/linechartanimationitem.cpp +++ b/src/linechart/linechartanimationitem.cpp @@ -9,8 +9,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE const static int duration = 500; -LineChartAnimationItem::LineChartAnimationItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent): -LineChartItem(presenter,series,parent), +LineChartAnimationItem::LineChartAnimationItem(QLineSeries* series,QGraphicsItem *parent): +LineChartItem(series,parent), m_animation(new LineChartAnimatator(this,this)), m_dirty(false) { diff --git a/src/linechart/linechartanimationitem_p.h b/src/linechart/linechartanimationitem_p.h index 188f5c3..62d7d9f 100644 --- a/src/linechart/linechartanimationitem_p.h +++ b/src/linechart/linechartanimationitem_p.h @@ -15,7 +15,7 @@ class LineChartAnimationItem : public LineChartItem { Q_OBJECT public: - LineChartAnimationItem(ChartPresenter* presenter, QLineSeries *series, QGraphicsItem *parent = 0); + LineChartAnimationItem(QLineSeries *series, QGraphicsItem *parent = 0); virtual ~LineChartAnimationItem(); protected: diff --git a/src/linechart/linechartitem.cpp b/src/linechart/linechartitem.cpp index 16fa31d..ea10997 100644 --- a/src/linechart/linechartitem.cpp +++ b/src/linechart/linechartitem.cpp @@ -8,19 +8,23 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE //TODO: optimize : remove points which are not visible -LineChartItem::LineChartItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent):ChartItem(parent), -m_presenter(presenter), +LineChartItem::LineChartItem(QLineSeries* series,QGraphicsItem *parent):ChartItem(parent), +m_minX(0), +m_maxX(0), +m_minY(0), +m_maxY(0), m_series(series), m_items(this) { //m_items.setZValue(ChartPresenter::LineChartZValue); setZValue(ChartPresenter::LineChartZValue); - QObject::connect(presenter,SIGNAL(geometryChanged(const QRectF&)),this,SLOT(handleGeometryChanged(const QRectF&))); QObject::connect(series,SIGNAL(pointReplaced(int)),this,SLOT(handlePointReplaced(int))); QObject::connect(series,SIGNAL(pointAdded(int)),this,SLOT(handlePointAdded(int))); QObject::connect(series,SIGNAL(pointRemoved(int)),this,SLOT(handlePointRemoved(int))); QObject::connect(series,SIGNAL(updated()),this,SLOT(handleUpdated())); + + handleUpdated(); } QRectF LineChartItem::boundingRect() const @@ -52,23 +56,23 @@ void LineChartItem::clearPoints(int count) QPointF LineChartItem::calculateGeometryPoint(int index) const { - const qreal deltaX = m_size.width()/m_domain.spanX(); - const qreal deltaY = m_size.height()/m_domain.spanY(); - qreal x = (m_series->x(index) - m_domain.m_minX)* deltaX; - qreal y = (m_series->y(index) - m_domain.m_minY)*-deltaY + m_size.height(); + const qreal deltaX = m_size.width()/(m_maxX-m_minX); + const qreal deltaY = m_size.height()/(m_maxY-m_minY); + qreal x = (m_series->x(index) - m_minX)* deltaX; + qreal y = (m_series->y(index) - m_minY)*-deltaY + m_size.height(); return QPointF(x,y); } QVector LineChartItem::calculateGeometryPoints() const { - const qreal deltaX = m_size.width()/m_domain.spanX(); - const qreal deltaY = m_size.height()/m_domain.spanY(); + const qreal deltaX = m_size.width()/(m_maxX-m_minX); + const qreal deltaY = m_size.height()/(m_maxY-m_minY); QVector points; points.reserve(m_series->count()); for (int i = 0; i < m_series->count(); ++i) { - qreal x = (m_series->x(i) - m_domain.m_minX)* deltaX; - qreal y = (m_series->y(i) - m_domain.m_minY)*-deltaY + m_size.height(); + qreal x = (m_series->x(i) - m_minX)* deltaX; + qreal y = (m_series->y(i) - m_minY)*-deltaY + m_size.height(); points << QPointF(x,y); } return points; @@ -97,13 +101,21 @@ void LineChartItem::applyGeometry(QVector& points) path.moveTo(point); QGraphicsItem* item = items.at(0); item->setPos(point.x()-1,point.y()-1); - if(!m_clipRect.contains(point)) item->setVisible(false); + if(!m_clipRect.contains(point)) { + item->setVisible(false); + }else{ + item->setVisible(true); + } for(int i=1 ; i< points.size();i++) { QGraphicsItem* item = items.at(i); const QPointF& point = points.at(i); item->setPos(point.x()-1,point.y()-1); - if(!m_clipRect.contains(point)) item->setVisible(false); + if(!m_clipRect.contains(point)) { + item->setVisible(false); + }else{ + item->setVisible(true); + } path.lineTo(point); } @@ -152,12 +164,14 @@ void LineChartItem::handlePointReplaced(int index) update(); } -void LineChartItem::handleDomainChanged(const Domain& domain) +void LineChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY) { + m_minX=minX; + m_maxX=maxX; + m_minY=minY; + m_maxY=maxY; - m_domain = domain; - - if(m_domain.isEmpty()) return; + if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return; if(!m_clipRect.isValid()) return; QVector points = calculateGeometryPoints(); @@ -168,7 +182,7 @@ void LineChartItem::handleDomainChanged(const Domain& domain) clearPoints(diff); } else if(diff<0) { - createPoints(-diff); + createPoints(-diff); } updateItem(m_points,points); @@ -182,7 +196,7 @@ void LineChartItem::handleGeometryChanged(const QRectF& rect) m_clipRect=rect.translated(-rect.topLeft()); setPos(rect.topLeft()); - if(m_domain.isEmpty()) return; + if( (m_maxX - m_minX) == 0|| (m_maxY - m_minY) == 0) return; QVector points = calculateGeometryPoints(); diff --git a/src/linechart/linechartitem_p.h b/src/linechart/linechartitem_p.h index e751c90..0579461 100644 --- a/src/linechart/linechartitem_p.h +++ b/src/linechart/linechartitem_p.h @@ -14,7 +14,7 @@ class LineChartItem : public QObject , public ChartItem { Q_OBJECT public: - LineChartItem(ChartPresenter* presenter, QLineSeries* series,QGraphicsItem *parent = 0); + LineChartItem(QLineSeries* series,QGraphicsItem *parent = 0); ~ LineChartItem(){}; //from QGraphicsItem @@ -30,7 +30,7 @@ public slots: void handlePointRemoved(int index); void handlePointReplaced(int index); void handleUpdated(); - void handleDomainChanged(const Domain& domain); + void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); void handleGeometryChanged(const QRectF& size); public: @@ -43,13 +43,15 @@ public: QVector calculateGeometryPoints() const; protected: + qreal m_minX; + qreal m_maxX; + qreal m_minY; + qreal m_maxY; QPainterPath m_path; QRectF m_rect; QLineSeries* m_series; - ChartPresenter* m_presenter; - QSizeF m_size; + QSizeF m_size; QRectF m_clipRect; - Domain m_domain; QGraphicsItemGroup m_items; QVector m_points; QPen m_pen; diff --git a/src/linechart/qlineseries.h b/src/linechart/qlineseries.h index 009cdf9..e51fc18 100644 --- a/src/linechart/qlineseries.h +++ b/src/linechart/qlineseries.h @@ -11,47 +11,48 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QTCOMMERCIALCHART_EXPORT QLineSeries : public QSeries { - Q_OBJECT - public: - QLineSeries(QObject* parent=0); - virtual ~QLineSeries(); - - public: // from QChartSeries - virtual QSeriesType type() const { return QSeries::SeriesTypeLine;} - void add(qreal x, qreal y); - void add(const QPointF& point); - void replace(qreal x,qreal y); - void replace(const QPointF& point); - void remove(qreal x); - void remove(const QPointF& point); - void clear(); - - void setPen(const QPen& pen); - QPen pen() const { return m_pen;} - - void setPointsVisible(bool visible); - bool pointsVisible() const {return m_pointsVisible;} - - int count() const; - qreal x(int pos) const; - qreal y(int pos) const; - - QLineSeries& operator << (const QPointF &point); - friend QDebug operator<< (QDebug d, const QLineSeries series); - - signals: - void pointReplaced(int index); - void pointRemoved(int index); - void pointAdded(int index); - void updated(); - - protected: - QVector m_x; - QVector m_y; - - private: - QPen m_pen; - bool m_pointsVisible; + Q_OBJECT +public: + QLineSeries(QObject* parent=0); + virtual ~QLineSeries(); + +public: // from QChartSeries + virtual QSeriesType type() const {return QSeries::SeriesTypeLine;} + void add(qreal x, qreal y); + void add(const QPointF& point); + void replace(qreal x,qreal y); + void replace(const QPointF& point); + void remove(qreal x); + void remove(const QPointF& point); + void clear(); + + void setPen(const QPen& pen); + QPen pen() const {return m_pen;} + + void setPointsVisible(bool visible); + bool pointsVisible() const {return m_pointsVisible;} + + int count() const; + qreal x(int pos) const; + qreal y(int pos) const; + + QLineSeries& operator << (const QPointF &point); + friend QDebug operator<< (QDebug d, const QLineSeries series); + +signals: + void updated(); + void pointReplaced(int index); + void pointRemoved(int index); + void pointAdded(int index); + + +protected: + QVector m_x; + QVector m_y; + +private: + QPen m_pen; + bool m_pointsVisible; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qchart.cpp b/src/qchart.cpp index f2a3586..612fa3d 100644 --- a/src/qchart.cpp +++ b/src/qchart.cpp @@ -187,13 +187,7 @@ QChart::ChartTheme QChart::chartTheme() const */ void QChart::zoomIn() { - if (!m_dataset->nextDomain()) { - QRectF rect = m_presenter->geometry(); - rect.setWidth(rect.width()/2); - rect.setHeight(rect.height()/2); - rect.moveCenter(m_presenter->geometry().center()); - zoomIn(rect); - } + m_presenter->zoomIn(); } /*! @@ -201,11 +195,9 @@ void QChart::zoomIn() */ void QChart::zoomIn(const QRectF& rect) { + if(!rect.isValid()) return; - QRectF r = rect.normalized(); - int margin = m_presenter->margin(); - r.translate(-margin, -margin); - m_dataset->addDomain(r,m_presenter->geometry()); + m_presenter->zoomIn(rect); } /*! @@ -213,7 +205,7 @@ void QChart::zoomIn(const QRectF& rect) */ void QChart::zoomOut() { - m_dataset->previousDomain(); + m_presenter->zoomOut(); } /*! @@ -221,7 +213,7 @@ void QChart::zoomOut() */ void QChart::zoomReset() { - m_dataset->clearDomains(); + m_presenter->zoomReset(); } /*! diff --git a/src/qchartaxis.cpp b/src/qchartaxis.cpp index 72b399f..8a2fb9b 100644 --- a/src/qchartaxis.cpp +++ b/src/qchartaxis.cpp @@ -113,29 +113,25 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE \fn void QChartAxis::maxChanged(qreal max) \brief Axis emits signal when \a max of axis has changed. */ -/*! - \fn int QChartAxis::ticksCount() const - \brief Return number of ticks on the axis - \sa setTicksCount() -*/ /*! - \fn void QChartAxis::update(QChartAxis*) - \brief \internal + \fn void QChartAxis::rangeChanged(qreal min, qreal max) + \brief Axis emits signal when \a min or \a max of axis has changed. */ /*! - \fn void QChartAxis::ticksChanged(QChartAxis*) - \brief \internal + \fn int QChartAxis::ticksCount() const + \brief Return number of ticks on the axis + \sa setTicksCount() */ /*! - \fn void QChartAxis::rangeChanged(QChartAxis*) + \fn void QChartAxis::update() \brief \internal */ /*! - \fn void QChartAxis::updateRange(qreal min, qreal max) + \fn void QChartAxis::handleAxisRangeChanged(qreal min, qreal max) \brief \internal \a min \a max */ @@ -171,8 +167,10 @@ QChartAxis::~QChartAxis() */ void QChartAxis::setAxisPen(const QPen& pen) { + if (pen != m_axisPen) { m_axisPen=pen; - emit update(this); + emit updated(); + } } /*! @@ -180,8 +178,10 @@ void QChartAxis::setAxisPen(const QPen& pen) */ void QChartAxis::setAxisVisible(bool visible) { + if (m_axisVisible!=visible) { m_axisVisible=visible; - emit update(this); + emit updated(); + } } /*! @@ -189,8 +189,10 @@ void QChartAxis::setAxisVisible(bool visible) */ void QChartAxis::setGridVisible(bool visible) { + if (m_gridVisible!=visible) { m_gridVisible=visible; - emit update(this); + emit updated(); + } } /*! @@ -198,8 +200,10 @@ void QChartAxis::setGridVisible(bool visible) */ void QChartAxis::setGridPen(const QPen& pen) { + if (m_gridPen!=pen) { m_gridPen=pen; - emit update(this); + emit updated(); + } } /*! @@ -207,8 +211,10 @@ void QChartAxis::setGridPen(const QPen& pen) */ void QChartAxis::setLabelsVisible(bool visible) { + if(m_labelsVisible!=visible) { m_labelsVisible=visible; - emit update(this); + emit updated(); + } } /*! @@ -216,8 +222,10 @@ void QChartAxis::setLabelsVisible(bool visible) */ void QChartAxis::setLabelsPen(const QPen& pen) { + if(m_labelsPen!=pen) { m_labelsPen=pen; - emit update(this); + emit updated(); + } } /*! @@ -225,8 +233,10 @@ void QChartAxis::setLabelsPen(const QPen& pen) */ void QChartAxis::setLabelsBrush(const QBrush& brush) { + if(m_labelsBrush!=brush) { m_labelsBrush=brush; - emit update(this); + emit updated(); + } } /*! @@ -234,8 +244,10 @@ void QChartAxis::setLabelsBrush(const QBrush& brush) */ void QChartAxis::setLabelsFont(const QFont& font) { + if(m_labelsFont!=font) { m_labelsFont=font; - emit update(this); + emit updated(); + } } /*! @@ -243,8 +255,10 @@ void QChartAxis::setLabelsFont(const QFont& font) */ void QChartAxis::setLabelsAngle(int angle) { + if(m_labelsAngle!=angle) { m_labelsAngle=angle; - emit update(this); + emit updated(); + } } /*! @@ -252,8 +266,10 @@ void QChartAxis::setLabelsAngle(int angle) */ void QChartAxis::setShadesVisible(bool visible) { + if(m_shadesVisible!=visible) { m_shadesVisible=visible; - emit update(this); + emit updated(); + } } /*! @@ -261,8 +277,10 @@ void QChartAxis::setShadesVisible(bool visible) */ void QChartAxis::setShadesPen(const QPen& pen) { - m_shadesPen=pen; - emit update(this); + if(m_shadesPen!=pen) { + m_shadesPen=pen; + emit updated(); + } } /*! @@ -270,8 +288,10 @@ void QChartAxis::setShadesPen(const QPen& pen) */ void QChartAxis::setShadesBrush(const QBrush& brush) { + if(m_shadesBrush!=brush) { m_shadesBrush=brush; - emit update(this); + emit updated(); + } } /*! @@ -279,8 +299,10 @@ void QChartAxis::setShadesBrush(const QBrush& brush) */ void QChartAxis::setShadesOpacity(qreal opacity) { + if(m_shadesOpacity!=opacity) { m_shadesOpacity=opacity; - emit update(this); + emit updated(); + } } /*! @@ -288,10 +310,7 @@ void QChartAxis::setShadesOpacity(qreal opacity) */ void QChartAxis::setMin(qreal min) { - if(m_min!=min) { - m_min=min; - emit rangeChanged(this); - } + setRange(min,m_max); } /*! @@ -299,10 +318,7 @@ void QChartAxis::setMin(qreal min) */ void QChartAxis::setMax(qreal max) { - if(m_max!=max) { - m_max=max; - emit rangeChanged(this); - } + setRange(m_min,max); } /*! @@ -310,22 +326,23 @@ void QChartAxis::setMax(qreal max) */ void QChartAxis::setRange(qreal min, qreal max) { - setMin(min); - setMax(max); -} + bool changed = false; + if(m_min!=min) { + m_min=min; + emit minChanged(min); + } -void QChartAxis::updateRange(qreal min, qreal max) -{ - if(m_max!=max){ + if(m_max!=max) { + m_max=max; emit maxChanged(max); } - if(m_min!=min){ - emit minChanged(min); - } + if(changed) emit rangeChanged(m_min,m_max); +} - m_max=max; - m_min=min; +void QChartAxis::handleAxisRangeChanged(qreal min, qreal max) +{ + setRange(min,max); } /*! @@ -333,8 +350,10 @@ void QChartAxis::updateRange(qreal min, qreal max) */ void QChartAxis::setTicksCount(int count) { + if(m_ticksCount!=count) { m_ticksCount=count; - emit ticksChanged(this); + emit updated(); + } } /*! @@ -343,7 +362,7 @@ void QChartAxis::setTicksCount(int count) void QChartAxis::addAxisTickLabel(qreal value,const QString& label) { m_ticks.insert(value,label); - emit ticksChanged(this); + emit updated(); } /*! @@ -352,7 +371,7 @@ void QChartAxis::addAxisTickLabel(qreal value,const QString& label) void QChartAxis::removeAxisTickLabel(qreal value) { m_ticks.remove(value); - emit ticksChanged(this); + emit updated(); } /*! @@ -369,7 +388,7 @@ QString QChartAxis::axisTickLabel(qreal value) const void QChartAxis::clearAxisTickLabels() { m_ticks.clear(); - emit ticksChanged(this); + emit updated(); } #include "moc_qchartaxis.cpp" diff --git a/src/qchartaxis.h b/src/qchartaxis.h index 85e259c..b7f9d2d 100644 --- a/src/qchartaxis.h +++ b/src/qchartaxis.h @@ -64,16 +64,17 @@ public: QString axisTickLabel(qreal value) const ; void clearAxisTickLabels(); - //internal - void updateRange(qreal min, qreal max); - signals: void minChanged(qreal min); void maxChanged(qreal max); -//private signal - void update(QChartAxis*); - void rangeChanged(QChartAxis*); - void ticksChanged(QChartAxis*); + void rangeChanged(qreal min, qreal max); + +//intral signal + void updated(); + +//internal slot +public slots: + void handleAxisRangeChanged(qreal min, qreal max); private: bool m_axisVisible; diff --git a/src/scatterseries/scatterpresenter.cpp b/src/scatterseries/scatterpresenter.cpp index 1d61b15..f190417 100644 --- a/src/scatterseries/scatterpresenter.cpp +++ b/src/scatterseries/scatterpresenter.cpp @@ -13,9 +13,12 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *parent) : ChartItem(parent), + m_minX(0), + m_maxX(0), + m_minY(0), + m_maxY(0), m_series(series), - m_boundingRect(), - m_visibleChartArea() + m_boundingRect() { if (parent) m_boundingRect = parent->boundingRect(); @@ -33,9 +36,12 @@ ScatterPresenter::ScatterPresenter(QScatterSeries *series, QGraphicsObject *pare // setGraphicsEffect(dropShadow); } -void ScatterPresenter::handleDomainChanged(const Domain& domain) +void ScatterPresenter::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY) { - m_visibleChartArea = domain; + m_minX=minX; + m_maxX=maxX; + m_minY=minY; + m_maxY=maxY; changeGeometry(); } @@ -98,8 +104,8 @@ void ScatterPresenter::mousePressEvent(QGraphicsSceneMouseEvent *event) void ScatterPresenter::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { QPointF clickedPoint( - m_visibleChartArea.m_minX + (event->lastPos().x() / m_boundingRect.width()) * m_visibleChartArea.spanX(), - m_visibleChartArea.m_maxY - (event->lastPos().y() / m_boundingRect.height()) * m_visibleChartArea.spanY()); + m_minX + (event->lastPos().x() / m_boundingRect.width()) * (m_maxX-m_minX), + m_maxY - (event->lastPos().y() / m_boundingRect.height()) * (m_maxY-m_minY)); emit clicked(clickedPoint); } @@ -107,8 +113,8 @@ void ScatterPresenter::changeGeometry() { if (m_boundingRect.isValid()) { prepareGeometryChange(); - qreal scalex = m_boundingRect.width() / m_visibleChartArea.spanX(); - qreal scaley = m_boundingRect.height() / m_visibleChartArea.spanY(); + qreal scalex = m_boundingRect.width() / (m_maxX-m_minX); + qreal scaley = m_boundingRect.height() / (m_maxY-m_minY); int shape = m_series->shape(); m_path = QPainterPath(); @@ -117,8 +123,8 @@ void ScatterPresenter::changeGeometry() foreach (QPointF point, m_series->data()) { // Convert relative coordinates to absolute pixel coordinates that can be used for drawing - qreal x = point.x() * scalex - m_visibleChartArea.m_minX * scalex - size / 2; - qreal y = m_boundingRect.height() - point.y() * scaley + m_visibleChartArea.m_minY * scaley - size / 2; + qreal x = point.x() * scalex - m_minX * scalex - size / 2; + qreal y = m_boundingRect.height() - point.y() * scaley + m_minY * scaley - size / 2; if (x < scene()->width() && y < scene()->height()) { switch (shape) { diff --git a/src/scatterseries/scatterpresenter_p.h b/src/scatterseries/scatterpresenter_p.h index 5cd9943..ebd4bfa 100644 --- a/src/scatterseries/scatterpresenter_p.h +++ b/src/scatterseries/scatterpresenter_p.h @@ -27,19 +27,23 @@ Q_SIGNALS: void clicked(QPointF coordinates); public Q_SLOTS: - void handleDomainChanged(const Domain& domain); + void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); void handleGeometryChanged(const QRectF& rect); void handleModelChanged(); public: void changeGeometry(); + qreal m_minX; + qreal m_maxX; + qreal m_minY; + qreal m_maxY; QScatterSeries *m_series; QRectF m_boundingRect; - Domain m_visibleChartArea; QPen m_markerPen; QBrush m_markerBrush; QPainterPath m_path; + }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/splinechart/splinepresenter.cpp b/src/splinechart/splinepresenter.cpp index 259db42..96db4bc 100644 --- a/src/splinechart/splinepresenter.cpp +++ b/src/splinechart/splinepresenter.cpp @@ -4,7 +4,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE SplinePresenter::SplinePresenter(QSplineSeries* series, QGraphicsObject *parent) : - LineChartItem(0, series, parent)//,m_boundingRect() + LineChartItem(series, parent)//,m_boundingRect() { // } @@ -14,10 +14,10 @@ SplinePresenter::SplinePresenter(QSplineSeries* series, QGraphicsObject *parent) QPointF SplinePresenter::calculateGeometryControlPoint(int index) const { QSplineSeries* splineSeries = qobject_cast(m_series); - const qreal deltaX = m_size.width()/m_domain.spanX(); - const qreal deltaY = m_size.height()/m_domain.spanY(); - qreal x = (splineSeries->controlPoint(index).x() - m_domain.m_minX)* deltaX; - qreal y = (splineSeries->controlPoint(index).y() - m_domain.m_minY)*-deltaY + m_size.height(); + const qreal deltaX = m_size.width()/(m_maxX-m_minX); + const qreal deltaY = m_size.height()/(m_maxY-m_minY); + qreal x = (splineSeries->controlPoint(index).x() - m_minX)* deltaX; + qreal y = (splineSeries->controlPoint(index).y() - m_minY)*-deltaY + m_size.height(); return QPointF(x,y); } diff --git a/test/auto/auto.pro b/test/auto/auto.pro index 150ae74..b1255f8 100644 --- a/test/auto/auto.pro +++ b/test/auto/auto.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS += chartdataset \ No newline at end of file +SUBDIRS += chartdataset domain \ No newline at end of file diff --git a/test/auto/chartdataset/tst_chartdataset.cpp b/test/auto/chartdataset/tst_chartdataset.cpp index 66543a7..c391ed5 100644 --- a/test/auto/chartdataset/tst_chartdataset.cpp +++ b/test/auto/chartdataset/tst_chartdataset.cpp @@ -6,7 +6,7 @@ QTCOMMERCIALCHART_USE_NAMESPACE -Q_DECLARE_METATYPE(Domain) +Q_DECLARE_METATYPE(Domain*) Q_DECLARE_METATYPE(QChartAxis*) Q_DECLARE_METATYPE(QSeries*) Q_DECLARE_METATYPE(QLineSeries*) @@ -24,27 +24,20 @@ private slots: void chartdataset_data(); void chartdataset(); - void addDomain_data(); - void addDomain(); void addSeries_data(); void addSeries(); - void axisY_data(); - void axisY(); - void clearDomains_data(); - void clearDomains(); - void domain_data(); - void domain(); - void nextpreviousDomain_data(); - void nextpreviousDomain(); void removeSeries_data(); void removeSeries(); void removeAllSeries_data(); void removeAllSeries(); + void axisY_data(); + void axisY(); + }; void tst_ChartDataSet::initTestCase() { - qRegisterMetaType("Domain"); + qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); } @@ -73,542 +66,212 @@ void tst_ChartDataSet::chartdataset() //check if not dangling pointer dataSet.axisX()->objectName(); dataSet.axisY()->objectName(); - QVERIFY(dataSet.domain(dataSet.axisX())==Domain()); - QVERIFY(dataSet.domain(dataSet.axisY())==Domain()); - QCOMPARE(dataSet.domainIndex(), 0); -} - -void tst_ChartDataSet::addDomain_data() -{ - QTest::addColumn("rect"); - QTest::addColumn("viewport"); - QTest::newRow("400x400,1000x1000") << QRectF(200, 200, 600, 600) - << QRectF(0, 0, 1000, 1000); - QTest::newRow("600x600,1000x1000") << QRectF(100, 100, 700, 700) - << QRectF(0, 0, 1000, 1000); - QTest::newRow("200x200,1000x1000") << QRectF(400, 400, 600, 600) - << QRectF(0, 0, 1000, 1000); -} - -void tst_ChartDataSet::addDomain() -{ - QFETCH(QRectF, rect); - QFETCH(QRectF, viewport); - - ChartDataSet dataSet; - - Domain domain1(0, 1000, 0, 1000); - QLineSeries series; - series.add(0, 0); - series.add(1000, 1000); - - dataSet.addSeries(&series); - - QCOMPARE(dataSet.domainIndex(), 0); - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, - SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, - SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - Domain domain2 = dataSet.domain(dataSet.axisY()); - QVERIFY(domain1 == domain2); - - dataSet.addDomain(rect, viewport); - QCOMPARE(dataSet.domainIndex(), 1); - Domain domain3 = dataSet.domain(dataSet.axisY()); - Domain domain4 = domain1.subDomain(rect, viewport.width(), - viewport.height()); - QVERIFY(domain3 == domain4); - - QCOMPARE(spy0.count(), 0); - QCOMPARE(spy1.count(), 2); - QCOMPARE(spy2.count(), 0); - QCOMPARE(spy3.count(), 0); - QCOMPARE(spy4.count(), 1); - QCOMPARE(spy5.count(), 0); } void tst_ChartDataSet::addSeries_data() { - QTest::addColumn("defaultAxisCount"); - QTest::addColumn("firstAxisCount"); - QTest::addColumn("secoundAxisCount"); - QTest::newRow("2 ,1 ,0") << 2 << 1 << 0; - QTest::newRow("2 series, 2 new axis") << 2 << 0 << 2; - QTest::newRow("2 series, 1 new axis") << 2 << 0 << 2; - QTest::newRow("3 series, 3 new axis") << 3 << 0 << 3; - QTest::newRow("3 series, 2 new axis") << 3 << 0 << 2; - QTest::newRow("3 series, 1 new axis") << 3 << 0 << 1; - QTest::newRow("3 series, default + 1 new axis") << 3 << 0 << 1; + QTest::addColumn("series0"); + QTest::addColumn("axis0"); + QTest::addColumn("series1"); + QTest::addColumn("axis1"); + QTest::addColumn("series2"); + QTest::addColumn("axis2"); + QTest::addColumn("axisCount"); + + QLineSeries* series0 = new QLineSeries(this); + QLineSeries* series1 = new QLineSeries(this); + QLineSeries* series2 = new QLineSeries(this); + + QChartAxis* axis0 = new QChartAxis(this); + QChartAxis* axis1 = new QChartAxis(this); + QChartAxis* axis2 = new QChartAxis(this); + + QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*)0 << series1 << (QChartAxis*)0 << series2 << (QChartAxis*)0 << 2; + QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*)0 << series1 << axis0 << series2 << axis0 << 3; + QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1 << axis1 << series2 << axis2 << 4; } void tst_ChartDataSet::addSeries() { - QFETCH(int, defaultAxisCount); - QFETCH(int, firstAxisCount); - QFETCH(int, secoundAxisCount); + QFETCH(QLineSeries*, series0); + QFETCH(QChartAxis*, axis0); + QFETCH(QLineSeries*, series1); + QFETCH(QChartAxis*, axis1); + QFETCH(QLineSeries*, series2); + QFETCH(QChartAxis*, axis2); + QFETCH(int, axisCount); ChartDataSet dataSet; - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - for (int i = 0; i < defaultAxisCount; i++) { - QLineSeries* series = new QLineSeries(); - dataSet.addSeries(series); - } - - QChartAxis* firstAxis = new QChartAxis(); + QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*))); + QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); + QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); + QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - for (int i = 0; i < firstAxisCount; i++) { - QLineSeries* series = new QLineSeries(); - dataSet.addSeries(series, firstAxis); - } - - QChartAxis* secoundAxis = new QChartAxis(); - - for (int i = 0; i < secoundAxisCount; i++) { - QLineSeries* series = new QLineSeries(); - dataSet.addSeries(series, secoundAxis); - } - - int axisCount = 1; - - if (defaultAxisCount > 0) - axisCount++; - if (firstAxisCount > 0) - axisCount++; - if (secoundAxisCount > 0) - axisCount++; + dataSet.addSeries(series0,axis0); + dataSet.addSeries(series1,axis1); + dataSet.addSeries(series2,axis2); QCOMPARE(spy0.count(), axisCount); - QCOMPARE(spy1.count(), (defaultAxisCount + firstAxisCount + secoundAxisCount)*2); - QCOMPARE(spy2.count(), 0); - QCOMPARE(spy3.count(), defaultAxisCount + firstAxisCount + secoundAxisCount); - - int i = 0; - while (defaultAxisCount) { - i+=defaultAxisCount; - defaultAxisCount--; - } - int j = 0; - while (firstAxisCount>0) { - j += firstAxisCount; - firstAxisCount--; - } - int k = 0; - while (secoundAxisCount>0) { - k += secoundAxisCount; - secoundAxisCount--; - } - QCOMPARE(spy4.count(),i + j + k); - QCOMPARE(spy5.count(), 0); - - QCOMPARE(dataSet.domainIndex(), 0); -} - -void tst_ChartDataSet::axisY_data() -{ - QTest::addColumn("axisY"); - QTest::newRow("axisY1") << new QChartAxis(); - QTest::newRow("axisY2") << new QChartAxis(); -} - -void tst_ChartDataSet::axisY() -{ - QFETCH(QChartAxis*, axisY); - - ChartDataSet dataSet; - - QChartAxis* defaultAxisY = dataSet.axisY(); - - QVERIFY2(defaultAxisY, "Missing axisY."); - - QLineSeries* series1 = new QLineSeries(); - dataSet.addSeries(series1); - - QLineSeries* series2 = new QLineSeries(); - dataSet.addSeries(series2, axisY); - - QVERIFY(dataSet.axisY(series1) == defaultAxisY); - QVERIFY(dataSet.axisY(series2) == axisY); - + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 3); + QCOMPARE(spy3.count(), 0); } -void tst_ChartDataSet::clearDomains_data() +void tst_ChartDataSet::removeSeries_data() { - QTest::addColumn("indexCount"); - QTest::newRow("0") << 0; - QTest::newRow("1") << 1; - QTest::newRow("5") << 2; - QTest::newRow("8") << 3; + QTest::addColumn("series0"); + QTest::addColumn("axis0"); + QTest::addColumn("series1"); + QTest::addColumn("axis1"); + QTest::addColumn("series2"); + QTest::addColumn("axis2"); + QTest::addColumn("axisCount"); + + QLineSeries* series0 = new QLineSeries(this); + QLineSeries* series1 = new QLineSeries(this); + QLineSeries* series2 = new QLineSeries(this); + + QChartAxis* axis0 = new QChartAxis(this); + QChartAxis* axis1 = new QChartAxis(this); + QChartAxis* axis2 = new QChartAxis(this); + + QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*) 0 + << series1 << (QChartAxis*) 0 << series2 << (QChartAxis*) 0 << 2; + QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*) 0 + << series1 << axis0 << series2 << axis0 << 3; + QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1 + << axis1 << series2 << axis2 << 4; } -void tst_ChartDataSet::clearDomains() +void tst_ChartDataSet::removeSeries() { - QFETCH(int, indexCount); - - Domain domain1(0, 100, 0, 100); - QLineSeries* series = new QLineSeries(); - series->add(0, 0); - series->add(100, 100); + QFETCH(QLineSeries*, series0); + QFETCH(QChartAxis*, axis0); + QFETCH(QLineSeries*, series1); + QFETCH(QChartAxis*, axis1); + QFETCH(QLineSeries*, series2); + QFETCH(QChartAxis*, axis2); + QFETCH(int, axisCount); - ChartDataSet dataSet; - - QCOMPARE(dataSet.domainIndex(), 0); - - dataSet.addSeries(series); - - Domain domain2 = dataSet.domain(dataSet.axisY()); - - QVERIFY(domain2 == domain1); - - QList domains; - - domains << domain1; - - for (int i = 0; i < indexCount; i++) { - dataSet.addDomain(QRect(0, 0, 10, 10), QRect(0, 0, 100, 100)); - domains << dataSet.domain(dataSet.axisY()); - } - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, - SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, - SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - dataSet.clearDomains(indexCount); + ChartDataSet dataSet; - QCOMPARE(dataSet.domainIndex(), indexCount); + dataSet.addSeries(series0,axis0); + dataSet.addSeries(series1,axis1); + dataSet.addSeries(series2,axis2); - domain2 = dataSet.domain(dataSet.axisY()); + QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*))); + QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); + QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); + QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - QVERIFY(domain2 == domains.at(indexCount)); + dataSet.removeSeries(series0); + dataSet.removeSeries(series1); + dataSet.removeSeries(series2); - QCOMPARE(spy0.count(), 0); - QCOMPARE(spy1.count(), 0); - QCOMPARE(spy2.count(), 0); - QCOMPARE(spy3.count(), 0); - QCOMPARE(spy4.count(), 0); - QCOMPARE(spy5.count(), 0); + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), axisCount); + QCOMPARE(spy2.count(), 0); + QCOMPARE(spy3.count(), 3); } -void tst_ChartDataSet::domain_data() +void tst_ChartDataSet::removeAllSeries_data() { - QTest::addColumn("domain1"); - QTest::addColumn("domain2"); - QTest::addColumn("domain3"); - QTest::addColumn("domain"); - QTest::newRow("Domain(0,10,0,10)") << Domain(0, 10, 0, 10) - << Domain(0, 5, 0, 5) << Domain(0, 3, 0, 3) << Domain(0, 10, 0, 10); - QTest::newRow("Domain(-1,11,0,11)") << Domain(-1, 10, 0, 10) - << Domain(0, 11, 0, 11) << Domain(0, 3, 0, 3) - << Domain(-1, 11, 0, 11); - QTest::newRow("Domain(-5,5,1,8)") << Domain(-5, 0, 1, 1) - << Domain(0, 5, 0, 8) << Domain(1, 2, 1, 2) << Domain(-5, 5, 0, 8); + QTest::addColumn("series0"); + QTest::addColumn("axis0"); + QTest::addColumn("series1"); + QTest::addColumn("axis1"); + QTest::addColumn("series2"); + QTest::addColumn("axis2"); + QTest::addColumn("axisCount"); + + QLineSeries* series0 = new QLineSeries(this); + QLineSeries* series1 = new QLineSeries(this); + QLineSeries* series2 = new QLineSeries(this); + + QChartAxis* axis0 = new QChartAxis(this); + QChartAxis* axis1 = new QChartAxis(this); + QChartAxis* axis2 = new QChartAxis(this); + + QTest::newRow("default axis Y: series0,series1,series2") << series0 << (QChartAxis*) 0 + << series1 << (QChartAxis*) 0 << series2 << (QChartAxis*) 0 << 2; + QTest::newRow("default axis Y: series0, axis 0: series1,series2") << series0 << (QChartAxis*) 0 + << series1 << axis0 << series2 << axis0 << 3; + QTest::newRow("axis0: series0, axis1: series1, axis2: series2") << series0 << axis0 << series1 + << axis1 << series2 << axis2 << 4; } -void tst_ChartDataSet::domain() +void tst_ChartDataSet::removeAllSeries() { - QFETCH(Domain, domain1); - QFETCH(Domain, domain2); - QFETCH(Domain, domain3); - QFETCH(Domain, domain); - - ChartDataSet dataSet; - QLineSeries* series1 = new QLineSeries(); - series1->add(domain1.m_minX, domain1.m_minY); - series1->add(domain1.m_maxX, domain1.m_maxY); - QLineSeries* series2 = new QLineSeries(); - series2->add(domain2.m_minX, domain2.m_minY); - series2->add(domain2.m_maxX, domain2.m_maxY); - QLineSeries* series3 = new QLineSeries(); - series3->add(domain3.m_minX, domain3.m_minY); - series3->add(domain3.m_maxX, domain3.m_maxY); - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, - SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, - SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - dataSet.addSeries(series1); - dataSet.addSeries(series2); - dataSet.addSeries(series3); - - QCOMPARE(dataSet.domainIndex(), 0); - QVERIFY2(dataSet.domain(dataSet.axisY()) == domain, "Domain not equal"); - - QCOMPARE(spy0.count(), 2); - QCOMPARE(spy1.count(), 6); - QCOMPARE(spy2.count(), 0); - QCOMPARE(spy3.count(), 3); - QCOMPARE(spy4.count(), 6); - QCOMPARE(spy5.count(), 0); + QFETCH(QLineSeries*, series0); + QFETCH(QChartAxis*, axis0); + QFETCH(QLineSeries*, series1); + QFETCH(QChartAxis*, axis1); + QFETCH(QLineSeries*, series2); + QFETCH(QChartAxis*, axis2); + QFETCH(int, axisCount); + + ChartDataSet dataSet; + + dataSet.addSeries(series0,axis0); + dataSet.addSeries(series1,axis1); + dataSet.addSeries(series2,axis2); + + QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*,Domain*))); + QSignalSpy spy1(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); + QSignalSpy spy2(&dataSet, SIGNAL(seriesAdded(QSeries*,Domain*))); + QSignalSpy spy3(&dataSet, SIGNAL(seriesRemoved(QSeries*))); + + dataSet.removeAllSeries(); + + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), axisCount); + QCOMPARE(spy2.count(), 0); + QCOMPARE(spy3.count(), 3); } -void tst_ChartDataSet::nextpreviousDomain_data() -{ - QTest::addColumn("rect"); - QTest::addColumn("viewport"); - QTest::newRow("400x400,1000x1000") << QRectF(200, 200, 600, 600) - << QRectF(0, 0, 1000, 1000); - QTest::newRow("600x600,1000x1000") << QRectF(100, 100, 700, 700) - << QRectF(0, 0, 1000, 1000); - QTest::newRow("200x200,1000x1000") << QRectF(400, 400, 600, 600) - << QRectF(0, 0, 1000, 1000); -} -void tst_ChartDataSet::nextpreviousDomain() +void tst_ChartDataSet::axisY_data() { - - QFETCH(QRectF, rect); - QFETCH(QRectF, viewport); - - ChartDataSet dataSet; - - Domain domain1(0, 1000, 0, 1000); - QLineSeries* series = new QLineSeries(); - series->add(0, 0); - series->add(1000, 1000); - - dataSet.addSeries(series); - - QCOMPARE(dataSet.domainIndex(), 0); - - Domain domain2 = dataSet.domain(dataSet.axisY()); - QVERIFY(domain1 == domain2); - - dataSet.addDomain(rect, viewport); - QCOMPARE(dataSet.domainIndex(), 1); - Domain domain3 = dataSet.domain(dataSet.axisY()); - Domain domain4 = domain1.subDomain(rect, viewport.width(), - viewport.height()); - QVERIFY(domain3 == domain4); - - dataSet.addDomain(rect, viewport); - QCOMPARE(dataSet.domainIndex(), 2); - Domain domain5 = dataSet.domain(dataSet.axisY()); - Domain domain6 = domain3.subDomain(rect, viewport.width(), - viewport.height()); - QVERIFY(domain5 == domain6); - - dataSet.addDomain(rect, viewport); - QCOMPARE(dataSet.domainIndex(), 3); - Domain domain7 = dataSet.domain(dataSet.axisY()); - Domain domain8 = domain5.subDomain(rect, viewport.width(), - viewport.height()); - QVERIFY(domain7 == domain8); - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, - SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, - SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - Domain domain; - - bool previous = dataSet.previousDomain(); - QCOMPARE(previous, true); - QCOMPARE(dataSet.domainIndex(), 2); - domain = dataSet.domain(dataSet.axisY()); - QVERIFY(domain == domain5); - previous = dataSet.previousDomain(); - QCOMPARE(previous, true); - QCOMPARE(dataSet.domainIndex(), 1); - domain = dataSet.domain(dataSet.axisY()); - QVERIFY(domain == domain3); - previous = dataSet.previousDomain(); - QCOMPARE(previous, true); - QCOMPARE(dataSet.domainIndex(), 0); - domain = dataSet.domain(dataSet.axisY()); - QVERIFY(domain == domain1); - previous = dataSet.previousDomain(); - QCOMPARE(previous, false); - QCOMPARE(dataSet.domainIndex(), 0); - domain = dataSet.domain(dataSet.axisY()); - QVERIFY(domain == domain1); - - bool next = dataSet.nextDomain(); - QCOMPARE(next, true); - QCOMPARE(dataSet.domainIndex(),1); - next = dataSet.nextDomain(); - QCOMPARE(next, true); - QCOMPARE(dataSet.domainIndex(),2); - next = dataSet.nextDomain(); - QCOMPARE(next, true); - QCOMPARE(dataSet.domainIndex(),3); - next = dataSet.nextDomain(); - QCOMPARE(next, false); - QCOMPARE(dataSet.domainIndex(),3); - - - QCOMPARE(spy0.count(), 0); - QCOMPARE(spy1.count(), 12); - QCOMPARE(spy2.count(), 0); - QCOMPARE(spy3.count(), 0); - QCOMPARE(spy4.count(), 6); - QCOMPARE(spy5.count(), 0); + QTest::addColumn("axis0"); + QTest::addColumn("axis1"); + QTest::addColumn("axis2"); + QTest::newRow("1 defualt, 2 optional") << (QChartAxis*)0 << new QChartAxis() << new QChartAxis(); + QTest::newRow("3 optional") << new QChartAxis() << new QChartAxis() << new QChartAxis(); } -void tst_ChartDataSet::removeSeries_data() +void tst_ChartDataSet::axisY() { - QTest::addColumn("seriesCount"); - QTest::addColumn("axisYCount"); - QTest::newRow("2 series, default axis") << 2 << 0; - QTest::newRow("2 series, 2 new axis") << 2 << 2; - QTest::newRow("2 series, 1 new axis") << 2 << 2; - QTest::newRow("3 series, 3 new axis") << 3 << 3; - QTest::newRow("3 series, 2 new axis") << 3 << 2; - QTest::newRow("3 series, 1 new axis") << 3 << 1; -} + QFETCH(QChartAxis*, axis0); + QFETCH(QChartAxis*, axis1); + QFETCH(QChartAxis*, axis2); -void tst_ChartDataSet::removeSeries() -{ - QFETCH(int, seriesCount); - QFETCH(int, axisYCount); + ChartDataSet dataSet; - ChartDataSet dataSet; + QChartAxis* defaultAxisY = dataSet.axisY(); - QList axisList; - QList seriesList; - - for (int i = 0; i < axisYCount; i++) { - QChartAxis* axis = new QChartAxis(); - axisList << axis; - } - - QList::iterator iterator = axisList.begin(); - - for (int i = 0; i < seriesCount; i++) { - QChartAxis* axisY = 0; - QLineSeries* series = new QLineSeries(); - if (iterator != axisList.end()) { - axisY = *iterator; - iterator++; - } else if (axisList.count() > 0) { - iterator--; - axisY = *iterator; - iterator++; - } - dataSet.addSeries(series, axisY); - seriesList << series; - } - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, - SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, - SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - for (int i = 0; i < seriesCount; i++) { - dataSet.removeSeries(seriesList.at(i)); - } - - //default axis - if (axisYCount == 0) - axisYCount++; - - QCOMPARE(spy0.count(), 0); - QCOMPARE(spy1.count(), 0); - QCOMPARE(spy2.count(), axisYCount); - QCOMPARE(spy3.count(), 0); - QCOMPARE(spy4.count(), 0); - QCOMPARE(spy5.count(), seriesCount); - - QCOMPARE(dataSet.domainIndex(), 0); - - qDeleteAll(seriesList); -} + QVERIFY2(defaultAxisY, "Missing axisY."); -void tst_ChartDataSet::removeAllSeries_data() -{ - QTest::addColumn("seriesCount"); - QTest::addColumn("axisYCount"); - QTest::newRow("2 series, default axis") << 2 << 0; - QTest::newRow("2 series, 2 new axis") << 2 << 2; - QTest::newRow("2 series, 1 new axis") << 2 << 2; - QTest::newRow("3 series, 3 new axis") << 3 << 3; - QTest::newRow("3 series, 2 new axis") << 3 << 2; - QTest::newRow("3 series, 1 new axis") << 3 << 1; -} + QLineSeries* series0 = new QLineSeries(); + dataSet.addSeries(series0,axis0); -void tst_ChartDataSet::removeAllSeries() -{ - QFETCH(int, seriesCount); - QFETCH(int, axisYCount); + QLineSeries* series1 = new QLineSeries(); + dataSet.addSeries(series1,axis1); - ChartDataSet dataSet; + QLineSeries* series2 = new QLineSeries(); + dataSet.addSeries(series2,axis2); - QList axisList; - - for (int i = 0; i < axisYCount; i++) { - QChartAxis* axis = new QChartAxis(); - axisList << axis; - } - - QList::iterator iterator = axisList.begin(); - - for (int i = 0; i < seriesCount; i++) { - QChartAxis* axisY = 0; - QLineSeries* series = new QLineSeries(); - if (iterator != axisList.end()) { - axisY = *iterator; - iterator++; - } else if (axisList.count() > 0) { - iterator--; - axisY = *iterator; - iterator++; - } - dataSet.addSeries(series, axisY); - } - - QSignalSpy spy0(&dataSet, SIGNAL(axisAdded(QChartAxis*))); - QSignalSpy spy1(&dataSet, SIGNAL(axisRangeChanged(QChartAxis*, QStringList const&))); - QSignalSpy spy2(&dataSet, SIGNAL(axisRemoved(QChartAxis*))); - QSignalSpy spy3(&dataSet, SIGNAL(seriesAdded(QSeries*))); - QSignalSpy spy4(&dataSet, SIGNAL(seriesDomainChanged(QSeries*, Domain const&))); - QSignalSpy spy5(&dataSet, SIGNAL(seriesRemoved(QSeries*))); - - dataSet.removeAllSeries(); - //default axis - if (axisYCount == 0) - axisYCount++; + if(!axis0) axis0=defaultAxisY ; + if(!axis1) axis1=defaultAxisY ; + if(!axis2) axis2=defaultAxisY ; - QCOMPARE(spy0.count(), 0); - QCOMPARE(spy1.count(), 0); - QCOMPARE(spy2.count(), axisYCount); - QCOMPARE(spy3.count(), 0); - QCOMPARE(spy4.count(), 0); - QCOMPARE(spy5.count(), seriesCount); + QVERIFY(dataSet.axisY(series0) == axis0); + QVERIFY(dataSet.axisY(series1) == axis1); + QVERIFY(dataSet.axisY(series2) == axis2); - QCOMPARE(dataSet.domainIndex(), 0); } - QTEST_MAIN(tst_ChartDataSet) #include "tst_chartdataset.moc" diff --git a/test/auto/domain/domain.pro b/test/auto/domain/domain.pro new file mode 100644 index 0000000..5f90efb --- /dev/null +++ b/test/auto/domain/domain.pro @@ -0,0 +1,4 @@ +!include( ../test.pri ) { + error( "Couldn't find the test.pri file!" ) +} +SOURCES += tst_domain.cpp diff --git a/test/auto/domain/tst_domain.cpp b/test/auto/domain/tst_domain.cpp new file mode 100644 index 0000000..1ca3957 --- /dev/null +++ b/test/auto/domain/tst_domain.cpp @@ -0,0 +1,578 @@ +#include +#include + +QTCOMMERCIALCHART_USE_NAMESPACE + +Q_DECLARE_METATYPE(Domain*) +Q_DECLARE_METATYPE(QSizeF) + +class tst_Domain : public QObject +{ + Q_OBJECT + +public slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + +private slots: + void domain(); + void handleAxisRangeXChanged_data(); + void handleAxisRangeXChanged(); + void handleAxisRangeYChanged_data(); + void handleAxisRangeYChanged(); + void isEmpty_data(); + void isEmpty(); + void maxX_data(); + void maxX(); + void maxY_data(); + void maxY(); + void minX_data(); + void minX(); + void minY_data(); + void minY(); + void operatorEquals_data(); + void operatorEquals(); + void setRange_data(); + void setRange(); + void setRangeX_data(); + void setRangeX(); + void setRangeY_data(); + void setRangeY(); + void spanX_data(); + void spanX(); + void spanY_data(); + void spanY(); + void zoom_data(); + void zoom(); +}; + +void tst_Domain::initTestCase() +{ +} + +void tst_Domain::cleanupTestCase() +{ +} + +void tst_Domain::init() +{ +} + +void tst_Domain::cleanup() +{ +} + +void tst_Domain::domain() +{ + Domain domain; + + QCOMPARE(domain.isEmpty(), true); + QCOMPARE(domain.maxX(), 0.0); + QCOMPARE(domain.maxY(), 0.0); + QCOMPARE(domain.minX(), 0.0); + QCOMPARE(domain.minY(), 0.0); +} + +void tst_Domain::handleAxisRangeXChanged_data() +{ + QTest::addColumn("min"); + QTest::addColumn("max"); + QTest::newRow("-1 1") << -1.0 << 1.0; + QTest::newRow("0 1") << 0.0 << 1.0; + QTest::newRow("-1 0") << -1.0 << 0.0; +} + +void tst_Domain::handleAxisRangeXChanged() +{ + QFETCH(qreal, min); + QFETCH(qreal, max); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.handleAxisRangeXChanged(min, max); + + QList arg0 = spy0.first(); + QVERIFY(arg0.at(0).toReal() == min); + QVERIFY(arg0.at(1).toReal() == max); + + QList arg1 = spy1.first(); + QVERIFY(arg1.at(0).toReal() == min); + QVERIFY(arg1.at(1).toReal() == max); + + QCOMPARE(spy0.count(), 1); + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy2.count(), 0); + +} + +void tst_Domain::handleAxisRangeYChanged_data() +{ + QTest::addColumn("min"); + QTest::addColumn("max"); + QTest::newRow("-1 1") << -1.0 << 1.0; + QTest::newRow("0 1") << 0.0 << 1.0; + QTest::newRow("-1 0") << -1.0 << 0.0; +} + + +void tst_Domain::handleAxisRangeYChanged() +{ + QFETCH(qreal, min); + QFETCH(qreal, max); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.handleAxisRangeYChanged(min, max); + + QList arg0 = spy0.first(); + QVERIFY(arg0.at(2).toReal() == min); + QVERIFY(arg0.at(3).toReal() == max); + + QList arg1 = spy2.first(); + QVERIFY(arg1.at(0).toReal() == min); + QVERIFY(arg1.at(1).toReal() == max); + + QCOMPARE(spy0.count(), 1); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 1); +} + +void tst_Domain::isEmpty_data() +{ + QTest::addColumn("minX"); + QTest::addColumn("maxX"); + QTest::addColumn("minY"); + QTest::addColumn("maxY"); + QTest::addColumn("isEmpty"); + QTest::newRow("0 0 0 0") << 0.0 << 0.0 << 0.0 << 0.0 << true; + QTest::newRow("0 1 0 0") << 0.0 << 1.0 << 0.0 << 0.0 << true; + QTest::newRow("0 0 0 1") << 0.0 << 1.0 << 0.0 << 0.0 << true; + QTest::newRow("0 1 0 1") << 0.0 << 1.0 << 0.0 << 1.0 << false; +} + +void tst_Domain::isEmpty() +{ + QFETCH(qreal, minX); + QFETCH(qreal, maxX); + QFETCH(qreal, minY); + QFETCH(qreal, maxY); + QFETCH(bool, isEmpty); + + Domain domain; + domain.setRange(minX,maxX,minY,maxY); + QCOMPARE(domain.isEmpty(), isEmpty); +} + +void tst_Domain::maxX_data() +{ + QTest::addColumn("maxX1"); + QTest::addColumn("maxX2"); + QTest::addColumn("count"); + QTest::newRow("1") << 0.0 << 1.0 << 1; + QTest::newRow("1.0") << 1.0 << 1.0 << 1; + QTest::newRow("2.0") << 1.0 << 0.0 << 2; +} + +void tst_Domain::maxX() +{ + QFETCH(qreal, maxX1); + QFETCH(qreal, maxX2); + QFETCH(int, count); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setMaxX(maxX1); + QCOMPARE(domain.maxX(), maxX1); + domain.setMaxX(maxX2); + QCOMPARE(domain.maxX(), maxX2); + + + QCOMPARE(spy0.count(), count); + QCOMPARE(spy1.count(), count); + QCOMPARE(spy2.count(), 0); + +} + +void tst_Domain::maxY_data() +{ + QTest::addColumn("maxY1"); + QTest::addColumn("maxY2"); + QTest::addColumn("count"); + QTest::newRow("1") << 0.0 << 1.0 << 1; + QTest::newRow("1.0") << 1.0 << 1.0 << 1; + QTest::newRow("2.0") << 1.0 << 0.0 << 2; +} + + +void tst_Domain::maxY() +{ + QFETCH(qreal, maxY1); + QFETCH(qreal, maxY2); + QFETCH(int, count); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setMaxY(maxY1); + QCOMPARE(domain.maxY(), maxY1); + domain.setMaxY(maxY2); + QCOMPARE(domain.maxY(), maxY2); + + QCOMPARE(spy0.count(), count); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), count); +} + +void tst_Domain::minX_data() +{ + QTest::addColumn("minX1"); + QTest::addColumn("minX2"); + QTest::addColumn("count"); + QTest::newRow("1") << 0.0 << 1.0 << 1; + QTest::newRow("1.0") << 1.0 << 1.0 << 1; + QTest::newRow("2.0") << 1.0 << 0.0 << 2; +} + + +void tst_Domain::minX() +{ + QFETCH(qreal, minX1); + QFETCH(qreal, minX2); + QFETCH(int, count); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setMinX(minX1); + QCOMPARE(domain.minX(), minX1); + domain.setMinX(minX2); + QCOMPARE(domain.minX(), minX2); + + QCOMPARE(spy0.count(), count); + QCOMPARE(spy1.count(), count); + QCOMPARE(spy2.count(), 0); +} + +void tst_Domain::minY_data() +{ + QTest::addColumn("minY1"); + QTest::addColumn("minY2"); + QTest::addColumn("count"); + QTest::newRow("1") << 0.0 << 1.0 << 1; + QTest::newRow("1.0") << 1.0 << 1.0 << 1; + QTest::newRow("2.0") << 1.0 << 0.0 << 2; +} + +void tst_Domain::minY() +{ + QFETCH(qreal, minY1); + QFETCH(qreal, minY2); + QFETCH(int, count); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setMinY(minY1); + QCOMPARE(domain.minY(), minY1); + domain.setMinY(minY2); + QCOMPARE(domain.minY(), minY2); + + QCOMPARE(spy0.count(), count); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), count); +} + +void tst_Domain::operatorEquals_data() +{ + + QTest::addColumn("domain1"); + QTest::addColumn("domain2"); + QTest::addColumn("equals"); + QTest::addColumn("notEquals"); + Domain* a; + Domain* b; + a = new Domain(); + a->setRange(0,100,0,100); + b = new Domain(); + b->setRange(0,100,0,100); + QTest::newRow("equals") << a << b << true <setRange(0,100,0,100); + b = new Domain(); + b->setRange(0,100,0,1); + QTest::newRow("equals") << a << b << false << true; + a = new Domain(); + a->setRange(0,100,0,100); + b = new Domain(); + b->setRange(0,1,0,100); + QTest::newRow("equals") << a << b << false << true; + +} + +void tst_Domain::operatorEquals() +{ + QFETCH(Domain*, domain1); + QFETCH(Domain*, domain2); + QFETCH(bool, equals); + QFETCH(bool, notEquals); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + QCOMPARE(*domain1==*domain2, equals); + QCOMPARE(*domain1!=*domain2, notEquals); + + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 0); +} + +void tst_Domain::setRange_data() +{ + QTest::addColumn("minX"); + QTest::addColumn("maxX"); + QTest::addColumn("minY"); + QTest::addColumn("maxY"); + QTest::newRow("1,2,1,2") << 1.0 << 2.0 << 1.0 << 2.0; + QTest::newRow("1,3,1,3") << 1.0 << 3.0 << 1.0 << 3.0; + QTest::newRow("-1,5,-2,-1") << -1.0 << 5.0 << -2.0 << -1.0; +} + +void tst_Domain::setRange() +{ + QFETCH(qreal, minX); + QFETCH(qreal, maxX); + QFETCH(qreal, minY); + QFETCH(qreal, maxY); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setRange(minX, maxX, minY, maxY); + + QCOMPARE(domain.minX(), minX); + QCOMPARE(domain.maxX(), maxX); + QCOMPARE(domain.minY(), minY); + QCOMPARE(domain.maxY(), maxY); + + QCOMPARE(spy0.count(), 1); + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy2.count(), 1); + + +} + +void tst_Domain::setRangeX_data() +{ + QTest::addColumn("min"); + QTest::addColumn("max"); + QTest::newRow("-1 1") << -1.0 << 1.0; + QTest::newRow("0 1") << 0.0 << 1.0; + QTest::newRow("-1 0") << -1.0 << 0.0; +} + +void tst_Domain::setRangeX() +{ + QFETCH(qreal, min); + QFETCH(qreal, max); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setRangeX(min, max); + + QList arg0 = spy0.first(); + QVERIFY(arg0.at(0).toReal() == min); + QVERIFY(arg0.at(1).toReal() == max); + + QList arg1 = spy1.first(); + QVERIFY(arg1.at(0).toReal() == min); + QVERIFY(arg1.at(1).toReal() == max); + + QCOMPARE(spy0.count(), 1); + QCOMPARE(spy1.count(), 1); + QCOMPARE(spy2.count(), 0); +} + +void tst_Domain::setRangeY_data() +{ + QTest::addColumn("min"); + QTest::addColumn("max"); + QTest::newRow("-1 1") << -1.0 << 1.0; + QTest::newRow("0 1") << 0.0 << 1.0; + QTest::newRow("-1 0") << -1.0 << 0.0; +} + +void tst_Domain::setRangeY() +{ + QFETCH(qreal, min); + QFETCH(qreal, max); + + Domain domain; + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + domain.setRangeY(min, max); + + QList arg0 = spy0.first(); + QVERIFY(arg0.at(2).toReal() == min); + QVERIFY(arg0.at(3).toReal() == max); + + QList arg1 = spy2.first(); + QVERIFY(arg1.at(0).toReal() == min); + QVERIFY(arg1.at(1).toReal() == max); + + QCOMPARE(spy0.count(), 1); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 1); +} + +void tst_Domain::spanX_data() +{ + QTest::addColumn("minX"); + QTest::addColumn("maxX"); + QTest::addColumn("spanX"); + QTest::newRow("1 2 1") << 1.0 << 2.0 << 1.0; + QTest::newRow("0 2 2") << 1.0 << 2.0 << 1.0; +} + +void tst_Domain::spanX() +{ + QFETCH(qreal, minX); + QFETCH(qreal, maxX); + QFETCH(qreal, spanX); + + Domain domain; + + domain.setRangeX(minX,maxX); + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + QCOMPARE(domain.spanX(), spanX); + + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 0); +} + +void tst_Domain::spanY_data() +{ + QTest::addColumn("minY"); + QTest::addColumn("maxY"); + QTest::addColumn("spanY"); + QTest::newRow("1 2 1") << 1.0 << 2.0 << 1.0; + QTest::newRow("0 2 2") << 1.0 << 2.0 << 1.0; +} + +void tst_Domain::spanY() +{ + QFETCH(qreal, minY); + QFETCH(qreal, maxY); + QFETCH(qreal, spanY); + + Domain domain; + + domain.setRangeY(minY,maxY); + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + QCOMPARE(domain.spanY(), spanY); + + QCOMPARE(spy0.count(), 0); + QCOMPARE(spy1.count(), 0); + QCOMPARE(spy2.count(), 0); +} + + +void tst_Domain::zoom_data() +{ + QTest::addColumn("rect0"); + QTest::addColumn("size0"); + QTest::addColumn("rect1"); + QTest::addColumn("size1"); + QTest::addColumn("rect2"); + QTest::addColumn("size2"); + QTest::newRow("first") << QRectF(10,10,100,100) << QSizeF(1000,1000) << QRectF(20,20,100,100) << QSizeF(1000,1000) << QRectF(50,50,100,100) << QSizeF(1000,1000); + QTest::newRow("scound") << QRectF(10,10,50,50) << QSizeF(1000,1000) << QRectF(20,20,100,100) << QSizeF(1000,1000) << QRectF(50,50,100,100) << QSizeF(1000,1000); + QTest::newRow("third") << QRectF(10,10,10,10) << QSizeF(100,100) << QRectF(20,20,20,20) << QSizeF(100,100) << QRectF(50,50,50,50) << QSizeF(100,100); +} + +void tst_Domain::zoom() +{ + QFETCH(QRectF, rect0); + QFETCH(QSizeF, size0); + QFETCH(QRectF, rect1); + QFETCH(QSizeF, size1); + QFETCH(QRectF, rect2); + QFETCH(QSizeF, size2); + + Domain domain; + + domain.setRange(0,1000,0,1000); + + QSignalSpy spy0(&domain, SIGNAL(domainChanged(qreal, qreal, qreal, qreal))); + QSignalSpy spy1(&domain, SIGNAL(rangeXChanged(qreal, qreal))); + QSignalSpy spy2(&domain, SIGNAL(rangeYChanged(qreal, qreal))); + + Domain domain0; + domain0.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY()); + domain.zoomIn(rect0, size0); + Domain domain1; + domain1.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY()); + domain.zoomIn(rect1, size1); + Domain domain2; + domain2.setRange(domain.minX(),domain.maxX(),domain.minY(),domain.maxY()); + domain.zoomIn(rect2, size2); + domain.zoomOut(rect2, size2); + QCOMPARE(domain == domain2,true); + domain.zoomOut(rect1, size1); + QCOMPARE(domain == domain1,true); + domain.zoomOut(rect0, size0); + QCOMPARE(domain == domain0,true); + QCOMPARE(spy0.count(), 6); + QCOMPARE(spy1.count(), 6); + QCOMPARE(spy2.count(), 6); + +} + +QTEST_MAIN(tst_Domain) +#include "tst_domain.moc" +