qcategoryaxis.cpp
290 lines
| 8.4 KiB
| text/x-c
|
CppLexer
Marek Rosa
|
r1701 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 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 Commercial Charts Add-on. | ||||
** | ||||
** $QT_BEGIN_LICENSE$ | ||||
** Licensees holding valid Qt Commercial licenses may use this file in | ||||
** accordance with the Qt Commercial 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$ | ||||
** | ||||
****************************************************************************/ | ||||
Marek Rosa
|
r1817 | #include "qcategoryaxis.h" | ||
#include "qcategoryaxis_p.h" | ||||
#include "chartcategoryaxisx_p.h" | ||||
#include "chartcategoryaxisy_p.h" | ||||
Marek Rosa
|
r1701 | #include <qmath.h> | ||
#include <QDebug> | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
/*! | ||||
Marek Rosa
|
r1816 | \class QCategoryAxis | ||
Marek Rosa
|
r1834 | \brief The QCategoryAxis class allows putting a named ranges on the axis. | ||
Marek Rosa
|
r1701 | \mainclass | ||
Marek Rosa
|
r1834 | |||
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. | ||||
Marek Rosa
|
r1887 | |||
Example code on how to use QCategoryAxis. | ||||
\code | ||||
QChartView *chartView = new QChartView; | ||||
QLineSeries *series = new QLineSeries; | ||||
// ... | ||||
chartView->chart()->addSeries(series); | ||||
QCategoryAxis *axisX = new QCategoryAxis; | ||||
axisX->setStartValue(15); | ||||
axisX->append("First", 20); | ||||
axisX->append("Second", 37); | ||||
axisX->append("Third", 52); | ||||
Marek Rosa
|
r2108 | chartView->chart()->setAxisX(axisX, series); | ||
Marek Rosa
|
r1887 | \endcode | ||
Marek Rosa
|
r1701 | */ | ||
/*! | ||||
Marek Rosa
|
r1817 | \qmlclass CategoryAxis QCategoryAxis | ||
Tero Ahola
|
r1869 | \inherits AbstractAxis | ||
Tero Ahola
|
r1870 | \brief CategoryAxis allows putting a named ranges on the axis. | ||
For example: | ||||
Tero Ahola
|
r2030 | \table | ||
\row | ||||
\o \br | ||||
\br | ||||
\br | ||||
\snippet ../demos/qmlaxes/qml/qmlaxes/View3.qml 1 | ||||
\o \inlineimage demos_qmlaxes3.png | ||||
\endtable | ||||
Marek Rosa
|
r1834 | */ | ||
/*! | ||||
\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. | ||||
Marek Rosa
|
r1701 | */ | ||
/*! | ||||
Constructs an axis object which is a child of \a parent. | ||||
*/ | ||||
Marek Rosa
|
r1816 | QCategoryAxis::QCategoryAxis(QObject *parent): | ||
Jani Honkonen
|
r2097 | QValueAxis(*new QCategoryAxisPrivate(this), parent) | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
/*! | ||||
Destroys the object | ||||
*/ | ||||
Marek Rosa
|
r1816 | QCategoryAxis::~QCategoryAxis() | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
/*! | ||||
\internal | ||||
*/ | ||||
Jani Honkonen
|
r2097 | QCategoryAxis::QCategoryAxis(QCategoryAxisPrivate &d, QObject *parent): QValueAxis(d, parent) | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
Tero Ahola
|
r1870 | /*! | ||
\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. | ||||
*/ | ||||
Marek Rosa
|
r1701 | /*! | ||
Marek Rosa
|
r1829 | Appends new category to the axis with an \a categoryLabel. | ||
Category label has to be unique. | ||||
Marek Rosa
|
r1849 | Parameter \a categoryEndValue specifies the high end limit of the category. | ||
Marek Rosa
|
r1829 | It has to be greater than the high end limit of the previous category. | ||
Otherwise the method returns without adding a new category. | ||||
Marek Rosa
|
r1701 | */ | ||
Jani Honkonen
|
r2104 | void QCategoryAxis::append(const QString &categoryLabel, qreal categoryEndValue) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1708 | |||
Jani Honkonen
|
r2097 | if (!d->m_categories.contains(categoryLabel)) { | ||
if (d->m_categories.isEmpty()) { | ||||
Marek Rosa
|
r1849 | Range range(d->m_categoryMinimum, categoryEndValue); | ||
Marek Rosa
|
r1829 | d->m_categoriesMap.insert(categoryLabel, range); | ||
d->m_categories.append(categoryLabel); | ||||
Jani Honkonen
|
r2097 | } else if (categoryEndValue > endValue(d->m_categories.last())) { | ||
Marek Rosa
|
r1829 | Range previousRange = d->m_categoriesMap.value(d->m_categories.last()); | ||
Marek Rosa
|
r1849 | d->m_categoriesMap.insert(categoryLabel, Range(previousRange.second, categoryEndValue)); | ||
Marek Rosa
|
r1829 | d->m_categories.append(categoryLabel); | ||
Marek Rosa
|
r1708 | } | ||
Marek Rosa
|
r1701 | } | ||
} | ||||
Marek Rosa
|
r1834 | /*! | ||
Sets \a min to be the low end limit of the first category on the axis. | ||||
Marek Rosa
|
r1847 | 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. | ||||
Marek Rosa
|
r1731 | */ | ||
Marek Rosa
|
r1829 | void QCategoryAxis::setStartValue(qreal min) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Jani Honkonen
|
r2097 | if (d->m_categories.isEmpty()) { | ||
Marek Rosa
|
r1708 | d->m_categoryMinimum = min; | ||
Jani Honkonen
|
r2097 | } else { | ||
Marek Rosa
|
r1829 | Range range = d->m_categoriesMap.value(d->m_categories.first()); | ||
Marek Rosa
|
r1847 | if (min < range.second) | ||
d->m_categoriesMap.insert(d->m_categories.first(), Range(min, range.second)); | ||||
Marek Rosa
|
r1708 | } | ||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1731 | /*! | ||
Marek Rosa
|
r1829 | Returns the low end limit of the category specified by an \a categoryLabel | ||
Marek Rosa
|
r1731 | */ | ||
Jani Honkonen
|
r2104 | qreal QCategoryAxis::startValue(const QString &categoryLabel) const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(const QCategoryAxis); | ||
Jani Honkonen
|
r1935 | if (categoryLabel.isEmpty()) | ||
Marek Rosa
|
r1847 | return d->m_categoryMinimum; | ||
Jani Honkonen
|
r2097 | return d->m_categoriesMap.value(categoryLabel).first; | ||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1731 | /*! | ||
Marek Rosa
|
r1829 | Returns the high end limit of the interval specified by an \a categoryLabel | ||
Marek Rosa
|
r1731 | */ | ||
Jani Honkonen
|
r2104 | qreal QCategoryAxis::endValue(const QString &categoryLabel) const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(const QCategoryAxis); | ||
Marek Rosa
|
r1829 | return d->m_categoriesMap.value(categoryLabel).second; | ||
Marek Rosa
|
r1701 | } | ||
Tero Ahola
|
r1870 | /*! | ||
\qmlmethod CategoryAxis::remove(string label) | ||||
Removes a category specified by the \a label from the axis | ||||
*/ | ||||
Marek Rosa
|
r1701 | /*! | ||
Marek Rosa
|
r1829 | Removes an interval specified by the \a categoryLabel from the axis | ||
Marek Rosa
|
r1701 | */ | ||
Marek Rosa
|
r1829 | void QCategoryAxis::remove(const QString &categoryLabel) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1829 | int labelIndex = d->m_categories.indexOf(categoryLabel); | ||
Marek Rosa
|
r1708 | |||
// check if such label exists | ||||
if (labelIndex != -1) { | ||||
Marek Rosa
|
r1829 | d->m_categories.removeAt(labelIndex); | ||
d->m_categoriesMap.remove(categoryLabel); | ||||
Marek Rosa
|
r1708 | |||
// the range of the interval that follows (if exists) needs to be updated | ||||
Marek Rosa
|
r1829 | if (labelIndex < d->m_categories.count()) { | ||
QString label = d->m_categories.at(labelIndex); | ||||
Range range = d->m_categoriesMap.value(label); | ||||
Marek Rosa
|
r1708 | |||
// set the range | ||||
if (labelIndex == 0) { | ||||
range.first = d->m_categoryMinimum; | ||||
Marek Rosa
|
r1829 | d->m_categoriesMap.insert(label, range); | ||
Marek Rosa
|
r1708 | } else { | ||
Marek Rosa
|
r1829 | range.first = d->m_categoriesMap.value(d->m_categories.at(labelIndex - 1)).second; | ||
d->m_categoriesMap.insert(label, range); | ||||
Marek Rosa
|
r1708 | } | ||
} | ||||
Marek Rosa
|
r1777 | d->emitUpdated(); | ||
Marek Rosa
|
r1708 | } | ||
Marek Rosa
|
r1701 | } | ||
Tero Ahola
|
r1870 | /*! | ||
\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. | ||||
*/ | ||||
Marek Rosa
|
r1800 | /*! | ||
Marek Rosa
|
r1829 | Replaces \a oldLabel of an existing category with a \a newLabel | ||
Marek Rosa
|
r1800 | If the old label does not exist the method returns without making any changes. | ||
*/ | ||||
Jani Honkonen
|
r2104 | void QCategoryAxis::replaceLabel(const QString &oldLabel, const QString &newLabel) | ||
Marek Rosa
|
r1777 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1829 | int labelIndex = d->m_categories.indexOf(oldLabel); | ||
Marek Rosa
|
r1777 | |||
// check if such label exists | ||||
if (labelIndex != -1) { | ||||
Marek Rosa
|
r1829 | d->m_categories.replace(labelIndex, newLabel); | ||
Range range = d->m_categoriesMap.value(oldLabel); | ||||
d->m_categoriesMap.remove(oldLabel); | ||||
d->m_categoriesMap.insert(newLabel, range); | ||||
Marek Rosa
|
r1777 | d->emitUpdated(); | ||
} | ||||
} | ||||
Marek Rosa
|
r1800 | /*! | ||
Returns the list of the intervals labels | ||||
*/ | ||||
Marek Rosa
|
r1829 | QStringList QCategoryAxis::categoriesLabels() | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1829 | return d->m_categories; | ||
Marek Rosa
|
r1701 | } | ||
/*! | ||||
Marek Rosa
|
r1799 | Returns number of intervals. | ||
Marek Rosa
|
r1701 | */ | ||
Marek Rosa
|
r1816 | int QCategoryAxis::count() const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(const QCategoryAxis); | ||
Marek Rosa
|
r1829 | return d->m_categories.count(); | ||
Marek Rosa
|
r1701 | } | ||
/*! | ||||
Returns the type of the axis | ||||
*/ | ||||
Marek Rosa
|
r1816 | QAbstractAxis::AxisType QCategoryAxis::type() const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1818 | return QAbstractAxis::AxisTypeCategory; | ||
Marek Rosa
|
r1701 | } | ||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
Jani Honkonen
|
r2104 | QCategoryAxisPrivate::QCategoryAxisPrivate(QCategoryAxis *q) | ||
: QValueAxisPrivate(q), | ||||
m_categoryMinimum(0) | ||||
Marek Rosa
|
r1701 | { | ||
} | ||||
Marek Rosa
|
r1816 | QCategoryAxisPrivate::~QCategoryAxisPrivate() | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
Marek Rosa
|
r1816 | int QCategoryAxisPrivate::ticksCount() const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1829 | return m_categories.count() + 1; | ||
Marek Rosa
|
r1701 | } | ||
Jani Honkonen
|
r2097 | void QCategoryAxisPrivate::handleAxisRangeChanged(qreal min, qreal max, int count) | ||
Marek Rosa
|
r1701 | { | ||
Q_UNUSED(count); | ||||
Michal Klocek
|
r1725 | Q_UNUSED(min); | ||
Q_UNUSED(max); | ||||
Marek Rosa
|
r1701 | } | ||
Jani Honkonen
|
r2104 | ChartAxis *QCategoryAxisPrivate::createGraphics(ChartPresenter *presenter) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_Q(QCategoryAxis); | ||
Jani Honkonen
|
r2097 | if (m_orientation == Qt::Vertical) | ||
return new ChartCategoryAxisY(q, presenter); | ||||
return new ChartCategoryAxisX(q, presenter); | ||||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1817 | #include "moc_qcategoryaxis.cpp" | ||
#include "moc_qcategoryaxis_p.cpp" | ||||
Marek Rosa
|
r1701 | |||
QTCOMMERCIALCHART_END_NAMESPACE | ||||