diff options
author | Titta Heikkala <titta.heikkala@theqtcompany.com> | 2015-06-11 12:08:58 +0300 |
---|---|---|
committer | Titta Heikkala <titta.heikkala@theqtcompany.com> | 2015-06-17 11:02:08 +0300 |
commit | 740f4f94adf83f2613161f2ff578ff37eeb89dc6 (patch) | |
tree | e13a491e6fbcf5b7887c284464edce8798fb737b /src/charts | |
parent | ce2af37ac88e8bcca6ab0490f2998b5c9e056acf (diff) |
Added possibility to set labels position for QCategoryAxis
The position of the labels in QCategyAxis can now be set to center of
the category or to the high end of the category. The first and the last
labels may overlap with other axes labels when positioned on value.
Change-Id: Ide0f12b723ffabf6682001e03ea5080f9642da22
Task-number: QTRD-1715
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>
Diffstat (limited to 'src/charts')
-rw-r--r-- | src/charts/axis/categoryaxis/qcategoryaxis.cpp | 37 | ||||
-rw-r--r-- | src/charts/axis/categoryaxis/qcategoryaxis.h | 12 | ||||
-rw-r--r-- | src/charts/axis/categoryaxis/qcategoryaxis_p.h | 1 | ||||
-rw-r--r-- | src/charts/axis/horizontalaxis.cpp | 27 | ||||
-rw-r--r-- | src/charts/axis/verticalaxis.cpp | 35 |
5 files changed, 99 insertions, 13 deletions
diff --git a/src/charts/axis/categoryaxis/qcategoryaxis.cpp b/src/charts/axis/categoryaxis/qcategoryaxis.cpp index 70f84b6c..d550bb13 100644 --- a/src/charts/axis/categoryaxis/qcategoryaxis.cpp +++ b/src/charts/axis/categoryaxis/qcategoryaxis.cpp @@ -99,6 +99,25 @@ QT_CHARTS_BEGIN_NAMESPACE Axis emits signal when the categories of the axis have changed. */ +/*! + \enum QCategoryAxis::AxisLabelsPosition + + This enum describes the position of the category labels. + + \value AxisLabelsPositionCenter Labels are centered to category. + \value AxisLabelsPositionOnValue Labels are positioned to the high end limit of the category. + */ +/*! + \property QCategoryAxis::labelsPosition + Defines the position of the category labels. The labels in the beginning and in the end of the + axes may overlap other axes labels when positioned on value. +*/ +/*! + \qmlproperty AxisLabelsPosition CategoryAxis::labelsPosition + Defines the position of the category labels. The labels in the beginning and in the end of the + axes may overlap other axes labels when positioned on value. +*/ + /*! Constructs an axis object which is a child of \a parent. @@ -284,11 +303,27 @@ QAbstractAxis::AxisType QCategoryAxis::type() const return QAbstractAxis::AxisTypeCategory; } +void QCategoryAxis::setLabelsPosition(QCategoryAxis::AxisLabelsPosition position) +{ + Q_D(QCategoryAxis); + if (d->m_labelsPosition != position) { + d->m_labelsPosition = position; + emit labelsPositionChanged(position); + } +} + +QCategoryAxis::AxisLabelsPosition QCategoryAxis::labelsPosition() const +{ + Q_D(const QCategoryAxis); + return d->m_labelsPosition; +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// QCategoryAxisPrivate::QCategoryAxisPrivate(QCategoryAxis *q) : QValueAxisPrivate(q), - m_categoryMinimum(0) + m_categoryMinimum(0), + m_labelsPosition(QCategoryAxis::AxisLabelsPositionCenter) { } diff --git a/src/charts/axis/categoryaxis/qcategoryaxis.h b/src/charts/axis/categoryaxis/qcategoryaxis.h index 43743a4b..d2211629 100644 --- a/src/charts/axis/categoryaxis/qcategoryaxis.h +++ b/src/charts/axis/categoryaxis/qcategoryaxis.h @@ -32,8 +32,16 @@ class QT_CHARTS_EXPORT QCategoryAxis : public QValueAxis Q_PROPERTY(qreal startValue READ startValue WRITE setStartValue) Q_PROPERTY(int count READ count) Q_PROPERTY(QStringList categoriesLabels READ categoriesLabels) + Q_PROPERTY(AxisLabelsPosition labelsPosition READ labelsPosition WRITE setLabelsPosition NOTIFY labelsPositionChanged) + Q_ENUMS(AxisLabelsPosition) public: + + enum AxisLabelsPosition { + AxisLabelsPositionCenter = 0x0, + AxisLabelsPositionOnValue = 0x1 + }; + explicit QCategoryAxis(QObject *parent = 0); ~QCategoryAxis(); @@ -55,8 +63,12 @@ public: QStringList categoriesLabels(); int count() const; + QCategoryAxis::AxisLabelsPosition labelsPosition() const; + void setLabelsPosition(QCategoryAxis::AxisLabelsPosition position); + Q_SIGNALS: void categoriesChanged(); + void labelsPositionChanged(QCategoryAxis::AxisLabelsPosition position); private: Q_DECLARE_PRIVATE(QCategoryAxis) diff --git a/src/charts/axis/categoryaxis/qcategoryaxis_p.h b/src/charts/axis/categoryaxis/qcategoryaxis_p.h index 78a24e24..c852de47 100644 --- a/src/charts/axis/categoryaxis/qcategoryaxis_p.h +++ b/src/charts/axis/categoryaxis/qcategoryaxis_p.h @@ -50,6 +50,7 @@ private: QMap<QString , Range> m_categoriesMap; QStringList m_categories; qreal m_categoryMinimum; + QCategoryAxis::AxisLabelsPosition m_labelsPosition; private: Q_DECLARE_PUBLIC(QCategoryAxis) diff --git a/src/charts/axis/horizontalaxis.cpp b/src/charts/axis/horizontalaxis.cpp index 10f6a55b..f2dfdcf0 100644 --- a/src/charts/axis/horizontalaxis.cpp +++ b/src/charts/axis/horizontalaxis.cpp @@ -19,6 +19,7 @@ #include <private/horizontalaxis_p.h> #include <private/qabstractaxis_p.h> #include <private/chartpresenter_p.h> +#include <QtCharts/QCategoryAxis> #include <QtCore/QtMath> #include <QtCore/QDebug> @@ -142,12 +143,28 @@ void HorizontalAxis::updateGeometry() qreal leftBound = qMax(layout[i], gridRect.left()); qreal rightBound = qMin(layout[i + 1], gridRect.right()); const qreal delta = rightBound - leftBound; - // Hide label in case visible part of the category at the grid edge is too narrow - if (delta < boundingRect.width() - && (leftBound == gridRect.left() || rightBound == gridRect.right())) { - forceHide = true; + if (axis()->type() != QAbstractAxis::AxisTypeCategory) { + // Hide label in case visible part of the category at the grid edge is too narrow + if (delta < boundingRect.width() + && (leftBound == gridRect.left() || rightBound == gridRect.right())) { + forceHide = true; + } else { + labelItem->setPos(leftBound + (delta / 2.0) - center.x(), labelItem->pos().y()); + } } else { - labelItem->setPos(leftBound + (delta / 2.0) - center.x(), labelItem->pos().y()); + QCategoryAxis *categoryAxis = static_cast<QCategoryAxis *>(axis()); + if (categoryAxis->labelsPosition() == QCategoryAxis::AxisLabelsPositionCenter) { + if (delta < boundingRect.width() + && (leftBound == gridRect.left() || rightBound == gridRect.right())) { + forceHide = true; + } else { + labelItem->setPos(leftBound + (delta / 2.0) - center.x(), + labelItem->pos().y()); + } + } else if (categoryAxis->labelsPosition() + == QCategoryAxis::AxisLabelsPositionOnValue) { + labelItem->setPos(rightBound - center.x(), labelItem->pos().y()); + } } } diff --git a/src/charts/axis/verticalaxis.cpp b/src/charts/axis/verticalaxis.cpp index 50ce37e1..89760c3a 100644 --- a/src/charts/axis/verticalaxis.cpp +++ b/src/charts/axis/verticalaxis.cpp @@ -19,6 +19,7 @@ #include <private/verticalaxis_p.h> #include <QtCharts/QAbstractAxis> #include <private/chartpresenter_p.h> +#include <QtCharts/QCategoryAxis> #include <QtCore/QDebug> QT_CHARTS_BEGIN_NAMESPACE @@ -140,23 +141,43 @@ void VerticalAxis::updateGeometry() //label in between bool forceHide = false; + bool labelOnValue = false; if (intervalAxis() && (i + 1) != layout.size()) { qreal lowerBound = qMin(layout[i], gridRect.bottom()); qreal upperBound = qMax(layout[i + 1], gridRect.top()); const qreal delta = lowerBound - upperBound; - // Hide label in case visible part of the category at the grid edge is too narrow - if (delta < boundingRect.height() - && (lowerBound == gridRect.bottom() || upperBound == gridRect.top())) { - forceHide = true; + if (axis()->type() != QAbstractAxis::AxisTypeCategory) { + // Hide label in case visible part of the category at the grid edge is too narrow + if (delta < boundingRect.height() + && (lowerBound == gridRect.bottom() || upperBound == gridRect.top())) { + forceHide = true; + } else { + labelItem->setPos(labelItem->pos().x(), + lowerBound - (delta / 2.0) - center.y()); + } } else { - labelItem->setPos(labelItem->pos().x() , lowerBound - (delta / 2.0) - center.y()); + QCategoryAxis *categoryAxis = static_cast<QCategoryAxis *>(axis()); + if (categoryAxis->labelsPosition() == QCategoryAxis::AxisLabelsPositionCenter) { + if (delta < boundingRect.height() + && (lowerBound == gridRect.bottom() || upperBound == gridRect.top())) { + forceHide = true; + } else { + labelItem->setPos(labelItem->pos().x(), + lowerBound - (delta / 2.0) - center.y()); + } + } else if (categoryAxis->labelsPosition() + == QCategoryAxis::AxisLabelsPositionOnValue) { + labelOnValue = true; + labelItem->setPos(labelItem->pos().x(), upperBound - center.y()); + } } } //label overlap detection - compensate one pixel for rounding errors if (labelItem->pos().y() + boundingRect.height() > height || forceHide || - (labelItem->pos().y() + (heightDiff / 2.0) - 1.0) > axisRect.bottom() || - labelItem->pos().y() + (heightDiff / 2.0) < (axisRect.top() - 1.0)) { + ((labelItem->pos().y() + (heightDiff / 2.0) - 1.0) > axisRect.bottom() + && !labelOnValue) || + (labelItem->pos().y() + (heightDiff / 2.0) < (axisRect.top() - 1.0) && !labelOnValue)) { labelItem->setVisible(false); } else { |