diff --git a/src/axis/qabstractaxis.cpp b/src/axis/qabstractaxis.cpp index 4d4e685..a96a08a 100644 --- a/src/axis/qabstractaxis.cpp +++ b/src/axis/qabstractaxis.cpp @@ -561,15 +561,15 @@ void QAbstractAxis::hide() } -void QAbstractAxis::setMin(const QVariant& min) +void QAbstractAxis::setMin(const qreal min) { d_ptr->setMin(min); } -void QAbstractAxis::setMax(const QVariant& max) +void QAbstractAxis::setMax(const qreal max) { d_ptr->setMax(max); } -void QAbstractAxis::setRange(const QVariant& min, const QVariant& max) +void QAbstractAxis::setRange(const qreal min, const qreal max) { d_ptr->setRange(min,max); } @@ -585,7 +585,10 @@ QAbstractAxisPrivate::QAbstractAxisPrivate(QAbstractAxis* q): m_shadesVisible(false), m_shadesBrush(Qt::SolidPattern), m_shadesOpacity(1.0), - m_orientation(Qt::Orientation(0)) + m_orientation(Qt::Orientation(0)), + m_min(0), + m_max(0), + m_ticksCount(5) { } diff --git a/src/axis/qabstractaxis.h b/src/axis/qabstractaxis.h index 51c9cd1..56b07d6 100644 --- a/src/axis/qabstractaxis.h +++ b/src/axis/qabstractaxis.h @@ -101,9 +101,9 @@ public: QColor shadesBorderColor() const; //range handling - void setMin(const QVariant& min); - void setMax(const QVariant& max); - void setRange(const QVariant& min, const QVariant& max); + void setMin(const qreal min); + void setMax(const qreal max); + void setRange(const qreal min, const qreal max); void show(); void hide(); diff --git a/src/axis/qabstractaxis_p.h b/src/axis/qabstractaxis_p.h index c94c67d..631e92e 100644 --- a/src/axis/qabstractaxis_p.h +++ b/src/axis/qabstractaxis_p.h @@ -51,9 +51,9 @@ public: virtual ChartAxis* createGraphics(ChartPresenter* presenter) = 0; protected: - virtual void setMin(const QVariant& min) = 0; - virtual void setMax(const QVariant& max) = 0; - virtual void setRange(const QVariant& min, const QVariant& max) = 0; + virtual void setMin(const qreal min) = 0; + virtual void setMax(const qreal max) = 0; + virtual void setRange(const qreal min, const qreal max) = 0; virtual int ticksCount() const = 0; public: @@ -79,6 +79,11 @@ public: Qt::Orientation m_orientation; + // range + qreal m_min; + qreal m_max; + int m_ticksCount; + friend class QAbstractAxis; }; diff --git a/src/axis/qcategoriesaxis.cpp b/src/axis/qcategoriesaxis.cpp index 7562a0e..d1bb3f6 100644 --- a/src/axis/qcategoriesaxis.cpp +++ b/src/axis/qcategoriesaxis.cpp @@ -130,11 +130,7 @@ QString QCategoriesAxis::at(int index) const void QCategoriesAxis::setMin(const QString& minCategory) { Q_D(QCategoriesAxis); - int minIndex = d->m_categories.indexOf(minCategory); - if (minIndex == -1) - return; -// else -// QAbstractAxis::setMin(minIndex); + d->setMinCategory(minCategory); } /*! @@ -143,11 +139,7 @@ void QCategoriesAxis::setMin(const QString& minCategory) void QCategoriesAxis::setMax(const QString& maxCategory) { Q_D(QCategoriesAxis); - int maxIndex = d->m_categories.indexOf(maxCategory); - if (maxIndex == -1) - return; -// else -// QAbstractAxis::setMax(maxIndex); + d->setMaxCategory(maxCategory); } /*! @@ -155,9 +147,8 @@ void QCategoriesAxis::setMax(const QString& maxCategory) */ void QCategoriesAxis::setRange(const QString& minCategory, const QString& maxCategory) { - // TODO: what if maxCategory < minCategory? - setMin(minCategory); - setMax(maxCategory); + Q_D(QCategoriesAxis); + d->setRangeCategory(minCategory,maxCategory); } /*! @@ -181,23 +172,68 @@ QCategoriesAxisPrivate::~QCategoriesAxisPrivate() } +void QCategoriesAxisPrivate::setMinCategory(const QString& minCategory) +{ + // Convert the category to value + int minIndex = m_categories.indexOf(minCategory); + if (minIndex == -1) { + return; + } + setRange(minIndex,m_max); +} -void QCategoriesAxisPrivate::setMin(const QVariant& min) +void QCategoriesAxisPrivate::setMaxCategory(const QString& maxCategory) { - Q_Q(QCategoriesAxis); - q->setMin(min.toString()); + // Convert the category to value + int maxIndex = m_categories.indexOf(maxCategory); + if (maxIndex == -1) { + return; + } + setRange(m_min,maxIndex); } -void QCategoriesAxisPrivate::setMax(const QVariant& max) +void QCategoriesAxisPrivate::setRangeCategory(const QString& minCategory, const QString& maxCategory) { - Q_Q(QCategoriesAxis); - q->setMax(max.toString()); + // TODO: + int minIndex = m_categories.indexOf(minCategory); + if (minIndex == -1) { + return; + } + int maxIndex = m_categories.indexOf(maxCategory); + if (maxIndex == -1) { + return; + } + setRange(minIndex,maxIndex); } -void QCategoriesAxisPrivate::setRange(const QVariant& min, const QVariant& max) +void QCategoriesAxisPrivate::setMin(const qreal min) { - Q_Q(QCategoriesAxis); - q->setRange(min.toString(),max.toString()); + setRange(min,m_max); +} + +void QCategoriesAxisPrivate::setMax(const qreal max) +{ + setRange(m_min,max); +} + +void QCategoriesAxisPrivate::setRange(const qreal min, const qreal max) +{ + Q_Q(QCategoriesAxis); + bool changed = false; + if (!qFuzzyIsNull(m_min - min)) { + m_min = min; + changed = true; + } + + if (!qFuzzyIsNull(m_max - max)) { + m_max = max; + changed = true; + } + + if (changed) { + emit this->changed(m_min, m_max, m_ticksCount, false); + emit q->categoriesChanged(); + } } int QCategoriesAxisPrivate::ticksCount() const @@ -205,6 +241,19 @@ int QCategoriesAxisPrivate::ticksCount() const return m_categories.count()+1; } +void QCategoriesAxisPrivate::handleAxisRangeChanged(qreal min, qreal max,int count) +{ +// Q_Q(QCategoriesAxis); +// q->setRange(min,max); +// q->setTicksCount(count); + m_min = min; + m_max = max; + m_ticksCount = count; + + // TODO?: + //emit updated(); +} + ChartAxis* QCategoriesAxisPrivate::createGraphics(ChartPresenter* presenter) { Q_Q( QCategoriesAxis); @@ -213,7 +262,6 @@ ChartAxis* QCategoriesAxisPrivate::createGraphics(ChartPresenter* presenter) }else{ return new ChartCategoriesAxisX(q,presenter); } - } #include "moc_qcategoriesaxis.cpp" diff --git a/src/axis/qcategoriesaxis_p.h b/src/axis/qcategoriesaxis_p.h index b9eb367..332c8c6 100644 --- a/src/axis/qcategoriesaxis_p.h +++ b/src/axis/qcategoriesaxis_p.h @@ -47,19 +47,29 @@ public: ChartAxis* createGraphics(ChartPresenter* presenter); private: + void setMinCategory(const QString& minCategory); + void setMaxCategory(const QString& maxCategory); + void setRangeCategory(const QString& minCategory, const QString& maxCategory); + //range handling - void setMin(const QVariant& min); - void setMax(const QVariant& max); - void setRange(const QVariant& min, const QVariant& max); + void setMin(const qreal min); + void setMax(const qreal max); + void setRange(const qreal min, const qreal max); int ticksCount() const; +Q_SIGNALS: + void changed(qreal min, qreal max, int tickCount,bool niceNumbers); + +public Q_SLOTS: + void handleAxisRangeChanged(qreal min, qreal max,int count); + private: QStringList m_categories; QString m_minCategory; QString m_maxCategory; -Q_SIGNALS: - void updated(); +// qreal m_rangeMin; +// qreal m_rangeMax; private: Q_DECLARE_PUBLIC(QCategoriesAxis) diff --git a/src/axis/qvaluesaxis.cpp b/src/axis/qvaluesaxis.cpp index 2c06431..a479b2a 100644 --- a/src/axis/qvaluesaxis.cpp +++ b/src/axis/qvaluesaxis.cpp @@ -131,23 +131,7 @@ qreal QValuesAxis::max() const void QValuesAxis::setRange(qreal min, qreal max) { Q_D(QValuesAxis); - bool changed = false; - if (!qFuzzyIsNull(d->m_min - min)) { - d->m_min = min; - changed = true; - emit minChanged(min); - } - - if (!qFuzzyIsNull(d->m_max - max)) { - d->m_max = max; - changed = true; - emit maxChanged(max); - } - - if (changed) { - emit rangeChanged(d->m_min,d->m_max); - emit d->changed(d->m_min, d->m_max, d->m_ticksCount, d->m_niceNumbers); - } + d->setRange(min,max); } /*! @@ -196,10 +180,7 @@ QAbstractAxis::AxisType QValuesAxis::type() const QValuesAxisPrivate::QValuesAxisPrivate(QValuesAxis* q): QAbstractAxisPrivate(q), - m_min(0), - m_max(0), - m_niceNumbers(false), - m_ticksCount(5) + m_niceNumbers(false) { } @@ -217,30 +198,36 @@ void QValuesAxisPrivate::handleAxisRangeChanged(qreal min, qreal max,int count) } -void QValuesAxisPrivate::setMin(const QVariant& min) +void QValuesAxisPrivate::setMin(const qreal min) { - Q_Q(QValuesAxis); - bool ok; - qreal value = min.toReal(&ok); - if(ok) q->setMin(value); + setRange(min,m_max); } -void QValuesAxisPrivate::setMax(const QVariant& max) +void QValuesAxisPrivate::setMax(const qreal max) { - Q_Q(QValuesAxis); - bool ok; - qreal value = max.toReal(&ok); - if(ok) q->setMax(value); + setRange(m_min,max); } -void QValuesAxisPrivate::setRange(const QVariant& min, const QVariant& max) +void QValuesAxisPrivate::setRange(const qreal min, const qreal max) { Q_Q(QValuesAxis); - bool ok1; - bool ok2; - qreal value1 = min.toReal(&ok1); - qreal value2 = max.toReal(&ok2); - if(ok1&&ok2) q->setRange(value1,value2); + bool changed = false; + if (!qFuzzyIsNull(m_min - min)) { + m_min = min; + changed = true; + emit q->minChanged(min); + } + + if (!qFuzzyIsNull(m_max - max)) { + m_max = max; + changed = true; + emit q->maxChanged(max); + } + + if (changed) { + emit q->rangeChanged(m_min,m_max); + emit this->changed(m_min, m_max, m_ticksCount, m_niceNumbers); + } } int QValuesAxisPrivate::ticksCount() const diff --git a/src/axis/qvaluesaxis_p.h b/src/axis/qvaluesaxis_p.h index ccd870c..fb4e39a 100644 --- a/src/axis/qvaluesaxis_p.h +++ b/src/axis/qvaluesaxis_p.h @@ -52,16 +52,13 @@ public: ChartAxis* createGraphics(ChartPresenter* presenter); protected: - void setMin(const QVariant& min); - void setMax(const QVariant& max); - void setRange(const QVariant& min, const QVariant& max); + void setMin(const qreal min); + void setMax(const qreal max); + void setRange(const qreal min, const qreal max); int ticksCount() const; private: - qreal m_min; - qreal m_max; bool m_niceNumbers; - int m_ticksCount; Q_DECLARE_PUBLIC(QValuesAxis) }; diff --git a/src/barchart/qbarseries.cpp b/src/barchart/qbarseries.cpp index 970e96a..0b29cb2 100644 --- a/src/barchart/qbarseries.cpp +++ b/src/barchart/qbarseries.cpp @@ -28,6 +28,7 @@ #include "charttheme_p.h" #include "chartanimator_p.h" #include "qvaluesaxis.h" +#include "qcategoriesaxis.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -610,7 +611,7 @@ QList QBarSeriesPrivate::createLegendMarker(QLegend* legend) QAbstractAxis* QBarSeriesPrivate::createAxisX(QObject* parent) { - return new QValuesAxis(parent); + return new QCategoriesAxis(parent); } QAbstractAxis* QBarSeriesPrivate::createAxisY(QObject* parent)