qlogvalueaxis.cpp
333 lines
| 7.8 KiB
| text/x-c
|
CppLexer
Marek Rosa
|
r2274 | /**************************************************************************** | ||
** | ||||
Miikka Heikkinen
|
r2432 | ** Copyright (C) 2013 Digia Plc | ||
Marek Rosa
|
r2274 | ** 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$ | ||||
** | ||||
****************************************************************************/ | ||||
#include "qlogvalueaxis.h" | ||||
#include "qlogvalueaxis_p.h" | ||||
#include "chartlogvalueaxisx_p.h" | ||||
#include "chartlogvalueaxisy_p.h" | ||||
Marek Rosa
|
r2275 | #include "abstractdomain_p.h" | ||
Marek Rosa
|
r2274 | #include <float.h> | ||
#include <cmath> | ||||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
/*! | ||||
\class QLogValueAxis | ||||
\brief The QLogValueAxis class is used for manipulating chart's axis. | ||||
\mainclass | ||||
Miikka Heikkinen
|
r2430 | |||
\note If a QLogValueAxis is attached to a series with one or more points with | ||||
negative or zero values on the associated dimension, the series will not be | ||||
plotted at all. This is particularly relevant when XYModelMappers are used, | ||||
since empty cells in models typically contain zero values. | ||||
Marek Rosa
|
r2274 | */ | ||
/*! | ||||
\property QLogValueAxis::min | ||||
Defines the minimum value on the axis. | ||||
When setting this property the max is adjusted if necessary, to ensure that the range remains valid. | ||||
Marek Rosa
|
r2338 | Value has to be greater then 0. | ||
Marek Rosa
|
r2274 | */ | ||
/*! | ||||
\property QLogValueAxis::max | ||||
Defines the maximum value on the axis. | ||||
When setting this property the min is adjusted if necessary, to ensure that the range remains valid. | ||||
Marek Rosa
|
r2338 | Value has to be greater then 0. | ||
Marek Rosa
|
r2274 | */ | ||
Marek Rosa
|
r2338 | |||
/*! | ||||
\property QLogValueAxis::base | ||||
Defines the base of the logarithm. | ||||
Value has to be greater then 0 and not equal 1 | ||||
*/ | ||||
/*! | ||||
\property QLogValueAxis::labelFormat | ||||
Defines the label format of the axis. | ||||
Supported specifiers are: d, i, o, x, X, f, F, e, E, g, G, c | ||||
See QString::sprintf() for additional details. | ||||
*/ | ||||
Marek Rosa
|
r2274 | |||
/*! | ||||
\fn void QLogValueAxis::minChanged(qreal min) | ||||
Axis emits signal when \a min of axis has changed. | ||||
*/ | ||||
/*! | ||||
\fn void QLogValueAxis::maxChanged(qreal max) | ||||
Axis emits signal when \a max of axis has changed. | ||||
*/ | ||||
/*! | ||||
\fn void QLogValueAxis::rangeChanged(qreal min, qreal max) | ||||
Axis emits signal when \a min or \a max of axis has changed. | ||||
*/ | ||||
Marek Rosa
|
r2338 | /*! | ||
\fn void QLogValueAxis::labelFormatChanged(const QString &format) | ||||
Axis emits signal when \a format of axis labels has changed. | ||||
*/ | ||||
/*! | ||||
\fn void QLogValueAxis::baseChanged(qreal base) | ||||
Axis emits signal when \a base of logarithm of the axis has changed. | ||||
*/ | ||||
Marek Rosa
|
r2274 | /*! | ||
Constructs an axis object which is a child of \a parent. | ||||
*/ | ||||
QLogValueAxis::QLogValueAxis(QObject *parent) : | ||||
QAbstractAxis(*new QLogValueAxisPrivate(this), parent) | ||||
{ | ||||
} | ||||
/*! | ||||
\internal | ||||
*/ | ||||
QLogValueAxis::QLogValueAxis(QLogValueAxisPrivate &d, QObject *parent) : QAbstractAxis(d, parent) | ||||
{ | ||||
} | ||||
/*! | ||||
Destroys the object | ||||
*/ | ||||
QLogValueAxis::~QLogValueAxis() | ||||
{ | ||||
Marek Rosa
|
r2304 | Q_D(QLogValueAxis); | ||
if (d->m_chart) | ||||
d->m_chart->removeAxis(this); | ||||
Marek Rosa
|
r2274 | } | ||
void QLogValueAxis::setMin(qreal min) | ||||
{ | ||||
Q_D(QLogValueAxis); | ||||
setRange(min, qMax(d->m_max, min)); | ||||
} | ||||
qreal QLogValueAxis::min() const | ||||
{ | ||||
Q_D(const QLogValueAxis); | ||||
return d->m_min; | ||||
} | ||||
void QLogValueAxis::setMax(qreal max) | ||||
{ | ||||
Q_D(QLogValueAxis); | ||||
setRange(qMin(d->m_min, max), max); | ||||
} | ||||
qreal QLogValueAxis::max() const | ||||
{ | ||||
Q_D(const QLogValueAxis); | ||||
return d->m_max; | ||||
} | ||||
/*! | ||||
Sets range from \a min to \a max on the axis. | ||||
If min is greater than max then this function returns without making any changes. | ||||
*/ | ||||
void QLogValueAxis::setRange(qreal min, qreal max) | ||||
Michal Klocek
|
r2333 | { | ||
Marek Rosa
|
r2274 | Q_D(QLogValueAxis); | ||
bool changed = false; | ||||
if (min > max) | ||||
return; | ||||
if (min > 0) { | ||||
if (!qFuzzyCompare(d->m_min, min)) { | ||||
d->m_min = min; | ||||
changed = true; | ||||
emit minChanged(min); | ||||
} | ||||
if (!qFuzzyCompare(d->m_max, max)) { | ||||
d->m_max = max; | ||||
changed = true; | ||||
emit maxChanged(max); | ||||
} | ||||
if (changed) { | ||||
emit rangeChanged(min, max); | ||||
emit d->rangeChanged(min,max); | ||||
} | ||||
} | ||||
} | ||||
void QLogValueAxis::setLabelFormat(const QString &format) | ||||
{ | ||||
Q_D(QLogValueAxis); | ||||
d->m_format = format; | ||||
Marek Rosa
|
r2319 | emit labelFormatChanged(format); | ||
Marek Rosa
|
r2274 | } | ||
QString QLogValueAxis::labelFormat() const | ||||
{ | ||||
Q_D(const QLogValueAxis); | ||||
return d->m_format; | ||||
} | ||||
void QLogValueAxis::setBase(qreal base) | ||||
{ | ||||
// check if base is correct | ||||
Marek Rosa
|
r2283 | if (qFuzzyCompare(base, 1)) | ||
Marek Rosa
|
r2274 | return; | ||
Marek Rosa
|
r2283 | if (base > 0) { | ||
Q_D(QLogValueAxis); | ||||
d->m_base = base; | ||||
Marek Rosa
|
r2290 | emit baseChanged(base); | ||
Marek Rosa
|
r2283 | } | ||
Marek Rosa
|
r2274 | } | ||
qreal QLogValueAxis::base() const | ||||
{ | ||||
Q_D(const QLogValueAxis); | ||||
return d->m_base; | ||||
} | ||||
/*! | ||||
Returns the type of the axis | ||||
*/ | ||||
QAbstractAxis::AxisType QLogValueAxis::type() const | ||||
{ | ||||
return AxisTypeLogValue; | ||||
} | ||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
QLogValueAxisPrivate::QLogValueAxisPrivate(QLogValueAxis *q) | ||||
: QAbstractAxisPrivate(q), | ||||
m_min(1), | ||||
Marek Rosa
|
r2304 | m_max(1), | ||
Marek Rosa
|
r2274 | m_base(10), | ||
m_format(QString::null) | ||||
{ | ||||
} | ||||
QLogValueAxisPrivate::~QLogValueAxisPrivate() | ||||
{ | ||||
} | ||||
void QLogValueAxisPrivate::setMin(const QVariant &min) | ||||
{ | ||||
Q_Q(QLogValueAxis); | ||||
bool ok; | ||||
qreal value = min.toReal(&ok); | ||||
if (ok) | ||||
q->setMin(value); | ||||
} | ||||
void QLogValueAxisPrivate::setMax(const QVariant &max) | ||||
{ | ||||
Q_Q(QLogValueAxis); | ||||
bool ok; | ||||
qreal value = max.toReal(&ok); | ||||
if (ok) | ||||
q->setMax(value); | ||||
} | ||||
void QLogValueAxisPrivate::setRange(const QVariant &min, const QVariant &max) | ||||
{ | ||||
Q_Q(QLogValueAxis); | ||||
bool ok1; | ||||
bool ok2; | ||||
qreal value1 = min.toReal(&ok1); | ||||
qreal value2 = max.toReal(&ok2); | ||||
if (ok1 && ok2) | ||||
q->setRange(value1, value2); | ||||
} | ||||
void QLogValueAxisPrivate::setRange(qreal min, qreal max) | ||||
{ | ||||
Q_Q(QLogValueAxis); | ||||
bool changed = false; | ||||
if (min > max) | ||||
return; | ||||
if (min > 0) { | ||||
if (!qFuzzyCompare(m_min, min)) { | ||||
m_min = min; | ||||
changed = true; | ||||
emit q->minChanged(min); | ||||
} | ||||
if (!qFuzzyCompare(m_max, max)) { | ||||
m_max = max; | ||||
changed = true; | ||||
emit q->maxChanged(max); | ||||
} | ||||
if (changed) { | ||||
emit rangeChanged(min,max); | ||||
Michal Klocek
|
r2333 | emit q->rangeChanged(min, max); | ||
Marek Rosa
|
r2274 | } | ||
} | ||||
} | ||||
void QLogValueAxisPrivate::initializeGraphics(QGraphicsItem* parent) | ||||
{ | ||||
Q_Q(QLogValueAxis); | ||||
ChartAxis* axis(0); | ||||
if (orientation() == Qt::Vertical) | ||||
axis = new ChartLogValueAxisY(q,parent); | ||||
if (orientation() == Qt::Horizontal) | ||||
axis = new ChartLogValueAxisX(q,parent); | ||||
m_item.reset(axis); | ||||
QAbstractAxisPrivate::initializeGraphics(parent); | ||||
} | ||||
Marek Rosa
|
r2275 | void QLogValueAxisPrivate::initializeDomain(AbstractDomain *domain) | ||
Marek Rosa
|
r2274 | { | ||
if (orientation() == Qt::Vertical) { | ||||
if(!qFuzzyCompare(m_max, m_min)) { | ||||
domain->setRangeY(m_min, m_max); | ||||
Marek Rosa
|
r2355 | } else if ( domain->minY() > 0) { | ||
Marek Rosa
|
r2304 | setRange(domain->minY(), domain->maxY()); | ||
Marek Rosa
|
r2355 | } else if (domain->maxY() > 0) { | ||
Marek Rosa
|
r2304 | domain->setRangeY(m_min, domain->maxY()); | ||
Marek Rosa
|
r2355 | } else { | ||
domain->setRangeY(1, 10); | ||||
Marek Rosa
|
r2274 | } | ||
} | ||||
if (orientation() == Qt::Horizontal) { | ||||
if(!qFuzzyCompare(m_max, m_min)) { | ||||
domain->setRangeX(m_min, m_max); | ||||
Marek Rosa
|
r2355 | } else if (domain->minX() > 0){ | ||
Marek Rosa
|
r2304 | setRange(domain->minX(), domain->maxX()); | ||
Marek Rosa
|
r2355 | } else if (domain->maxX() > 0) { | ||
Marek Rosa
|
r2304 | domain->setRangeX(m_min, domain->maxX()); | ||
Marek Rosa
|
r2355 | } else { | ||
domain->setRangeX(1, 10); | ||||
Marek Rosa
|
r2274 | } | ||
} | ||||
} | ||||
#include "moc_qlogvalueaxis.cpp" | ||||
#include "moc_qlogvalueaxis_p.cpp" | ||||
QTCOMMERCIALCHART_END_NAMESPACE | ||||