qcategoryaxis.cpp
242 lines
| 6.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 | ||
\brief The QCategoryAxis class is used for manipulating chart's axis. | ||||
Marek Rosa
|
r1701 | \mainclass | ||
*/ | ||||
/*! | ||||
Marek Rosa
|
r1817 | \qmlclass CategoryAxis QCategoryAxis | ||
Marek Rosa
|
r1701 | \brief The Axis element is used for manipulating chart's axes. | ||
*/ | ||||
/*! | ||||
Constructs an axis object which is a child of \a parent. | ||||
*/ | ||||
Marek Rosa
|
r1816 | QCategoryAxis::QCategoryAxis(QObject *parent): | ||
QValueAxis(*new QCategoryAxisPrivate(this),parent) | ||||
Marek Rosa
|
r1701 | { | ||
} | ||||
/*! | ||||
Destroys the object | ||||
*/ | ||||
Marek Rosa
|
r1816 | QCategoryAxis::~QCategoryAxis() | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1804 | // Q_D(QValueAxis); | ||
Marek Rosa
|
r1777 | // if(d->m_dataset) { | ||
// d->m_dataset->removeAxis(this); | ||||
// } | ||||
Marek Rosa
|
r1701 | } | ||
/*! | ||||
\internal | ||||
*/ | ||||
Marek Rosa
|
r1816 | QCategoryAxis::QCategoryAxis(QCategoryAxisPrivate &d,QObject *parent):QValueAxis(d,parent) | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
/*! | ||||
Marek Rosa
|
r1731 | Appends new interval to the axis with an \a intervalLabel. | ||
Marek Rosa
|
r1799 | Interval label has to be unique. | ||
Marek Rosa
|
r1800 | Parameter \a intervalEnd specifies the high end limit of the interval. | ||
Marek Rosa
|
r1799 | It has to be greater than the high end limit of the previous interval. | ||
Otherwise the method returns without adding a new interval. | ||||
Marek Rosa
|
r1701 | */ | ||
Marek Rosa
|
r1816 | void QCategoryAxis::append(const QString& intervalLabel, qreal intervalEnd) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1708 | |||
Marek Rosa
|
r1701 | if (!d->m_intervals.contains(intervalLabel)) | ||
{ | ||||
if(d->m_intervals.isEmpty()){ | ||||
Marek Rosa
|
r1799 | Range range(d->m_categoryMinimum, intervalEnd); | ||
Marek Rosa
|
r1701 | d->m_intervalsMap.insert(intervalLabel, range); | ||
d->m_intervals.append(intervalLabel); | ||||
Marek Rosa
|
r1799 | }else if (intervalEnd > intervalMax(d->m_intervals.last())){ | ||
Marek Rosa
|
r1701 | Range range = d->m_intervalsMap.value(d->m_intervals.last()); | ||
Marek Rosa
|
r1799 | d->m_intervalsMap.insert(intervalLabel, Range(range.second, intervalEnd)); | ||
Marek Rosa
|
r1701 | d->m_intervals.append(intervalLabel); | ||
Marek Rosa
|
r1708 | } | ||
Marek Rosa
|
r1701 | } | ||
} | ||||
Marek Rosa
|
r1731 | /*! | ||
Sets to \a min the low end limit of the first interval on the axis. | ||||
*/ | ||||
Marek Rosa
|
r1816 | void QCategoryAxis::setFisrtIntervalMinimum(qreal min) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1708 | if(d->m_intervals.isEmpty()){ | ||
d->m_categoryMinimum = min; | ||||
}else{ | ||||
Range range = d->m_intervalsMap.value(d->m_intervals.first()); | ||||
d->m_intervalsMap.insert(d->m_intervals.first(), Range(min, range.second)); | ||||
} | ||||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1731 | /*! | ||
Returns the low end limit of the interval specified by an \a intervalLabel | ||||
*/ | ||||
Marek Rosa
|
r1816 | qreal QCategoryAxis::intervalMin(const QString& intervalLabel) const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(const QCategoryAxis); | ||
Marek Rosa
|
r1701 | return d->m_intervalsMap.value(intervalLabel).first; | ||
} | ||||
Marek Rosa
|
r1731 | /*! | ||
Returns the high end limit of the interval specified by an \a intervalLabel | ||||
*/ | ||||
Marek Rosa
|
r1816 | qreal QCategoryAxis::intervalMax(const QString& intervalLabel) const | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(const QCategoryAxis); | ||
Marek Rosa
|
r1701 | return d->m_intervalsMap.value(intervalLabel).second; | ||
} | ||||
/*! | ||||
Marek Rosa
|
r1800 | Removes an interval specified by the \a intervalLabel from the axis | ||
Marek Rosa
|
r1701 | */ | ||
Marek Rosa
|
r1816 | void QCategoryAxis::remove(const QString &intervalLabel) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1708 | int labelIndex = d->m_intervals.indexOf(intervalLabel); | ||
// check if such label exists | ||||
if (labelIndex != -1) { | ||||
d->m_intervals.removeAt(labelIndex); | ||||
d->m_intervalsMap.remove(intervalLabel); | ||||
// the range of the interval that follows (if exists) needs to be updated | ||||
if (labelIndex < d->m_intervals.count()) { | ||||
QString label = d->m_intervals.at(labelIndex); | ||||
Range range = d->m_intervalsMap.value(label); | ||||
// set the range | ||||
if (labelIndex == 0) { | ||||
range.first = d->m_categoryMinimum; | ||||
d->m_intervalsMap.insert(label, range); | ||||
} else { | ||||
range.first = d->m_intervalsMap.value(d->m_intervals.at(labelIndex - 1)).second; | ||||
d->m_intervalsMap.insert(label, range); | ||||
} | ||||
} | ||||
Marek Rosa
|
r1777 | d->emitUpdated(); | ||
Marek Rosa
|
r1708 | } | ||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1800 | /*! | ||
Replaces \a oldLabel of an existing interval with a \a newLabel | ||||
If the old label does not exist the method returns without making any changes. | ||||
*/ | ||||
Marek Rosa
|
r1816 | void QCategoryAxis::replaceLabel(const QString& oldLabel, const QString& newLabel) | ||
Marek Rosa
|
r1777 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1777 | int labelIndex = d->m_intervals.indexOf(oldLabel); | ||
// check if such label exists | ||||
if (labelIndex != -1) { | ||||
d->m_intervals.replace(labelIndex, newLabel); | ||||
Range range = d->m_intervalsMap.value(oldLabel); | ||||
d->m_intervalsMap.remove(oldLabel); | ||||
d->m_intervalsMap.insert(newLabel, range); | ||||
d->emitUpdated(); | ||||
} | ||||
} | ||||
Marek Rosa
|
r1800 | /*! | ||
Returns the list of the intervals labels | ||||
*/ | ||||
Marek Rosa
|
r1816 | QStringList QCategoryAxis::intervalsLabels() | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_D(QCategoryAxis); | ||
Marek Rosa
|
r1701 | return d->m_intervals; | ||
} | ||||
/*! | ||||
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
|
r1701 | return d->m_intervals.count(); | ||
} | ||||
/*! | ||||
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 | } | ||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
Marek Rosa
|
r1816 | QCategoryAxisPrivate::QCategoryAxisPrivate(QCategoryAxis* q): | ||
Marek Rosa
|
r1804 | QValueAxisPrivate(q), | ||
Marek Rosa
|
r1701 | m_categoryMinimum(0) | ||
{ | ||||
} | ||||
Marek Rosa
|
r1816 | QCategoryAxisPrivate::~QCategoryAxisPrivate() | ||
Marek Rosa
|
r1701 | { | ||
} | ||||
Marek Rosa
|
r1816 | int QCategoryAxisPrivate::ticksCount() const | ||
Marek Rosa
|
r1701 | { | ||
return m_intervals.count() + 1; | ||||
} | ||||
Marek Rosa
|
r1816 | void QCategoryAxisPrivate::handleAxisRangeChanged(qreal min, qreal max,int count) | ||
Marek Rosa
|
r1701 | { | ||
Q_UNUSED(count); | ||||
Michal Klocek
|
r1725 | Q_UNUSED(min); | ||
Q_UNUSED(max); | ||||
//m_min = min; | ||||
//m_max = max; | ||||
Marek Rosa
|
r1701 | } | ||
Marek Rosa
|
r1816 | ChartAxis* QCategoryAxisPrivate::createGraphics(ChartPresenter* presenter) | ||
Marek Rosa
|
r1701 | { | ||
Marek Rosa
|
r1816 | Q_Q(QCategoryAxis); | ||
Marek Rosa
|
r1701 | if(m_orientation == Qt::Vertical){ | ||
Marek Rosa
|
r1817 | return new ChartCategoryAxisY(q,presenter); | ||
Marek Rosa
|
r1701 | }else{ | ||
Marek Rosa
|
r1817 | 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 | ||||