diff options
Diffstat (limited to 'src/charts/axis/valueaxis')
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisx.cpp | 130 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisx_p.h | 60 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisy.cpp | 130 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/chartvalueaxisy_p.h | 60 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp | 80 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/polarchartvalueaxisangular_p.h | 56 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp | 79 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/polarchartvalueaxisradial_p.h | 56 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/qvalueaxis.cpp | 459 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/qvalueaxis.h | 83 | ||||
-rw-r--r-- | src/charts/axis/valueaxis/qvalueaxis_p.h | 70 |
11 files changed, 1263 insertions, 0 deletions
diff --git a/src/charts/axis/valueaxis/chartvalueaxisx.cpp b/src/charts/axis/valueaxis/chartvalueaxisx.cpp new file mode 100644 index 00000000..abf9c434 --- /dev/null +++ b/src/charts/axis/valueaxis/chartvalueaxisx.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** 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 "chartvalueaxisx_p.h" +#include "qabstractaxis.h" +#include "chartpresenter_p.h" +#include "qvalueaxis.h" +#include "abstractchartlayout_p.h" +#include <QGraphicsLayout> +#include <qmath.h> +#include <QDebug> + + +QT_CHARTS_BEGIN_NAMESPACE + +ChartValueAxisX::ChartValueAxisX(QValueAxis *axis, QGraphicsItem *item ) + : HorizontalAxis(axis, item), + m_axis(axis) +{ + QObject::connect(m_axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); + QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString))); +} + +ChartValueAxisX::~ChartValueAxisX() +{ +} + +QVector<qreal> ChartValueAxisX::calculateLayout() const +{ + int tickCount = m_axis->tickCount(); + + Q_ASSERT(tickCount >= 2); + + QVector<qreal> points; + points.resize(tickCount); + + const QRectF &gridRect = gridGeometry(); + const qreal deltaX = gridRect.width() / (qreal(tickCount) - 1.0); + for (int i = 0; i < tickCount; ++i) + points[i] = qreal(i) * deltaX + gridRect.left(); + return points; +} + +void ChartValueAxisX::updateGeometry() +{ + const QVector<qreal>& layout = ChartAxisElement::layout(); + if (layout.isEmpty()) + return; + setLabels(createValueLabels(min(), max(), layout.size(), m_axis->labelFormat())); + HorizontalAxis::updateGeometry(); +} + +void ChartValueAxisX::handleTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if(presenter()) presenter()->layout()->invalidate(); +} + +void ChartValueAxisX::handleLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format); + QGraphicsLayoutItem::updateGeometry(); + if(presenter()) presenter()->layout()->invalidate(); +} + +QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + Q_UNUSED(constraint) + + QSizeF sh; + + QSizeF base = HorizontalAxis::sizeHint(which, constraint); + QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat()); + // Width of horizontal axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base width is irrelevant. + qreal width = 0; + qreal height = 0; + + switch (which) { + case Qt::MinimumSize: { + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), + QStringLiteral("..."), + axis()->labelsAngle()); + width = boundingRect.width() / 2.0; + height = boundingRect.height() + labelPadding() + base.height() + 1.0; + sh = QSizeF(width, height); + break; + } + case Qt::PreferredSize: { + qreal labelHeight = 0.0; + qreal firstWidth = -1.0; + foreach (const QString& s, ticksList) { + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + labelHeight = qMax(rect.height(), labelHeight); + width = rect.width(); + if (firstWidth < 0.0) + firstWidth = width; + } + height = labelHeight + labelPadding() + base.height() + 1.0; + width = qMax(width, firstWidth) / 2.0; + sh = QSizeF(width, height); + break; + } + default: + break; + } + return sh; +} + +#include "moc_chartvalueaxisx_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/valueaxis/chartvalueaxisx_p.h b/src/charts/axis/valueaxis/chartvalueaxisx_p.h new file mode 100644 index 00000000..7f83e5a3 --- /dev/null +++ b/src/charts/axis/valueaxis/chartvalueaxisx_p.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Enterprise Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef CHARTVALUEAXISX_H +#define CHARTVALUEAXISX_H + +#include "horizontalaxis_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxis; + +class ChartValueAxisX : public HorizontalAxis +{ + Q_OBJECT +public: + ChartValueAxisX(QValueAxis *axis, QGraphicsItem *item = 0); + ~ChartValueAxisX(); + + QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; +protected: + QVector<qreal> calculateLayout() const; + void updateGeometry(); +private Q_SLOTS: + void handleTickCountChanged(int tick); + void handleLabelFormatChanged(const QString &format); + +private: + QValueAxis *m_axis; +}; + +QT_CHARTS_END_NAMESPACE + +#endif /* CHARTVALUEAXISX_H */ diff --git a/src/charts/axis/valueaxis/chartvalueaxisy.cpp b/src/charts/axis/valueaxis/chartvalueaxisy.cpp new file mode 100644 index 00000000..d6b7c651 --- /dev/null +++ b/src/charts/axis/valueaxis/chartvalueaxisy.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** 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 "chartvalueaxisy_p.h" +#include "qabstractaxis.h" +#include "chartpresenter_p.h" +#include "qvalueaxis.h" +#include "abstractchartlayout_p.h" +#include <QGraphicsLayout> +#include <qmath.h> +#include <QDebug> + +QT_CHARTS_BEGIN_NAMESPACE + +ChartValueAxisY::ChartValueAxisY(QValueAxis *axis, QGraphicsItem *item) + : VerticalAxis(axis, item), + m_axis(axis) +{ + QObject::connect(m_axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); + QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString))); +} + +ChartValueAxisY::~ChartValueAxisY() +{ +} + +QVector<qreal> ChartValueAxisY::calculateLayout() const +{ + int tickCount = m_axis->tickCount(); + + Q_ASSERT(tickCount >= 2); + + QVector<qreal> points; + points.resize(tickCount); + + const QRectF &gridRect = gridGeometry(); + + const qreal deltaY = gridRect.height() / (qreal(tickCount) - 1.0); + for (int i = 0; i < tickCount; ++i) + points[i] = qreal(i) * -deltaY + gridRect.bottom(); + + return points; +} + +void ChartValueAxisY::updateGeometry() +{ + const QVector<qreal> &layout = ChartAxisElement::layout(); + if (layout.isEmpty()) + return; + setLabels(createValueLabels(min(),max(),layout.size(),m_axis->labelFormat())); + VerticalAxis::updateGeometry(); +} + +void ChartValueAxisY::handleTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) presenter()->layout()->invalidate(); +} + +void ChartValueAxisY::handleLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format); + QGraphicsLayoutItem::updateGeometry(); + if(presenter()) presenter()->layout()->invalidate(); +} + +QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + Q_UNUSED(constraint) + + QSizeF sh; + QSizeF base = VerticalAxis::sizeHint(which, constraint); + QStringList ticksList = createValueLabels(min(),max(),m_axis->tickCount(),m_axis->labelFormat()); + qreal width = 0; + // Height of vertical axis sizeHint indicates the maximum distance labels can extend past + // first and last ticks. Base height is irrelevant. + qreal height = 0; + + switch (which) { + case Qt::MinimumSize: { + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), + QStringLiteral("..."), + axis()->labelsAngle()); + width = boundingRect.width() + labelPadding() + base.width() + 1.0; + height = boundingRect.height() / 2.0; + sh = QSizeF(width, height); + break; + } + case Qt::PreferredSize: { + qreal labelWidth = 0.0; + qreal firstHeight = -1.0; + foreach (const QString& s, ticksList) { + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + labelWidth = qMax(rect.width(), labelWidth); + height = rect.height(); + if (firstHeight < 0.0) + firstHeight = height; + } + width = labelWidth + labelPadding() + base.width() + 2.0; //two pixels of tolerance + height = qMax(height, firstHeight) / 2.0; + sh = QSizeF(width, height); + break; + } + default: + break; + } + return sh; +} + +#include "moc_chartvalueaxisy_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/valueaxis/chartvalueaxisy_p.h b/src/charts/axis/valueaxis/chartvalueaxisy_p.h new file mode 100644 index 00000000..3ec30faa --- /dev/null +++ b/src/charts/axis/valueaxis/chartvalueaxisy_p.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Enterprise Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef CHARTVALUEAXISY_H +#define CHARTVALUEAXISY_H + +#include "verticalaxis_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxis; + +class ChartValueAxisY : public VerticalAxis +{ + Q_OBJECT +public: + ChartValueAxisY(QValueAxis *axis, QGraphicsItem *item = 0); + ~ChartValueAxisY(); + + QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; +protected: + QVector<qreal> calculateLayout() const; + void updateGeometry(); +private Q_SLOTS: + void handleTickCountChanged(int tick); + void handleLabelFormatChanged(const QString &format); + +private: + QValueAxis *m_axis; +}; + +QT_CHARTS_END_NAMESPACE + +#endif /* CHARTVALUEAXISY_H */ diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp b/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp new file mode 100644 index 00000000..945449a8 --- /dev/null +++ b/src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** 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 "polarchartvalueaxisangular_p.h" +#include "chartpresenter_p.h" +#include "abstractchartlayout_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +PolarChartValueAxisAngular::PolarChartValueAxisAngular(QValueAxis *axis, QGraphicsItem *item) + : PolarChartAxisAngular(axis, item) +{ + QObject::connect(axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); + QObject::connect(axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString))); +} + +PolarChartValueAxisAngular::~PolarChartValueAxisAngular() +{ +} + +QVector<qreal> PolarChartValueAxisAngular::calculateLayout() const +{ + int tickCount = static_cast<QValueAxis *>(axis())->tickCount(); + Q_ASSERT(tickCount >= 2); + + QVector<qreal> points; + points.resize(tickCount); + + const qreal d = 360.0 / qreal(tickCount - 1); + + for (int i = 0; i < tickCount; ++i) { + qreal angularCoordinate = qreal(i) * d; + points[i] = angularCoordinate; + } + + return points; +} + +void PolarChartValueAxisAngular::createAxisLabels(const QVector<qreal> &layout) +{ + QStringList labelList = createValueLabels(min(), max(), layout.size(), static_cast<QValueAxis *>(axis())->labelFormat()); + setLabels(labelList); +} + +void PolarChartValueAxisAngular::handleTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) + presenter()->layout()->invalidate(); +} + +void PolarChartValueAxisAngular::handleLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) + presenter()->layout()->invalidate(); +} + +#include "moc_polarchartvalueaxisangular_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisangular_p.h b/src/charts/axis/valueaxis/polarchartvalueaxisangular_p.h new file mode 100644 index 00000000..d4a2f653 --- /dev/null +++ b/src/charts/axis/valueaxis/polarchartvalueaxisangular_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Enterprise Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef POLARCHARTVALUEAXISANGULAR_P_H +#define POLARCHARTVALUEAXISANGULAR_P_H + +#include "polarchartaxisangular_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxis; + +class PolarChartValueAxisAngular : public PolarChartAxisAngular +{ + Q_OBJECT +public: + PolarChartValueAxisAngular(QValueAxis *axis, QGraphicsItem *item); + ~PolarChartValueAxisAngular(); + + virtual QVector<qreal> calculateLayout() const; + virtual void createAxisLabels(const QVector<qreal> &layout); + +private Q_SLOTS: + void handleTickCountChanged(int tick); + void handleLabelFormatChanged(const QString &format); +}; + +QT_CHARTS_END_NAMESPACE + +#endif // POLARCHARTVALUEAXISANGULAR_P_H diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp b/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp new file mode 100644 index 00000000..006477e8 --- /dev/null +++ b/src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** 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 "polarchartvalueaxisradial_p.h" +#include "chartpresenter_p.h" +#include "abstractchartlayout_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +PolarChartValueAxisRadial::PolarChartValueAxisRadial(QValueAxis *axis, QGraphicsItem *item) + : PolarChartAxisRadial(axis, item) +{ + QObject::connect(axis, SIGNAL(tickCountChanged(int)), this, SLOT(handleTickCountChanged(int))); + QObject::connect(axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString))); +} + +PolarChartValueAxisRadial::~PolarChartValueAxisRadial() +{ +} + +QVector<qreal> PolarChartValueAxisRadial::calculateLayout() const +{ + int tickCount = static_cast<QValueAxis *>(axis())->tickCount(); + Q_ASSERT(tickCount >= 2); + + QVector<qreal> points; + points.resize(tickCount); + + const qreal d = (axisGeometry().width() / 2) / qreal(tickCount - 1); + + for (int i = 0; i < tickCount; ++i) { + qreal radialCoordinate = qreal(i) * d; + points[i] = radialCoordinate; + } + + return points; +} + +void PolarChartValueAxisRadial::createAxisLabels(const QVector<qreal> &layout) +{ + setLabels(createValueLabels(min(), max(), layout.size(), static_cast<QValueAxis *>(axis())->labelFormat())); +} + +void PolarChartValueAxisRadial::handleTickCountChanged(int tick) +{ + Q_UNUSED(tick); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) + presenter()->layout()->invalidate(); +} + +void PolarChartValueAxisRadial::handleLabelFormatChanged(const QString &format) +{ + Q_UNUSED(format); + QGraphicsLayoutItem::updateGeometry(); + if (presenter()) + presenter()->layout()->invalidate(); +} + +#include "moc_polarchartvalueaxisradial_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/valueaxis/polarchartvalueaxisradial_p.h b/src/charts/axis/valueaxis/polarchartvalueaxisradial_p.h new file mode 100644 index 00000000..4e13b57a --- /dev/null +++ b/src/charts/axis/valueaxis/polarchartvalueaxisradial_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Enterprise Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef POLARCHARTVALUEAXISRADIAL_P_H +#define POLARCHARTVALUEAXISRADIAL_P_H + +#include "polarchartaxisradial_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxis; + +class PolarChartValueAxisRadial : public PolarChartAxisRadial +{ + Q_OBJECT +public: + PolarChartValueAxisRadial(QValueAxis *axis, QGraphicsItem *item); + ~PolarChartValueAxisRadial(); + + virtual QVector<qreal> calculateLayout() const; + virtual void createAxisLabels(const QVector<qreal> &layout); + +private Q_SLOTS: + void handleTickCountChanged(int tick); + void handleLabelFormatChanged(const QString &format); +}; + +QT_CHARTS_END_NAMESPACE + +#endif // POLARCHARTVALUEAXISRADIAL_P_H diff --git a/src/charts/axis/valueaxis/qvalueaxis.cpp b/src/charts/axis/valueaxis/qvalueaxis.cpp new file mode 100644 index 00000000..a055dc22 --- /dev/null +++ b/src/charts/axis/valueaxis/qvalueaxis.cpp @@ -0,0 +1,459 @@ +/**************************************************************************** +** +** 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 "qvalueaxis.h" +#include "qvalueaxis_p.h" +#include "chartvalueaxisx_p.h" +#include "chartvalueaxisy_p.h" +#include "abstractdomain_p.h" +#include "polarchartvalueaxisangular_p.h" +#include "polarchartvalueaxisradial_p.h" +#include "chartdataset_p.h" +#include "chartpresenter_p.h" +#include "charttheme_p.h" + + +QT_CHARTS_BEGIN_NAMESPACE +/*! + \class QValueAxis + \inmodule Qt Charts + \brief The QValueAxis class is used for manipulating chart's axis. + \mainclass + + ValueAxis can be setup to show axis line with tick marks, grid lines and shades. + Values of axis are drawn to position of ticks. + + Example code on how to use QValueAxis. + \code + QChartView *chartView = new QChartView; + QLineSeries *series = new QLineSeries; + // ... + chartView->chart()->addSeries(series); + + QValueAxis *axisX = new QValueAxis; + axisX->setRange(10, 20.5); + axisX->setTickCount(10); + axisX->setLabelFormat("%.2f"); + chartView->chart()->setAxisX(axisX, series); + \endcode +*/ +/*! + \qmltype ValueAxis + \instantiates QValueAxis + \inqmlmodule QtCharts + + \inherits AbstractAxis + \brief The ValueAxis element is used for manipulating chart's axes + + ValueAxis can be setup to show axis line with tick marks, grid lines and shades. + Values of axis are drawn to position of ticks + + Example about using ValueAxis: + \code + ChartView { + ValueAxis { + id: xAxis + min: 0 + max: 10 + } + // Add a few series... + } + \endcode +*/ + +/*! + \property QValueAxis::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. +*/ +/*! + \qmlproperty real ValueAxis::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. +*/ + +/*! + \property QValueAxis::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. +*/ +/*! + \qmlproperty real ValueAxis::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. +*/ + +/*! + \property QValueAxis::tickCount + Defines the number of ticks on the axis. This indicates how many grid lines are draw on the chart. + The default value is 5, and it can not be below 2. +*/ +/*! + \qmlproperty real ValueAxis::tickCount + Defines the number of ticks on the axis. This indicates how many grid lines are draw on the chart. + The default value is 5, and it can not be below 2. +*/ + +/*! + \property QValueAxis::labelFormat + Defines the label format of the axis. + Supported specifiers are: d, i, o, x, X, f, F, e, E, g, G, and c. + See QString::sprintf() for additional details. + + If the QChart::localizeNumbers is \c{true}, the supported specifiers are limited to: d, e, E, f, + g, G, and i. Also, only the precision modifier is supported. The rest of the formatting comes from + the default QLocale of the application. +*/ +/*! + \qmlproperty real ValueAxis::labelFormat + Defines the label format of the axis. + Supported specifiers are: d, i, o, x, X, f, F, e, E, g, G, and c. + See QString::sprintf() for additional details. + + If the ChartView::localizeNumbers is \c{true}, the supported specifiers are limited to: d, e, E, f, + g, G, and i. Also, only the precision modifier is supported. The rest of the formatting comes from + the default QLocale of the application. +*/ + +/*! + \fn void QValueAxis::minChanged(qreal min) + Axis emits signal when \a min of axis has changed. +*/ +/*! + \qmlsignal ValueAxis::onMinChanged(real min) + Axis emits signal when \a min of axis has changed. +*/ + +/*! + \fn void QValueAxis::maxChanged(qreal max) + Axis emits signal when \a max of axis has changed. +*/ +/*! + \qmlsignal ValueAxis::onMaxChanged(real max) + Axis emits signal when \a max of axis has changed. +*/ + +/*! + \fn void QValueAxis::tickCountChanged(int tickCount) + Axis emits signal when \a tickCount of axis has changed. +*/ +/*! + \qmlsignal ValueAxis::tickCountChanged(int tickCount) + Axis emits signal when \a tickCount of axis has changed. +*/ + +/*! + \fn void QValueAxis::rangeChanged(qreal min, qreal max) + Axis emits signal when \a min or \a max of axis has changed. +*/ + +/*! + \fn void QValueAxis::labelFormatChanged(const QString &format) + Axis emits signal when \a format of axis labels has changed. +*/ +/*! + \qmlsignal ValueAxis::labelFormatChanged(const QString &format) + Axis emits signal when \a format of axis labels has changed. +*/ + +/*! + \property QValueAxis::niceNumbersEnabled + \obsolete + Using this function can lead to unexpected behavior. Use applyNiceNumbers() instead. +*/ + +/*! + \qmlproperty bool ValueAxis::niceNumbersEnabled + Deprecated; Using this function can lead to unexpected behavior. Use applyNiceNumbers() instead. +*/ + +/*! + Constructs an axis object which is a child of \a parent. +*/ +QValueAxis::QValueAxis(QObject *parent) : + QAbstractAxis(*new QValueAxisPrivate(this), parent) +{ + +} + +/*! + \internal +*/ +QValueAxis::QValueAxis(QValueAxisPrivate &d, QObject *parent) + : QAbstractAxis(d, parent) +{ + +} + +/*! + Destroys the object +*/ +QValueAxis::~QValueAxis() +{ + Q_D(QValueAxis); + if (d->m_chart) + d->m_chart->removeAxis(this); +} + +void QValueAxis::setMin(qreal min) +{ + Q_D(QValueAxis); + setRange(min, qMax(d->m_max, min)); +} + +qreal QValueAxis::min() const +{ + Q_D(const QValueAxis); + return d->m_min; +} + +void QValueAxis::setMax(qreal max) +{ + Q_D(QValueAxis); + setRange(qMin(d->m_min, max), max); +} + +qreal QValueAxis::max() const +{ + Q_D(const QValueAxis); + 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 QValueAxis::setRange(qreal min, qreal max) +{ + Q_D(QValueAxis); + d->setRange(min,max); +} + +void QValueAxis::setTickCount(int count) +{ + Q_D(QValueAxis); + if (d->m_tickCount != count && count >= 2) { + d->m_tickCount = count; + emit tickCountChanged(count); + } +} + +int QValueAxis::tickCount() const +{ + Q_D(const QValueAxis); + return d->m_tickCount; +} + +void QValueAxis::setNiceNumbersEnabled(bool enable) +{ + Q_D(QValueAxis); + qWarning() << "Deprecated; Using this function can lead to unexpected behavior. " \ + "Use applyNiceNumbers() instead."; + if(enable) { + QObject::connect(this,SIGNAL(rangeChanged(qreal,qreal)),this,SLOT(applyNiceNumbers())); + QObject::connect(this,SIGNAL(tickCountChanged(int)),this,SLOT(applyNiceNumbers())); + applyNiceNumbers(); + } + else { + QObject::disconnect(this,SIGNAL(rangeChanged(qreal,qreal)),this,SLOT(applyNiceNumbers())); + QObject::disconnect(this,SIGNAL(tickCountChanged(int)),this,SLOT(applyNiceNumbers())); + } + d->m_niceNumbersEnabled=enable; +} + +bool QValueAxis::niceNumbersEnabled() const +{ + Q_D(const QValueAxis); + qWarning() << "Deprecated; Using this function can lead to unexpected behavior. " \ + "Use applyNiceNumbers() instead."; + return d->m_niceNumbersEnabled; +} + +void QValueAxis::setLabelFormat(const QString &format) +{ + Q_D(QValueAxis); + d->m_format = format; + emit labelFormatChanged(format); +} + +QString QValueAxis::labelFormat() const +{ + Q_D(const QValueAxis); + return d->m_format; +} + +/*! + Returns the type of the axis +*/ +QAbstractAxis::AxisType QValueAxis::type() const +{ + return AxisTypeValue; +} + +/*! + This method modifies range and number of ticks on the axis to look "nice". Algorithm considers numbers that + can be expressed as form of 1*10^n, 2* 10^n or 5*10^n as a nice numbers. These numbers are used for spacing the ticks. + This method will modify the current range and number of ticks. + \sa setRange(), setTickCount() +*/ +void QValueAxis::applyNiceNumbers() +{ + Q_D(QValueAxis); + if(d->m_applying) return; + qreal min = d->m_min; + qreal max = d->m_max; + int ticks = d->m_tickCount; + AbstractDomain::looseNiceNumbers(min,max,ticks); + d->m_applying=true; + d->setRange(min,max); + setTickCount(ticks); + d->m_applying=false; +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +QValueAxisPrivate::QValueAxisPrivate(QValueAxis *q) + : QAbstractAxisPrivate(q), + m_min(0), + m_max(0), + m_tickCount(5), + m_format(QString::null), + m_applying(false), + m_niceNumbersEnabled(false) +{ + +} + +QValueAxisPrivate::~QValueAxisPrivate() +{ + +} + +void QValueAxisPrivate::setMin(const QVariant &min) +{ + Q_Q(QValueAxis); + bool ok; + qreal value = min.toReal(&ok); + if (ok) + q->setMin(value); +} + +void QValueAxisPrivate::setMax(const QVariant &max) +{ + Q_Q(QValueAxis); + bool ok; + qreal value = max.toReal(&ok); + if (ok) + q->setMax(value); +} + +void QValueAxisPrivate::setRange(const QVariant &min, const QVariant &max) +{ + Q_Q(QValueAxis); + bool ok1; + bool ok2; + qreal value1 = min.toReal(&ok1); + qreal value2 = max.toReal(&ok2); + if (ok1 && ok2) + q->setRange(value1, value2); +} + +void QValueAxisPrivate::setRange(qreal min, qreal max) +{ + Q_Q(QValueAxis); + bool changed = false; + + if (min > max) + return; + + bool changeMin = false; + if (m_min == 0 || min == 0) + changeMin = !qFuzzyCompare(1 + m_min, 1 + min); + else + changeMin = !qFuzzyCompare(m_min, min); + + bool changeMax = false; + if (m_max == 0 || max == 0) + changeMax = !qFuzzyCompare(1 + m_max, 1 + max); + else + changeMax = !qFuzzyCompare(m_max, max); + + if (changeMin) { + m_min = min; + changed = true; + emit q->minChanged(min); + } + + if (changeMax) { + m_max = max; + changed = true; + emit q->maxChanged(max); + } + + if (changed) { + emit rangeChanged(min,max); + emit q->rangeChanged(min, max); + } +} + +void QValueAxisPrivate::initializeGraphics(QGraphicsItem *parent) +{ + Q_Q(QValueAxis); + ChartAxisElement *axis(0); + + if (m_chart->chartType() == QChart::ChartTypeCartesian) { + if (orientation() == Qt::Vertical) + axis = new ChartValueAxisY(q,parent); + if (orientation() == Qt::Horizontal) + axis = new ChartValueAxisX(q,parent); + } + + if (m_chart->chartType() == QChart::ChartTypePolar) { + if (orientation() == Qt::Vertical) + axis = new PolarChartValueAxisRadial(q, parent); + if (orientation() == Qt::Horizontal) + axis = new PolarChartValueAxisAngular(q, parent); + } + + m_item.reset(axis); + QAbstractAxisPrivate::initializeGraphics(parent); +} + + +void QValueAxisPrivate::initializeDomain(AbstractDomain *domain) +{ + if (orientation() == Qt::Vertical) { + if (!qFuzzyIsNull(m_max - m_min)) + domain->setRangeY(m_min, m_max); + else + setRange(domain->minY(), domain->maxY()); + } + if (orientation() == Qt::Horizontal) { + if (!qFuzzyIsNull(m_max - m_min)) + domain->setRangeX(m_min, m_max); + else + setRange(domain->minX(), domain->maxX()); + } +} + +#include "moc_qvalueaxis.cpp" +#include "moc_qvalueaxis_p.cpp" + +QT_CHARTS_END_NAMESPACE diff --git a/src/charts/axis/valueaxis/qvalueaxis.h b/src/charts/axis/valueaxis/qvalueaxis.h new file mode 100644 index 00000000..a51203a4 --- /dev/null +++ b/src/charts/axis/valueaxis/qvalueaxis.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef QVALUEAXIS_H +#define QVALUEAXIS_H + +#include <QtCharts/qabstractaxis.h> + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxisPrivate; + +class QT_CHARTS_EXPORT QValueAxis : public QAbstractAxis +{ + Q_OBJECT + Q_PROPERTY(int tickCount READ tickCount WRITE setTickCount NOTIFY tickCountChanged) + Q_PROPERTY(bool niceNumbersEnabled READ niceNumbersEnabled WRITE setNiceNumbersEnabled) + Q_PROPERTY(qreal min READ min WRITE setMin NOTIFY minChanged) + Q_PROPERTY(qreal max READ max WRITE setMax NOTIFY maxChanged) + Q_PROPERTY(QString labelFormat READ labelFormat WRITE setLabelFormat NOTIFY labelFormatChanged) + +public: + explicit QValueAxis(QObject *parent = 0); + ~QValueAxis(); + +protected: + QValueAxis(QValueAxisPrivate &d, QObject *parent = 0); + +public: + AxisType type() const; + + //range handling + void setMin(qreal min); + qreal min() const; + void setMax(qreal max); + qreal max() const; + void setRange(qreal min, qreal max); + + //ticks handling + void setTickCount(int count); + int tickCount() const; + + void setLabelFormat(const QString &format); + QString labelFormat() const; + + void setNiceNumbersEnabled(bool enable = true); + bool niceNumbersEnabled() const; + +public Q_SLOTS: + void applyNiceNumbers(); + +Q_SIGNALS: + void minChanged(qreal min); + void maxChanged(qreal max); + void rangeChanged(qreal min, qreal max); + void tickCountChanged(int tickCount); + void labelFormatChanged(const QString &format); + +private: + Q_DECLARE_PRIVATE(QValueAxis) + Q_DISABLE_COPY(QValueAxis) +}; + +QT_CHARTS_END_NAMESPACE + +#endif // QVALUEAXIS_H diff --git a/src/charts/axis/valueaxis/qvalueaxis_p.h b/src/charts/axis/valueaxis/qvalueaxis_p.h new file mode 100644 index 00000000..a1d9de5b --- /dev/null +++ b/src/charts/axis/valueaxis/qvalueaxis_p.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +// W A R N I N G +// ------------- +// +// This file is not part of the Qt Enterprise Chart API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#ifndef QVALUEAXIS_P_H +#define QVALUEAXIS_P_H + +#include <qvalueaxis.h> +#include "qabstractaxis_p.h" + +QT_CHARTS_BEGIN_NAMESPACE + +class QValueAxisPrivate : public QAbstractAxisPrivate +{ + Q_OBJECT +public: + QValueAxisPrivate(QValueAxis *q); + ~QValueAxisPrivate(); + +public: + void initializeGraphics(QGraphicsItem* parent); + void initializeDomain(AbstractDomain *domain); + + qreal min() { return m_min; }; + qreal max() { return m_max; }; + void setRange(qreal min,qreal max); + +protected: + void setMin(const QVariant &min); + void setMax(const QVariant &max); + void setRange(const QVariant &min, const QVariant &max); + +private: + qreal m_min; + qreal m_max; + int m_tickCount; + QString m_format; + bool m_applying; + bool m_niceNumbersEnabled; + Q_DECLARE_PUBLIC(QValueAxis) +}; + +QT_CHARTS_END_NAMESPACE + +#endif // QVALUEAXIS_P_H |