summaryrefslogtreecommitdiffstats
path: root/src/charts/axis/valueaxis
diff options
context:
space:
mode:
Diffstat (limited to 'src/charts/axis/valueaxis')
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisx.cpp130
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisx_p.h60
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisy.cpp130
-rw-r--r--src/charts/axis/valueaxis/chartvalueaxisy_p.h60
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisangular.cpp80
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisangular_p.h56
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisradial.cpp79
-rw-r--r--src/charts/axis/valueaxis/polarchartvalueaxisradial_p.h56
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis.cpp459
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis.h83
-rw-r--r--src/charts/axis/valueaxis/qvalueaxis_p.h70
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