summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/axis
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/axis')
-rw-r--r--src/datavisualization/axis/qabstract3daxis.cpp4
-rw-r--r--src/datavisualization/axis/qabstract3daxis_p.h2
-rw-r--r--src/datavisualization/axis/qlogvalue3daxisformatter.cpp70
-rw-r--r--src/datavisualization/axis/qlogvalue3daxisformatter.h3
-rw-r--r--src/datavisualization/axis/qlogvalue3daxisformatter_p.h1
-rw-r--r--src/datavisualization/axis/qvalue3daxis.cpp14
-rw-r--r--src/datavisualization/axis/qvalue3daxis_p.h2
-rw-r--r--src/datavisualization/axis/qvalue3daxisformatter.cpp87
-rw-r--r--src/datavisualization/axis/qvalue3daxisformatter.h13
-rw-r--r--src/datavisualization/axis/qvalue3daxisformatter_p.h7
10 files changed, 98 insertions, 105 deletions
diff --git a/src/datavisualization/axis/qabstract3daxis.cpp b/src/datavisualization/axis/qabstract3daxis.cpp
index 3b60ff5d..94ff4283 100644
--- a/src/datavisualization/axis/qabstract3daxis.cpp
+++ b/src/datavisualization/axis/qabstract3daxis.cpp
@@ -288,7 +288,7 @@ void QAbstract3DAxisPrivate::updateLabels()
// Default implementation does nothing
}
-void QAbstract3DAxisPrivate::setRange(float min, float max)
+void QAbstract3DAxisPrivate::setRange(float min, float max, bool suppressWarnings)
{
bool adjusted = false;
if (!allowNegatives()) {
@@ -332,7 +332,7 @@ void QAbstract3DAxisPrivate::setRange(float min, float max)
}
if (minDirty || maxDirty) {
- if (adjusted) {
+ if (adjusted && !suppressWarnings) {
qWarning() << "Warning: Tried to set invalid range for axis."
" Range automatically adjusted to a valid one:"
<< min << "-" << max << "-->" << m_min << "-" << m_max;
diff --git a/src/datavisualization/axis/qabstract3daxis_p.h b/src/datavisualization/axis/qabstract3daxis_p.h
index 80f8f0b2..38d5361c 100644
--- a/src/datavisualization/axis/qabstract3daxis_p.h
+++ b/src/datavisualization/axis/qabstract3daxis_p.h
@@ -47,7 +47,7 @@ public:
inline bool isDefaultAxis() { return m_isDefaultAxis; }
inline void setDefaultAxis(bool isDefault) { m_isDefaultAxis = isDefault; }
- virtual void setRange(float min, float max);
+ virtual void setRange(float min, float max, bool suppressWarnings = false);
virtual void setMin(float min);
virtual void setMax (float max);
diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp
index e8c2fbad..128d784d 100644
--- a/src/datavisualization/axis/qlogvalue3daxisformatter.cpp
+++ b/src/datavisualization/axis/qlogvalue3daxisformatter.cpp
@@ -96,6 +96,8 @@ QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPriva
QObject *parent) :
QValue3DAxisFormatter(d, parent)
{
+ setAllowNegatives(false);
+ setAllowZero(false);
}
/*!
@@ -104,6 +106,8 @@ QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPriva
QLogValue3DAxisFormatter::QLogValue3DAxisFormatter(QObject *parent) :
QValue3DAxisFormatter(new QLogValue3DAxisFormatterPrivate(this), parent)
{
+ setAllowNegatives(false);
+ setAllowZero(false);
}
/*!
@@ -200,22 +204,6 @@ bool QLogValue3DAxisFormatter::showEdgeLabels() const
/*!
* \internal
*/
-bool QLogValue3DAxisFormatter::allowNegatives() const
-{
- return false;
-}
-
-/*!
- * \internal
- */
-bool QLogValue3DAxisFormatter::allowZero() const
-{
- return false;
-}
-
-/*!
- * \internal
- */
QValue3DAxisFormatter *QLogValue3DAxisFormatter::createNewInstance() const
{
return new QLogValue3DAxisFormatter();
@@ -257,14 +245,6 @@ void QLogValue3DAxisFormatter::populateCopy(QValue3DAxisFormatter &copy) const
/*!
* \internal
*/
-QString QLogValue3DAxisFormatter::labelForIndex(int index) const
-{
- return dptrc()->labelForIndex(index);
-}
-
-/*!
- * \internal
- */
QLogValue3DAxisFormatterPrivate *QLogValue3DAxisFormatter::dptr()
{
return static_cast<QLogValue3DAxisFormatterPrivate *>(d_ptr.data());
@@ -305,6 +285,7 @@ void QLogValue3DAxisFormatterPrivate::recalculate()
int subGridCount = m_axis->subSegmentCount() - 1;
int segmentCount = m_axis->segmentCount();
+ QString labelFormat = m_axis->labelFormat();
qreal segmentStep;
if (m_base > 0.0) {
// Update parent axis segment counts
@@ -336,36 +317,53 @@ void QLogValue3DAxisFormatterPrivate::recalculate()
m_gridPositions.resize(segmentCount + 1);
m_subGridPositions.resize(segmentCount * subGridCount);
m_labelPositions.resize(segmentCount + 1);
- m_labelValues.resize(segmentCount + 1);
+ m_labelStrings.clear();
+ m_labelStrings.reserve(segmentCount + 1);
// Calculate segment positions
int index = 0;
if (!m_evenMinSegment) {
m_gridPositions[0] = 0.0f;
m_labelPositions[0] = 0.0f;
- m_labelValues[0] = qreal(m_min);
+ if (m_showEdgeLabels)
+ m_labelStrings << qptr()->stringForValue(qreal(m_min), labelFormat);
+ else
+ m_labelStrings << QString();
index++;
}
for (int i = 0; i < segmentCount; i++) {
float gridValue = float((minDiff + qreal(i)) / qreal(logRangeNormalizer));
m_gridPositions[index] = gridValue;
m_labelPositions[index] = gridValue;
- m_labelValues[index] = qPow(m_base, minDiff + qreal(i) + logMin);
+ m_labelStrings << qptr()->stringForValue(qPow(m_base, minDiff + qreal(i) + logMin),
+ labelFormat);
index++;
}
// Ensure max value doesn't suffer from any rounding errors
m_gridPositions[segmentCount] = 1.0f;
m_labelPositions[segmentCount] = 1.0f;
- m_labelValues[segmentCount] = qreal(m_max);
+ QString finalLabel;
+ if (m_showEdgeLabels || m_evenMaxSegment)
+ finalLabel = qptr()->stringForValue(qreal(m_max), labelFormat);
+
+ if (m_labelStrings.size() > segmentCount)
+ m_labelStrings.replace(segmentCount, finalLabel);
+ else
+ m_labelStrings << finalLabel;
} else {
// Grid lines and label positions are the same as the parent class, so call parent impl
// first to populate those
QValue3DAxisFormatterPrivate::doRecalculate();
- // Label value array needs to be repopulated
+ // Label string list needs to be repopulated
segmentStep = 1.0 / qreal(segmentCount);
- for (int i = 0; i < m_labelPositions.size(); i++)
- m_labelValues[i] = qExp(segmentStep * qreal(i) * m_logRangeNormalizer + m_logMin);
+
+ m_labelStrings << qptr()->stringForValue(qreal(m_min), labelFormat);
+ for (int i = 1; i < m_labelPositions.size() - 1; i++)
+ m_labelStrings[i] = qptr()->stringForValue(qExp(segmentStep * qreal(i)
+ * m_logRangeNormalizer + m_logMin),
+ labelFormat);
+ m_labelStrings << qptr()->stringForValue(qreal(m_max), labelFormat);
m_evenMaxSegment = true;
m_evenMinSegment = true;
@@ -426,15 +424,9 @@ float QLogValue3DAxisFormatterPrivate::valueAt(float position) const
return float(qExp(logValue));
}
-QString QLogValue3DAxisFormatterPrivate::labelForIndex(int index) const
+QLogValue3DAxisFormatter *QLogValue3DAxisFormatterPrivate::qptr()
{
- if (((index == m_gridPositions.size() - 1 && !m_evenMaxSegment)
- || (index == 0 && !m_evenMinSegment))
- && !m_showEdgeLabels) {
- return QString();
- } else {
- return QValue3DAxisFormatterPrivate::labelForIndex(index);
- }
+ return static_cast<QLogValue3DAxisFormatter *>(q_ptr);
}
QT_END_NAMESPACE_DATAVISUALIZATION
diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter.h b/src/datavisualization/axis/qlogvalue3daxisformatter.h
index e9683821..62714a7d 100644
--- a/src/datavisualization/axis/qlogvalue3daxisformatter.h
+++ b/src/datavisualization/axis/qlogvalue3daxisformatter.h
@@ -52,14 +52,11 @@ signals:
void showEdgeLabelsChanged(bool enabled);
protected:
- virtual bool allowNegatives() const;
- virtual bool allowZero() const;
virtual QValue3DAxisFormatter *createNewInstance() const;
virtual void recalculate();
virtual float positionAt(float value) const;
virtual float valueAt(float position) const;
virtual void populateCopy(QValue3DAxisFormatter &copy) const;
- virtual QString labelForIndex(int index) const;
QLogValue3DAxisFormatterPrivate *dptr();
const QLogValue3DAxisFormatterPrivate *dptrc() const;
diff --git a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h
index 6638e2c7..af056a06 100644
--- a/src/datavisualization/axis/qlogvalue3daxisformatter_p.h
+++ b/src/datavisualization/axis/qlogvalue3daxisformatter_p.h
@@ -50,7 +50,6 @@ public:
float positionAt(float value) const;
float valueAt(float position) const;
- QString labelForIndex(int index) const;
protected:
QLogValue3DAxisFormatter *qptr();
diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp
index b957de4d..3a8b902f 100644
--- a/src/datavisualization/axis/qvalue3daxis.cpp
+++ b/src/datavisualization/axis/qvalue3daxis.cpp
@@ -223,11 +223,11 @@ QValue3DAxisPrivate::~QValue3DAxisPrivate()
{
}
-void QValue3DAxisPrivate::setRange(float min, float max)
+void QValue3DAxisPrivate::setRange(float min, float max, bool suppressWarnings)
{
bool dirty = (min != m_min || max != m_max);
- QAbstract3DAxisPrivate::setRange(min, max);
+ QAbstract3DAxisPrivate::setRange(min, max, suppressWarnings);
if (dirty)
emitLabelsChanged();
@@ -266,17 +266,9 @@ void QValue3DAxisPrivate::updateLabels()
m_labelsDirty = false;
- int labelCount = m_formatter->labelPositions().size();
-
- QStringList newLabels;
- newLabels.reserve(labelCount);
-
m_formatter->d_ptr->recalculate();
- for (int i = 0; i < labelCount; i++)
- newLabels.append(m_formatter->labelForIndex(i));
- if (m_labels != newLabels)
- m_labels = newLabels;
+ m_labels = m_formatter->labelStrings();
}
bool QValue3DAxisPrivate::allowZero()
diff --git a/src/datavisualization/axis/qvalue3daxis_p.h b/src/datavisualization/axis/qvalue3daxis_p.h
index b49447af..eeccf527 100644
--- a/src/datavisualization/axis/qvalue3daxis_p.h
+++ b/src/datavisualization/axis/qvalue3daxis_p.h
@@ -42,7 +42,7 @@ public:
QValue3DAxisPrivate(QValue3DAxis *q);
virtual ~QValue3DAxisPrivate();
- virtual void setRange(float min, float max);
+ virtual void setRange(float min, float max, bool suppressWarnings = false);
virtual void setMin(float min);
virtual void setMax (float max);
diff --git a/src/datavisualization/axis/qvalue3daxisformatter.cpp b/src/datavisualization/axis/qvalue3daxisformatter.cpp
index 92940a1b..4cd84d88 100644
--- a/src/datavisualization/axis/qvalue3daxisformatter.cpp
+++ b/src/datavisualization/axis/qvalue3daxisformatter.cpp
@@ -75,12 +75,28 @@ QValue3DAxisFormatter::~QValue3DAxisFormatter()
}
/*!
+ * Allow the parent axis to have negative values if \a allow is true.
+ */
+void QValue3DAxisFormatter::setAllowNegatives(bool allow)
+{
+ d_ptr->m_allowNegatives = allow;
+}
+
+/*!
* \return \c true if negative values are valid values for parent axis.
* The default implementation always returns true.
*/
bool QValue3DAxisFormatter::allowNegatives() const
{
- return true;
+ return d_ptr->m_allowNegatives;
+}
+
+/*!
+ * Allow the parent axis to have zero value if \a allow is true.
+ */
+void QValue3DAxisFormatter::setAllowZero(bool allow)
+{
+ d_ptr->m_allowZero = allow;
}
/*!
@@ -89,7 +105,7 @@ bool QValue3DAxisFormatter::allowNegatives() const
*/
bool QValue3DAxisFormatter::allowZero() const
{
- return true;
+ return d_ptr->m_allowZero;
}
/*!
@@ -104,16 +120,16 @@ QValue3DAxisFormatter *QValue3DAxisFormatter::createNewInstance() const
}
/*!
- * This method resizes and populates the label and grid line position arrays and the label value
+ * This method resizes and populates the label and grid line position arrays and the label strings
* array, as well as calculates any values needed for mapping between value and position.
* It is allowed to access the parent axis from inside this function.
*
- * This method must be reimplemented in a subclass.
+ * This method must be reimplemented in a subclass if the default array contents are not suitable.
*
- * See gridPositions(), subGridPositions(), labelPositions(), and labelValues() methods for
+ * See gridPositions(), subGridPositions(), labelPositions(), and labelStrings() methods for
* documentation about the arrays that need to be resized and populated.
*
- * \sa gridPositions(), subGridPositions(), labelPositions(), labelValues(), axis()
+ * \sa gridPositions(), subGridPositions(), labelPositions(), labelStrings(), axis()
*/
void QValue3DAxisFormatter::recalculate()
{
@@ -121,28 +137,14 @@ void QValue3DAxisFormatter::recalculate()
}
/*!
- * The parent axis uses this method to request axis label strings for label \a index,
- * using the value stored in label values array and QValue3DAxis::labelFormat property.
- * Reimplement this method in a subclass if the default labeling is not sufficient.
- * If an empty string is returned, the label is not shown.
- *
- * \return A string formatted using axis label formatter.
- *
- * \sa stringForValue(), labelValues(), QValue3DAxis::labelFormat
- */
-QString QValue3DAxisFormatter::labelForIndex(int index) const
-{
- return d_ptr->labelForIndex(index);
-}
-
-/*!
+ * This method is used to format a string using the specified value and the specified format.
* Reimplement this method in a subclass to resolve the formatted string for a given \a value
* if the default formatting rules specified for QValue3DAxis::labelFormat property are not
* sufficient.
*
- * \return the formatted label string using \a value and \a format.
+ * \return the formatted label string using a \a value and a \a format.
*
- * \sa recalculate(), labelForIndex(), QValue3DAxis::labelFormat
+ * \sa recalculate(), labelStrings(), QValue3DAxis::labelFormat
*/
QString QValue3DAxisFormatter::stringForValue(qreal value, const QString &format) const
{
@@ -257,15 +259,15 @@ QVector<float> &QValue3DAxisFormatter::labelPositions() const
}
/*!
- * \return a reference to the array of values used to generate label strings.
+ * \return a reference to the string list containing formatter label strings.
* The array size must be equal to the size of the label positions array and
* the indexes correspond to that array as well.
*
* \sa labelPositions()
*/
-QVector<qreal> &QValue3DAxisFormatter::labelValues() const
+QStringList &QValue3DAxisFormatter::labelStrings() const
{
- return d_ptr->m_labelValues;
+ return d_ptr->m_labelStrings;
}
// QValue3DAxisFormatterPrivate
@@ -277,7 +279,9 @@ QValue3DAxisFormatterPrivate::QValue3DAxisFormatterPrivate(QValue3DAxisFormatter
m_max(0.0f),
m_rangeNormalizer(0.0f),
m_axis(0),
- m_preparsedParamType(Utils::ParamTypeUnknown)
+ m_preparsedParamType(Utils::ParamTypeUnknown),
+ m_allowNegatives(true),
+ m_allowZero(true)
{
}
@@ -303,12 +307,14 @@ void QValue3DAxisFormatterPrivate::doRecalculate()
{
int segmentCount = m_axis->segmentCount();
int subGridCount = m_axis->subSegmentCount() - 1;
+ QString labelFormat = m_axis->labelFormat();
m_gridPositions.resize(segmentCount + 1);
m_subGridPositions.resize(segmentCount * subGridCount);
m_labelPositions.resize(segmentCount + 1);
- m_labelValues.resize(segmentCount + 1);
+ m_labelStrings.clear();
+ m_labelStrings.reserve(segmentCount + 1);
// Use qreals for intermediate calculations for better accuracy on label values
qreal segmentStep = 1.0 / qreal(segmentCount);
@@ -322,7 +328,8 @@ void QValue3DAxisFormatterPrivate::doRecalculate()
qreal gridValue = segmentStep * qreal(i);
m_gridPositions[i] = float(gridValue);
m_labelPositions[i] = float(gridValue);
- m_labelValues[i] = gridValue * rangeNormalizer + qreal(m_min);
+ m_labelStrings << q_ptr->stringForValue(gridValue * rangeNormalizer + qreal(m_min),
+ labelFormat);
if (m_subGridPositions.size()) {
for (int j = 0; j < subGridCount; j++)
m_subGridPositions[i * subGridCount + j] = gridValue + subSegmentStep * (j + 1);
@@ -332,6 +339,7 @@ void QValue3DAxisFormatterPrivate::doRecalculate()
// Ensure max value doesn't suffer from any rounding errors
m_gridPositions[segmentCount] = 1.0f;
m_labelPositions[segmentCount] = 1.0f;
+ m_labelStrings << q_ptr->stringForValue(qreal(m_max), labelFormat);
}
void QValue3DAxisFormatterPrivate::populateCopy(QValue3DAxisFormatter &copy)
@@ -351,12 +359,6 @@ void QValue3DAxisFormatterPrivate::doPopulateCopy(QValue3DAxisFormatterPrivate &
copy.m_subGridPositions = m_subGridPositions;
}
-QString QValue3DAxisFormatterPrivate::labelForIndex(int index) const
-{
- Q_ASSERT(index < m_labelValues.size());
- return q_ptr->stringForValue(m_labelValues.at(index), m_axis->labelFormat());
-}
-
QString QValue3DAxisFormatterPrivate::stringForValue(qreal value, const QString &format)
{
if (m_previousLabelFormat.compare(format)) {
@@ -383,10 +385,15 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis)
{
Q_ASSERT(axis);
+ // These signals are all connected to markDirtyNoLabelChange slot, even though most of them
+ // do require labels to be regenerated. This is because the label regeneration is triggered
+ // elsewhere in these cases.
connect(axis, &QValue3DAxis::segmentCountChanged,
this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange);
connect(axis, &QValue3DAxis::subSegmentCountChanged,
this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange);
+ connect(axis, &QValue3DAxis::labelFormatChanged,
+ this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange);
connect(axis, &QAbstract3DAxis::rangeChanged,
this, &QValue3DAxisFormatterPrivate::markDirtyNoLabelChange);
@@ -396,10 +403,12 @@ void QValue3DAxisFormatterPrivate::setAxis(QValue3DAxis *axis)
void QValue3DAxisFormatterPrivate::markDirty(bool labelsChange)
{
m_needsRecalculate = true;
- if (labelsChange)
- m_axis->dptr()->emitLabelsChanged();
- if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone)
- emit m_axis->dptr()->formatterDirty();
+ if (m_axis) {
+ if (labelsChange)
+ m_axis->dptr()->emitLabelsChanged();
+ if (m_axis && m_axis->orientation() != QAbstract3DAxis::AxisOrientationNone)
+ emit m_axis->dptr()->formatterDirty();
+ }
}
void QValue3DAxisFormatterPrivate::markDirtyNoLabelChange()
diff --git a/src/datavisualization/axis/qvalue3daxisformatter.h b/src/datavisualization/axis/qvalue3daxisformatter.h
index 970087d3..5ecc798d 100644
--- a/src/datavisualization/axis/qvalue3daxisformatter.h
+++ b/src/datavisualization/axis/qvalue3daxisformatter.h
@@ -22,6 +22,8 @@
#include <QtDataVisualization/qdatavisualizationglobal.h>
#include <QtCore/QObject>
#include <QtCore/QScopedPointer>
+#include <QtCore/QVector>
+#include <QtCore/QStringList>
QT_BEGIN_NAMESPACE_DATAVISUALIZATION
@@ -31,7 +33,6 @@ class QValue3DAxis;
class QT_DATAVISUALIZATION_EXPORT QValue3DAxisFormatter : public QObject
{
Q_OBJECT
-
protected:
explicit QValue3DAxisFormatter(QValue3DAxisFormatterPrivate *d, QObject *parent = 0);
public:
@@ -39,11 +40,13 @@ public:
virtual ~QValue3DAxisFormatter();
protected:
- virtual bool allowNegatives() const;
- virtual bool allowZero() const;
+ void setAllowNegatives(bool allow);
+ bool allowNegatives() const;
+ void setAllowZero(bool allow);
+ bool allowZero() const;
+
virtual QValue3DAxisFormatter *createNewInstance() const;
virtual void recalculate();
- virtual QString labelForIndex(int index) const;
virtual QString stringForValue(qreal value, const QString &format) const;
virtual float positionAt(float value) const;
virtual float valueAt(float position) const;
@@ -55,7 +58,7 @@ protected:
QVector<float> &gridPositions() const;
QVector<float> &subGridPositions() const;
QVector<float> &labelPositions() const;
- QVector<qreal> &labelValues() const;
+ QStringList &labelStrings() const;
QScopedPointer<QValue3DAxisFormatterPrivate> d_ptr;
diff --git a/src/datavisualization/axis/qvalue3daxisformatter_p.h b/src/datavisualization/axis/qvalue3daxisformatter_p.h
index 7e661b62..f7fd001e 100644
--- a/src/datavisualization/axis/qvalue3daxisformatter_p.h
+++ b/src/datavisualization/axis/qvalue3daxisformatter_p.h
@@ -29,7 +29,6 @@
#include "datavisualizationglobal_p.h"
#include "qvalue3daxisformatter.h"
#include "utils_p.h"
-#include <QtCore/QVector>
#ifndef QVALUE3DAXISFORMATTER_P_H
#define QVALUE3DAXISFORMATTER_P_H
@@ -51,7 +50,6 @@ public:
void populateCopy(QValue3DAxisFormatter &copy);
void doPopulateCopy(QValue3DAxisFormatterPrivate &copy);
- QString labelForIndex(int index) const;
QString stringForValue(qreal value, const QString &format);
float positionAt(float value) const;
float valueAt(float position) const;
@@ -74,7 +72,7 @@ protected:
QVector<float> m_gridPositions;
QVector<float> m_subGridPositions;
QVector<float> m_labelPositions;
- QVector<qreal> m_labelValues;
+ QStringList m_labelStrings;
QValue3DAxis *m_axis;
@@ -82,6 +80,9 @@ protected:
QByteArray m_labelFormatArray;
Utils::ParamType m_preparsedParamType;
+ bool m_allowNegatives;
+ bool m_allowZero;
+
friend class QValue3DAxisFormatter;
};