diff options
Diffstat (limited to 'src/charts/axis/categoryaxis/qcategoryaxis.cpp')
-rw-r--r-- | src/charts/axis/categoryaxis/qcategoryaxis.cpp | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/src/charts/axis/categoryaxis/qcategoryaxis.cpp b/src/charts/axis/categoryaxis/qcategoryaxis.cpp new file mode 100644 index 00000000..d5b3d472 --- /dev/null +++ b/src/charts/axis/categoryaxis/qcategoryaxis.cpp @@ -0,0 +1,345 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc +** All rights reserved. +** For any questions to Digia, please use contact form at http://qt.digia.com +** +** This file is part of the Qt Enterprise Charts Add-on. +** +** $QT_BEGIN_LICENSE$ +** Licensees holding valid Qt Enterprise licenses may use this file in +** accordance with the Qt Enterprise License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. +** +** If you have questions regarding the use of this file, please use +** contact form at http://qt.digia.com +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qcategoryaxis.h" +#include "qcategoryaxis_p.h" +#include "chartcategoryaxisx_p.h" +#include "chartcategoryaxisy_p.h" +#include "polarchartcategoryaxisangular_p.h" +#include "polarchartcategoryaxisradial_p.h" +#include "qchart.h" +#include <qmath.h> +#include <QDebug> + +QT_CHARTS_BEGIN_NAMESPACE +/*! + \class QCategoryAxis + \inmodule Qt Charts + \brief The QCategoryAxis class allows putting a named ranges on the axis. + \mainclass + + This class can be used when the underlying data needs to be given extra meaning. + Unlike with the QBarCategoryAxis the QCategoryAxis allows the categories ranges widths to be specified freely. + + Example code on how to use QCategoryAxis: + \table + \row + \li \br + \br + \code + QChartView *chartView = new QChartView; + QLineSeries *series = new QLineSeries; + // ... + chartView->chart()->addSeries(series); + + QCategoryAxis *axisY = new QCategoryAxis; + axisY->setMin(0); + axisY->setMax(52); + axisY->setStartValue(15); + axisY->append("First", 20); + axisY->append("Second", 37); + axisY->append("Third", 52); + chartView->chart()->setAxisY(axisY, series); + \endcode + \li \br + \inlineimage api_category_axis.png + \endtable +*/ +/*! + \qmltype CategoryAxis + \instantiates QCategoryAxis + \inqmlmodule QtCharts + + \inherits AbstractAxis + \brief CategoryAxis allows putting a named ranges on the axis. + + For example: + \table + \row + \li \br + \br + \br + \snippet qmlaxes/qml/qmlaxes/View3.qml 1 + \li \inlineimage examples_qmlaxes3.png + \endtable +*/ + +/*! + \property QCategoryAxis::startValue + Defines the low end of the first category on the axis. +*/ +/*! + \qmlproperty int CategoryAxis::startValue + Defines the low end of the first category on the axis. +*/ + +/*! + \property QCategoryAxis::count + The count of categories. +*/ +/*! + \qmlproperty int CategoryAxis::count + The count of categories. +*/ + +/*! + \property QCategoryAxis::categoriesLabels + The category labels as a string list. +*/ +/*! + \qmlproperty StringList CategoryAxis::categoriesLabels + The category labels as a list of strings. +*/ + +/*! + \fn void QCategoryAxis::categoriesChanged() + Axis emits signal when the categories of the axis have changed. +*/ + + +/*! + Constructs an axis object which is a child of \a parent. +*/ +QCategoryAxis::QCategoryAxis(QObject *parent): + QValueAxis(*new QCategoryAxisPrivate(this), parent) +{ +} + +/*! + Destroys the object +*/ +QCategoryAxis::~QCategoryAxis() +{ + Q_D(QCategoryAxis); + if (d->m_chart) + d->m_chart->removeAxis(this); +} + +/*! + \internal +*/ +QCategoryAxis::QCategoryAxis(QCategoryAxisPrivate &d, QObject *parent): QValueAxis(d, parent) +{ + +} + +/*! + \qmlmethod CategoryAxis::append(string label, real endValue) + Appends new category to the axis with an \a label. Category label has to be unique. + Parameter \a endValue specifies the high end limit of the category. + It has to be greater than the high end limit of the previous category. + Otherwise the method returns without adding a new category. +*/ +/*! + Appends new category to the axis with an \a categoryLabel. + Category label has to be unique. + Parameter \a categoryEndValue specifies the high end limit of the category. + It has to be greater than the high end limit of the previous category. + Otherwise the method returns without adding a new category. +*/ +void QCategoryAxis::append(const QString &categoryLabel, qreal categoryEndValue) +{ + Q_D(QCategoryAxis); + + if (!d->m_categories.contains(categoryLabel)) { + if (d->m_categories.isEmpty()) { + Range range(d->m_categoryMinimum, categoryEndValue); + d->m_categoriesMap.insert(categoryLabel, range); + d->m_categories.append(categoryLabel); + emit categoriesChanged(); + } else if (categoryEndValue > endValue(d->m_categories.last())) { + Range previousRange = d->m_categoriesMap.value(d->m_categories.last()); + d->m_categoriesMap.insert(categoryLabel, Range(previousRange.second, categoryEndValue)); + d->m_categories.append(categoryLabel); + emit categoriesChanged(); + } + } +} + +/*! + Sets \a min to be the low end limit of the first category on the axis. + If there is already some categories added to the axis then passed value must be lower than the high end value of the already defined first category range. + Otherwise nothing is done. +*/ +void QCategoryAxis::setStartValue(qreal min) +{ + Q_D(QCategoryAxis); + if (d->m_categories.isEmpty()) { + d->m_categoryMinimum = min; + emit categoriesChanged(); + } else { + Range range = d->m_categoriesMap.value(d->m_categories.first()); + if (min < range.second) { + d->m_categoriesMap.insert(d->m_categories.first(), Range(min, range.second)); + emit categoriesChanged(); + } + } +} + +/*! + Returns the low end limit of the category specified by an \a categoryLabel +*/ +qreal QCategoryAxis::startValue(const QString &categoryLabel) const +{ + Q_D(const QCategoryAxis); + if (categoryLabel.isEmpty()) + return d->m_categoryMinimum; + return d->m_categoriesMap.value(categoryLabel).first; +} + +/*! + Returns the high end limit of the interval specified by an \a categoryLabel +*/ +qreal QCategoryAxis::endValue(const QString &categoryLabel) const +{ + Q_D(const QCategoryAxis); + return d->m_categoriesMap.value(categoryLabel).second; +} + +/*! + \qmlmethod CategoryAxis::remove(string label) + Removes a category specified by the \a label from the axis +*/ +/*! + Removes an interval specified by the \a categoryLabel from the axis +*/ +void QCategoryAxis::remove(const QString &categoryLabel) +{ + Q_D(QCategoryAxis); + int labelIndex = d->m_categories.indexOf(categoryLabel); + + // check if such label exists + if (labelIndex != -1) { + d->m_categories.removeAt(labelIndex); + d->m_categoriesMap.remove(categoryLabel); + + // the range of the interval that follows (if exists) needs to be updated + if (labelIndex < d->m_categories.count()) { + QString label = d->m_categories.at(labelIndex); + Range range = d->m_categoriesMap.value(label); + + // set the range + if (labelIndex == 0) { + range.first = d->m_categoryMinimum; + d->m_categoriesMap.insert(label, range); + } else { + range.first = d->m_categoriesMap.value(d->m_categories.at(labelIndex - 1)).second; + d->m_categoriesMap.insert(label, range); + } + } + emit categoriesChanged(); + } +} + +/*! + \qmlmethod CategoryAxis::replace(string oldLabel, string newLabel) + Replaces \a oldLabel of an existing category with a \a newLabel. + If the old label does not exist the method returns without making any changes. +*/ +/*! + Replaces \a oldLabel of an existing category with a \a newLabel + If the old label does not exist the method returns without making any changes. + */ +void QCategoryAxis::replaceLabel(const QString &oldLabel, const QString &newLabel) +{ + Q_D(QCategoryAxis); + int labelIndex = d->m_categories.indexOf(oldLabel); + + // check if such label exists + if (labelIndex != -1) { + d->m_categories.replace(labelIndex, newLabel); + Range range = d->m_categoriesMap.value(oldLabel); + d->m_categoriesMap.remove(oldLabel); + d->m_categoriesMap.insert(newLabel, range); + emit categoriesChanged(); + } +} + +/*! + Returns the list of the intervals labels + */ +QStringList QCategoryAxis::categoriesLabels() +{ + Q_D(QCategoryAxis); + return d->m_categories; +} + +/*! + Returns number of intervals. + */ +int QCategoryAxis::count() const +{ + Q_D(const QCategoryAxis); + return d->m_categories.count(); +} + +/*! + Returns the type of the axis +*/ +QAbstractAxis::AxisType QCategoryAxis::type() const +{ + return QAbstractAxis::AxisTypeCategory; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QCategoryAxisPrivate::QCategoryAxisPrivate(QCategoryAxis *q) + : QValueAxisPrivate(q), + m_categoryMinimum(0) +{ + +} + +QCategoryAxisPrivate::~QCategoryAxisPrivate() +{ + +} + +int QCategoryAxisPrivate::ticksCount() const +{ + return m_categories.count() + 1; +} + +void QCategoryAxisPrivate::initializeGraphics(QGraphicsItem *parent) +{ + Q_Q(QCategoryAxis); + ChartAxisElement *axis(0); + if (m_chart->chartType() == QChart::ChartTypeCartesian) { + if (orientation() == Qt::Vertical) + axis = new ChartCategoryAxisY(q,parent); + else if (orientation() == Qt::Horizontal) + axis = new ChartCategoryAxisX(q,parent); + } + + if (m_chart->chartType() == QChart::ChartTypePolar) { + if (orientation() == Qt::Vertical) + axis = new PolarChartCategoryAxisRadial(q, parent); + if (orientation() == Qt::Horizontal) + axis = new PolarChartCategoryAxisAngular(q, parent); + } + + m_item.reset(axis); + QAbstractAxisPrivate::initializeGraphics(parent); +} + +#include "moc_qcategoryaxis.cpp" +#include "moc_qcategoryaxis_p.cpp" + +QT_CHARTS_END_NAMESPACE |