From 0d46cd22e84df254458fb12231ff55f7ddfc4810 2012-03-22 13:33:02 From: Michal Klocek Date: 2012-03-22 13:33:02 Subject: [PATCH] Adds back reimplemnted categories handling --- diff --git a/src/axis/axisitem.cpp b/src/axis/axisitem.cpp index 84067af..545fdf4 100644 --- a/src/axis/axisitem.cpp +++ b/src/axis/axisitem.cpp @@ -76,29 +76,31 @@ void Axis::updateLayout(QVector& layout) else setLayout(layout); } -QStringList Axis::createLabels(int ticks, qreal min, qreal max) const +bool Axis::createLabels(QStringList& labels,qreal min, qreal max,int ticks) const { Q_ASSERT(max>=min); Q_ASSERT(ticks>1); - QStringList labels; - - int n = qMax(int(-floor(log10((max-min)/(ticks-1)))),0); - QChartAxisCategories* categories = m_chartAxis->categories(); - for(int i=0; i< ticks; i++) { - qreal value = min + (i * (max - min)/ (ticks-1)); - if(categories->count()==0) { + bool category = categories->count()>0; + + if(!category) { + int n = qMax(int(-floor(log10((max-min)/(ticks-1)))),0); + for(int i=0; i< ticks; i++) { + qreal value = min + (i * (max - min)/ (ticks-1)); labels << QString::number(value,'f',n); } - else { - + } + else { + for(int i=0; i< ticks; i++) { + int value = ceil(min + (i * (max - min)/ (ticks-1))); QString label = categories->label(value); labels << label; } } - return labels; + + return category; } void Axis::setAxisOpacity(qreal opacity) @@ -244,7 +246,9 @@ void Axis::setLayout(QVector& layout) if(diff!=0) handleAxisUpdated(); - QStringList ticksList = createLabels(layout.size(),m_min,m_max); + QStringList ticksList; + + bool categories = createLabels(ticksList,m_min,m_max,layout.size()); QList lines = m_grid.childItems(); QList labels = m_labels.childItems(); @@ -265,10 +269,19 @@ void Axis::setLayout(QVector& layout) QGraphicsLineItem *lineItem = static_cast(lines.at(i)); lineItem->setLine(layout[i], m_rect.top(), layout[i], m_rect.bottom()); QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); - labelItem->setText(ticksList.at(i)); - QPointF center = labelItem->boundingRect().center(); - labelItem->setTransformOriginPoint(center.x(), center.y()); - labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding); + + if(!categories){ + labelItem->setText(ticksList.at(i)); + QPointF center = labelItem->boundingRect().center(); + labelItem->setTransformOriginPoint(center.x(), center.y()); + labelItem->setPos(layout[i] - center.x(), m_rect.bottom() + label_padding); + }else if(i>0){ + labelItem->setText(ticksList.at(i)); + QPointF center = labelItem->boundingRect().center(); + labelItem->setTransformOriginPoint(center.x(), center.y()); + labelItem->setPos(layout[i] - (layout[i] - layout[i-1])/2 - center.x(), m_rect.bottom() + label_padding); + } + if((i+1)%2 && i>1) { QGraphicsRectItem *rectItem = static_cast(shades.at(i/2-1)); rectItem->setRect(layout[i-1],m_rect.top(),layout[i]-layout[i-1],m_rect.height()); diff --git a/src/axis/axisitem_p.h b/src/axis/axisitem_p.h index 4551e1d..18d4338 100644 --- a/src/axis/axisitem_p.h +++ b/src/axis/axisitem_p.h @@ -65,7 +65,7 @@ private: void updateLayout(QVector& layout); void setLayout(QVector& layout); - QStringList createLabels(int ticks, qreal min, qreal max) const; + bool createLabels(QStringList& labels,qreal min, qreal max,int ticks) const; void axisSelected(); private: diff --git a/src/axis/qchartaxiscategories.cpp b/src/axis/qchartaxiscategories.cpp index 55cfec0..6785eba 100644 --- a/src/axis/qchartaxiscategories.cpp +++ b/src/axis/qchartaxiscategories.cpp @@ -13,6 +13,16 @@ QChartAxisCategories::~QChartAxisCategories() // TODO Auto-generated destructor stub } +void QChartAxisCategories::insert(QBarCategory& category) +{ + int i=1; + foreach(QString string , category){ + m_map.insert(i,string); + i++; + } + emit updated(); +} + void QChartAxisCategories::insert(qreal value,QString label) { m_map.insert(value,label); diff --git a/src/axis/qchartaxiscategories.h b/src/axis/qchartaxiscategories.h index 301be40..0dff8ae 100644 --- a/src/axis/qchartaxiscategories.h +++ b/src/axis/qchartaxiscategories.h @@ -1,6 +1,8 @@ #ifndef QCHARTAXISCATEGORIES_H_ #define QCHARTAXISCATEGORIES_H_ + #include +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -12,6 +14,7 @@ private: public: ~QChartAxisCategories(); + void insert(QBarCategory& category); void insert(qreal value,QString label); void remove(qreal value); QString label(qreal value) const; diff --git a/src/barchart/barchartitem.cpp b/src/barchart/barchartitem.cpp index a14781a..06e4781 100644 --- a/src/barchart/barchartitem.cpp +++ b/src/barchart/barchartitem.cpp @@ -24,7 +24,6 @@ BarChartItem::BarChartItem(QBarSeries *series, ChartPresenter *presenter) : //TODO: connect(series,SIGNAL("position or size has changed"), this, SLOT(handleLayoutChanged())); connect(series, SIGNAL(restructuredBar(int)), this, SLOT(handleModelChanged(int))); setZValue(ChartPresenter::BarSeriesZValue); - initAxisLabels(); dataChanged(); } @@ -174,21 +173,6 @@ void BarChartItem::setLayout(const QVector &layout) update(); } -void BarChartItem::initAxisLabels() -{ - int count = mSeries->categoryCount(); - if (0 == count) { - return; - } - - Domain* domain = presenter()->dataSet()->domain(mSeries); - - qreal min = 0; - qreal max = count+1; - - domain->setRangeX(min,max,count+1); -} - //handlers void BarChartItem::handleModelChanged(int index) @@ -204,24 +188,6 @@ void BarChartItem::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal mDomainMinY = minY; mDomainMaxY = maxY; handleLayoutChanged(); - - /* - int count = mSeries->categoryCount(); - if (0 == count) { - return; - } - - // Position labels to domain - qreal min = domain.minX(); - qreal max = domain.maxX(); - qreal step = (max-min)/count; - QChartAxisCategories& categories = mChart->axisX()->categories(); - categories.clear(); - for (int i=0; icategoryName(i)); - min += step; - } - */ } void BarChartItem::handleGeometryChanged(const QRectF& rect) diff --git a/src/barchart/barchartitem_p.h b/src/barchart/barchartitem_p.h index 7f78f24..50a8a00 100644 --- a/src/barchart/barchartitem_p.h +++ b/src/barchart/barchartitem_p.h @@ -43,9 +43,6 @@ public: QRectF geometry() const { return m_rect;} -protected: - void initAxisLabels(); - public slots: void handleModelChanged(int index); void handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY); diff --git a/src/barchart/qbarseries.h b/src/barchart/qbarseries.h index 25b49ad..846c450 100644 --- a/src/barchart/qbarseries.h +++ b/src/barchart/qbarseries.h @@ -6,6 +6,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE +typedef QStringList QBarCategory; + class QBarSet; class BarChartModel; class BarCategory; diff --git a/src/chartdataset.cpp b/src/chartdataset.cpp index ec48e83..f9b6fda 100644 --- a/src/chartdataset.cpp +++ b/src/chartdataset.cpp @@ -123,8 +123,16 @@ void ChartDataSet::removeAllSeries() } //to be removed with PIMPL -void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const +void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) { + qreal minX(domain->minX()); + qreal minY(domain->minY()); + qreal maxX(domain->maxX()); + qreal maxY(domain->maxY()); + int tickXCount(domain->tickXCount()); + int tickYCount(domain->tickYCount()); + + switch(series->type()) { case QSeries::SeriesTypeLine: @@ -134,11 +142,6 @@ void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const QXYSeries* xySeries = static_cast(series); - qreal minX(domain->minX()); - qreal minY(domain->minY()); - qreal maxX(domain->maxX()); - qreal maxY(domain->maxY()); - for (int i = 0; i < xySeries->count(); i++) { qreal x = xySeries->x(i); @@ -148,14 +151,11 @@ void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const maxX = qMax(maxX, x); maxY = qMax(maxY, y); } - - domain->setRange(minX, maxX, minY, maxY); break; } case QSeries::SeriesTypeArea: { QAreaSeries* areaSeries = static_cast(series); - QLineSeries* upperSeries = areaSeries->upperSeries(); QLineSeries* lowerSeries = areaSeries->lowerSeries(); @@ -163,50 +163,58 @@ void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const { 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)); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(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)); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); }} break; } case QSeries::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)); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + tickXCount = x+1; + setupCategories(barSeries); break; } case QSeries::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)); + minX = qMin(minX, x); + minY = qMin(minY, y); + maxX = qMax(maxX, x); + maxY = qMax(maxY, y); + tickXCount = x+1; + setupCategories(stackedBarSeries); break; } case QSeries::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); + minX = qMin(minX, x); + maxX = qMax(maxX, x); + minY = 0; + maxY = 100; + setupCategories(percentBarSeries); break; } @@ -224,6 +232,20 @@ void ChartDataSet::calculateDomain(QSeries* series,Domain* domain) const } } + + domain->setRangeX(minX,maxX,tickXCount); + domain->setRangeY(minY,maxY,tickYCount); +} + + +void ChartDataSet::setupCategories(QBarSeries* series) +{ + int count = series->categoryCount(); + QChartAxisCategories* categories = axisX()->categories(); + categories->clear(); + for (int i=1; i<=count; i++) { + categories->insert(i,series->categoryName(i-1)); + } } void ChartDataSet::zoomInDomain(const QRectF& rect, const QSizeF& size) diff --git a/src/chartdataset_p.h b/src/chartdataset_p.h index e4d8db3..9264e43 100644 --- a/src/chartdataset_p.h +++ b/src/chartdataset_p.h @@ -8,6 +8,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QChartAxis; +class QBarSeries; class ChartDataSet : public QObject { @@ -42,7 +43,8 @@ signals: private: QStringList createLabels(QChartAxis* axis,qreal min, qreal max); - void calculateDomain(QSeries* series,Domain* domain) const; + void calculateDomain(QSeries* series,Domain* domain); + void setupCategories(QBarSeries* series); private: QMap m_seriesAxisMap; diff --git a/src/chartpresenter_p.h b/src/chartpresenter_p.h index ca8ed7f..c72ef70 100644 --- a/src/chartpresenter_p.h +++ b/src/chartpresenter_p.h @@ -24,11 +24,11 @@ public: BackgroundZValue = -1, ShadesZValue, GridZValue, - AxisZValue, LineChartZValue, BarSeriesZValue, ScatterSeriesZValue, PieSeriesZValue, + AxisZValue, LegendZValue };