summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/graphs2d/piechart/qpieseries.cpp174
-rw-r--r--src/graphs2d/piechart/qpieseries.h21
-rw-r--r--src/graphs2d/piechart/qpieseries_p.h4
-rw-r--r--src/graphs2d/piechart/qpieslice.cpp14
-rw-r--r--src/graphs2d/piechart/qpieslice_p.h3
-rw-r--r--tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp81
-rw-r--r--tests/auto/qml2dtest/pies/tst_pieseries.qml77
-rw-r--r--tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml91
8 files changed, 441 insertions, 24 deletions
diff --git a/src/graphs2d/piechart/qpieseries.cpp b/src/graphs2d/piechart/qpieseries.cpp
index f70cd51a..d2361271 100644
--- a/src/graphs2d/piechart/qpieseries.cpp
+++ b/src/graphs2d/piechart/qpieseries.cpp
@@ -303,6 +303,89 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \property QPieSeries::angleSpanVisibleLimit
+ \since 6.10
+
+ \brief The angle span limit for label visibility.
+
+ The angle span that will be used as the visibility limit for a slice label. A slice with
+ angle span under this value will change its visibility based on the \l angleSpanVisibleMode
+ set to the series. The default value is \c {0}, which means no slices will be hidden
+ regardless of the \l {angleSpanVisibleMode}.
+
+ \sa QPieSeries::angleSpanVisibleMode
+*/
+
+/*!
+ \qmlproperty real PieSeries::angleSpanVisibleLimit
+ \since 6.10
+
+ The angle span limit for label visibility.
+
+ The angle span that will be used as the visibility limit for a slice label. A slice with
+ angle span under this value will change its visibility based on the \l angleSpanVisibleMode
+ set to the series. The default value is \c {0}, which means no slices will be hidden
+ regardless of the \l {angleSpanVisibleMode}.
+
+ \sa angleSpanVisibleMode
+*/
+
+/*!
+ \property QPieSeries::angleSpanVisibleMode
+ \since 6.10
+
+ \brief The mode for label visibility.
+
+ The mode which determines which labels will be hidden if they are under the angle span limit
+ set with \l {angleSpanVisibleLimit}. Has no effect if \l angleSpanVisibleLimit has not been
+ set.
+
+ \sa QPieSeries::angleSpanVisibleLimit
+*/
+
+/*!
+ \qmlproperty enumeration PieSeries::angleSpanVisibleMode
+ \since 6.10
+
+ The mode for label visibility.
+
+ The mode which determines which labels will be hidden if they are under the angle span limit
+ set with \l {angleSpanVisibleLimit}. Has no effect if \l angleSpanVisibleLimit has not been
+ set.
+
+ \value PieSeries.VisibleMode.None
+ All of the labels of slices with smaller angle span than the \l angleSpanVisibleLimit
+ will be hidden.
+ \value PieSeries.VisibleMode.First
+ All except the first label of consecutive slices with smaller angle span than
+ the \l angleSpanVisibleLimit will be hidden. This is the default value.
+ \value PieSeries.VisibleMode.EveryOther
+ Every other label of consecutive slices with smaller angle span than
+ the \l angleSpanVisibleLimit will be hidden.
+
+ \sa angleSpanVisibleLimit
+*/
+
+/*!
+ \enum QPieSeries::VisibleMode
+ \since 6.10
+
+ The mode for label visibility.
+
+ \value None
+ All of the labels of slices with smaller angle span than the \l angleSpanVisibleLimit
+ will be hidden.
+ \value First
+ All except the first label of consecutive slices with smaller angle span than
+ the \l angleSpanVisibleLimit will be hidden. This is the default value.
+ \value EveryOther
+ Every other label of consecutive slices with smaller angle span than
+ the \l angleSpanVisibleLimit will be hidden.
+
+ \sa QPieSeries::angleSpanVisibleLimit
+*/
+
+/*!
\qmlsignal PieSeries::sumChanged()
This signal is emitted when the sum of all slices changes.
\sa sum
@@ -379,7 +462,7 @@ QT_BEGIN_NAMESPACE
/*!
\qmlmethod bool PieSeries::replace(PieSlice oldSlice, PieSlice newSlice)
Replaces the slice specified by \a oldSlice with newSlice. Returns \c true if the
- removal was successful, \c false otherwise. \a oldSlice is destroyed if this
+ removal was successful, \c false otherwise. \a oldSlice is destroyed if this
is successful.
*/
@@ -419,6 +502,18 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \qmlsignal PieSeries::angleSpanVisibleLimitChanged()
+ \since 6.10
+ This signal is emitted when the angle span limit has been changed.
+*/
+
+/*!
+ \qmlsignal PieSeries::angleSpanVisibleModeChanged()
+ \since 6.10
+ This signal is emitted when the angle span limit visible mode has been changed.
+*/
+
+/*!
Constructs a series object that is a child of \a parent.
*/
QPieSeries::QPieSeries(QObject *parent)
@@ -520,7 +615,7 @@ void QPieSeries::removeMultiple(qsizetype index, int count)
emit removed(removedList);
- for (auto slice : removedList) {
+ for (auto slice : std::as_const(removedList)) {
delete slice;
}
@@ -797,7 +892,7 @@ void QPieSeries::clear()
return;
QList<QPieSlice *> slices = d->m_slices;
- for (QPieSlice *s : d->m_slices)
+ for (QPieSlice *s : std::as_const(d->m_slices))
d->m_slices.removeOne(s);
d->updateData();
@@ -805,7 +900,7 @@ void QPieSeries::clear()
emit removed(slices);
emit countChanged();
- for (QPieSlice *s : slices)
+ for (QPieSlice *s : std::as_const(slices))
delete s;
}
@@ -990,7 +1085,6 @@ void QPieSeries::componentComplete()
{
for (QObject *child : children()) {
if (qobject_cast<QPieSlice *>(child)) {
-
QPieSeries::append(qobject_cast<QPieSlice *>(child));
qCDebug(lcSeries2D) << "append slice: " << child << "to pieSeries";
}
@@ -1012,7 +1106,7 @@ void QPieSeries::componentComplete()
void QPieSeries::setLabelsVisible(bool visible)
{
Q_D(QPieSeries);
- for (QPieSlice *s : d->m_slices)
+ for (QPieSlice *s : std::as_const(d->m_slices))
s->setLabelVisible(visible);
}
@@ -1027,7 +1121,7 @@ void QPieSeries::setLabelsVisible(bool visible)
void QPieSeries::setLabelsPosition(QPieSlice::LabelPosition position)
{
Q_D(QPieSeries);
- for (QPieSlice *s : d->m_slices)
+ for (QPieSlice *s : std::as_const(d->m_slices))
s->setLabelPosition(position);
}
@@ -1056,6 +1150,44 @@ qreal QPieSeries::holeSize() const
return d->m_holeRelativeSize;
}
+qreal QPieSeries::angleSpanVisibleLimit() const
+{
+ Q_D(const QPieSeries);
+ return d->m_angleSpanVisibleLimit;
+}
+
+void QPieSeries::setAngleSpanVisibleLimit(qreal newAngleSpanVisibleLimit)
+{
+ Q_D(QPieSeries);
+ if (qFuzzyCompare(d->m_angleSpanVisibleLimit, newAngleSpanVisibleLimit)) {
+ qCDebug(lcProperties2D, "QPieSeries::setAngleSpanVisibleLimit. Limit is already set to: %f",
+ newAngleSpanVisibleLimit);
+ return;
+ }
+ d->m_angleSpanVisibleLimit = newAngleSpanVisibleLimit;
+ d->updateData(true);
+ emit angleSpanVisibleLimitChanged();
+}
+
+QPieSeries::VisibleMode QPieSeries::angleSpanVisibleMode() const
+{
+ Q_D(const QPieSeries);
+ return d->m_angleSpanVisibleMode;
+}
+
+void QPieSeries::setAngleSpanVisibleMode(QPieSeries::VisibleMode newAngleSpanVisibleMode)
+{
+ Q_D(QPieSeries);
+ if (d->m_angleSpanVisibleMode == newAngleSpanVisibleMode) {
+ qCDebug(lcProperties2D) << "QPieSeries::setAngleSpanVisibleMode. Mode is already set to: "
+ << newAngleSpanVisibleMode;
+ return;
+ }
+ d->m_angleSpanVisibleMode = newAngleSpanVisibleMode;
+ d->updateData(true);
+ emit angleSpanVisibleModeChanged();
+}
+
QPieSeriesPrivate::QPieSeriesPrivate()
: m_pieRelativeHorPos(.5)
, m_pieRelativeVerPos(.5)
@@ -1064,15 +1196,18 @@ QPieSeriesPrivate::QPieSeriesPrivate()
, m_pieEndAngle(360)
, m_sum(0)
, m_holeRelativeSize(.0)
+ , m_angleSpanVisibleLimit(.0)
+ , m_angleSpanVisibleMode(QPieSeries::VisibleMode::First)
+
{}
-void QPieSeriesPrivate::updateData()
+void QPieSeriesPrivate::updateData(bool clearHidden)
{
Q_Q(QPieSeries);
// calculate sum of all slices
qreal sum = 0;
- for (QPieSlice *s : m_slices)
+ for (QPieSlice *s : std::as_const(m_slices))
sum += s->value();
if (!qFuzzyCompare(m_sum, sum)) {
@@ -1087,12 +1222,31 @@ void QPieSeriesPrivate::updateData()
// update slice attributes
qreal sliceAngle = m_pieStartAngle;
qreal pieSpan = m_pieEndAngle - m_pieStartAngle;
- for (QPieSlice *s : m_slices) {
+ auto hideMode = q->angleSpanVisibleMode();
+ bool hideNextSmallSlice = false;
+ for (QPieSlice *s : std::as_const(m_slices)) {
QPieSlicePrivate *d = s->d_func();
d->setPercentage(s->value() / m_sum);
d->setStartAngle(sliceAngle);
d->setAngleSpan(pieSpan * s->percentage());
sliceAngle += s->angleSpan();
+ // Reset hidden status
+ if (clearHidden) {
+ d->m_hideLabel = false;
+ d->setLabelVisible(true);
+ }
+ // Check if previous slice was also small, and hide the label on this one if it was
+ if (d->m_angleSpan < m_angleSpanVisibleLimit && (hideNextSmallSlice
+ || hideMode == QPieSeries::VisibleMode::None)) {
+ d->setLabelVisible(false, true);
+ }
+ if (hideMode == QPieSeries::VisibleMode::First) {
+ // Hide every other small slice label after the first shown one
+ hideNextSmallSlice = d->m_angleSpan < m_angleSpanVisibleLimit;
+ } else {
+ // Hide only every other small slice label
+ hideNextSmallSlice = (!hideNextSmallSlice && d->m_angleSpan < m_angleSpanVisibleLimit);
+ }
}
emit q->update();
diff --git a/src/graphs2d/piechart/qpieseries.h b/src/graphs2d/piechart/qpieseries.h
index 4a69a585..9ed664d2 100644
--- a/src/graphs2d/piechart/qpieseries.h
+++ b/src/graphs2d/piechart/qpieseries.h
@@ -15,6 +15,7 @@ class QPieSeriesPrivate;
class Q_GRAPHS_EXPORT QPieSeries : public QAbstractSeries
{
Q_OBJECT
+ Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
Q_PROPERTY(qreal horizontalPosition READ horizontalPosition WRITE setHorizontalPosition NOTIFY
horizontalPositionChanged FINAL)
Q_PROPERTY(qreal verticalPosition READ verticalPosition WRITE setVerticalPosition NOTIFY
@@ -25,9 +26,20 @@ class Q_GRAPHS_EXPORT QPieSeries : public QAbstractSeries
Q_PROPERTY(qsizetype count READ count NOTIFY countChanged FINAL)
Q_PROPERTY(qreal sum READ sum NOTIFY sumChanged FINAL)
Q_PROPERTY(qreal holeSize READ holeSize WRITE setHoleSize NOTIFY holeSizeChanged FINAL)
+ Q_PROPERTY(qreal angleSpanVisibleLimit READ angleSpanVisibleLimit WRITE setAngleSpanVisibleLimit
+ NOTIFY angleSpanVisibleLimitChanged REVISION(6, 10))
+ Q_PROPERTY(VisibleMode angleSpanVisibleMode READ angleSpanVisibleMode WRITE setAngleSpanVisibleMode
+ NOTIFY angleSpanVisibleModeChanged REVISION(6, 10))
QML_NAMED_ELEMENT(PieSeries)
public:
+ enum class VisibleMode {
+ None,
+ First,
+ EveryOther,
+ };
+ Q_ENUM(VisibleMode)
+
explicit QPieSeries(QObject *parent = nullptr);
~QPieSeries() override;
QAbstractSeries::SeriesType type() const override;
@@ -76,6 +88,12 @@ public:
void setLabelsVisible(bool visible);
void setLabelsPosition(QPieSlice::LabelPosition position);
+ qreal angleSpanVisibleLimit() const;
+ void setAngleSpanVisibleLimit(qreal newAngleSpanVisibleLimit);
+
+ VisibleMode angleSpanVisibleMode() const;
+ void setAngleSpanVisibleMode(VisibleMode newAngleSpanVisibleMode);
+
public Q_SLOTS:
void handleSliceChange();
@@ -101,6 +119,9 @@ Q_SIGNALS:
Q_REVISION(6, 9) void pressed(QPieSlice *slice);
Q_REVISION(6, 9) void released(QPieSlice *slice);
+ Q_REVISION(6, 10) void angleSpanVisibleLimitChanged();
+ Q_REVISION(6, 10) void angleSpanVisibleModeChanged();
+
private:
friend class PieRenderer;
Q_DECLARE_PRIVATE(QPieSeries)
diff --git a/src/graphs2d/piechart/qpieseries_p.h b/src/graphs2d/piechart/qpieseries_p.h
index 36c0ccc7..e304a3de 100644
--- a/src/graphs2d/piechart/qpieseries_p.h
+++ b/src/graphs2d/piechart/qpieseries_p.h
@@ -24,7 +24,7 @@ public:
QPieSeriesPrivate();
~QPieSeriesPrivate() = default;
- void updateData();
+ void updateData(bool clearHidden = false);
void updateLabels();
void setSizes(qreal innerSize, qreal outerSize);
@@ -37,6 +37,8 @@ private:
qreal m_pieEndAngle;
qreal m_sum;
qreal m_holeRelativeSize;
+ qreal m_angleSpanVisibleLimit;
+ QPieSeries::VisibleMode m_angleSpanVisibleMode;
Q_DECLARE_PUBLIC(QPieSeries)
};
diff --git a/src/graphs2d/piechart/qpieslice.cpp b/src/graphs2d/piechart/qpieslice.cpp
index 9a2dfd88..94854a09 100644
--- a/src/graphs2d/piechart/qpieslice.cpp
+++ b/src/graphs2d/piechart/qpieslice.cpp
@@ -655,6 +655,7 @@ QPieSlicePrivate::QPieSlicePrivate()
, m_percentage(0.0)
, m_startAngle(0.0)
, m_angleSpan(0.0)
+ , m_hideLabel(false)
, m_isExploded(false)
, m_explodeDistanceFactor(.15)
, m_labelDirty(false)
@@ -698,16 +699,21 @@ void QPieSlicePrivate::setAngleSpan(qreal span)
Q_Q(QPieSlice);
if (qFuzzyCompare(m_angleSpan, span))
return;
+
m_angleSpan = span;
emit q->angleSpanChanged();
}
-void QPieSlicePrivate::setLabelVisible(bool visible)
+void QPieSlicePrivate::setLabelVisible(bool visible, bool forceHidden)
{
- m_isLabelVisible = visible;
- m_labelItem->setVisible(visible);
+ if (m_hideLabel)
+ return;
+
+ m_hideLabel = forceHidden;
+ m_isLabelVisible = (visible && !m_hideLabel);
+ m_labelItem->setVisible(m_isLabelVisible);
if (m_labelPosition == QPieSlice::LabelPosition::Outside)
- m_labelShape->setVisible(visible);
+ m_labelShape->setVisible(m_isLabelVisible);
}
void QPieSlicePrivate::setLabelPosition(QPieSlice::LabelPosition position)
diff --git a/src/graphs2d/piechart/qpieslice_p.h b/src/graphs2d/piechart/qpieslice_p.h
index 4cb4e775..ddf83400 100644
--- a/src/graphs2d/piechart/qpieslice_p.h
+++ b/src/graphs2d/piechart/qpieslice_p.h
@@ -43,7 +43,7 @@ private:
friend class QPieSeriesPrivate;
friend class PieRenderer;
- void setLabelVisible(bool visible);
+ void setLabelVisible(bool visible, bool forceHidden = false);
void setLabelPosition(QPieSlice::LabelPosition position);
QString m_labelText;
@@ -57,6 +57,7 @@ private:
qreal m_percentage;
qreal m_startAngle;
qreal m_angleSpan;
+ bool m_hideLabel;
bool m_isExploded;
qreal m_explodeDistanceFactor;
diff --git a/tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp b/tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp
index ce31f867..3a9c2b0d 100644
--- a/tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp
+++ b/tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp
@@ -26,6 +26,7 @@ private slots:
void calculatedValues();
void sliceSeries();
void destruction();
+ void adjust_limits_and_mode();
private:
void verifyCalculatedData(const QPieSeries &series, bool *ok);
@@ -62,6 +63,8 @@ void tst_qgpieseries::properties()
QSignalSpy sumSpy(m_series, SIGNAL(sumChanged()));
QSignalSpy opacitySpy(m_series, SIGNAL(opacityChanged()));
QSignalSpy valuesMultiplierSpy(m_series, SIGNAL(valuesMultiplierChanged()));
+ QSignalSpy angleSpanVisibleLimitSpy(m_series, SIGNAL(angleSpanVisibleLimitChanged()));
+ QSignalSpy angleSpanVisibleModeSpy(m_series, SIGNAL(angleSpanVisibleModeChanged()));
QVERIFY(m_series->type() == QAbstractSeries::SeriesType::Pie);
QVERIFY(m_series->count() == 0);
@@ -74,6 +77,8 @@ void tst_qgpieseries::properties()
QCOMPARE(m_series->endAngle(), 360.0);
QCOMPARE(m_series->opacity(), 1.0);
QCOMPARE(m_series->valuesMultiplier(), 1.0);
+ QCOMPARE(m_series->angleSpanVisibleLimit(), 0.0);
+ QCOMPARE(m_series->angleSpanVisibleMode(), QPieSeries::VisibleMode::First);
m_series->append("s1", 1);
m_series->append("s2", 1);
@@ -151,6 +156,20 @@ void tst_qgpieseries::properties()
m_series->setValuesMultiplier(0);
QCOMPARE(m_series->valuesMultiplier(), 0);
QCOMPARE(valuesMultiplierSpy.size(), 2);
+
+ m_series->setAngleSpanVisibleLimit(0.5);
+ QCOMPARE(m_series->angleSpanVisibleLimit(), 0.5);
+ QCOMPARE(angleSpanVisibleLimitSpy.size(), 1);
+ m_series->setAngleSpanVisibleLimit(10.0);
+ QCOMPARE(m_series->angleSpanVisibleLimit(), 10.0);
+ QCOMPARE(angleSpanVisibleLimitSpy.size(), 2);
+
+ m_series->setAngleSpanVisibleMode(QPieSeries::VisibleMode::None);
+ QCOMPARE(m_series->angleSpanVisibleMode(), QPieSeries::VisibleMode::None);
+ QCOMPARE(angleSpanVisibleModeSpy.size(), 1);
+ m_series->setAngleSpanVisibleMode(QPieSeries::VisibleMode::EveryOther);
+ QCOMPARE(m_series->angleSpanVisibleMode(), QPieSeries::VisibleMode::EveryOther);
+ QCOMPARE(angleSpanVisibleModeSpy.size(), 2);
}
void tst_qgpieseries::append()
@@ -592,6 +611,68 @@ void tst_qgpieseries::destruction()
QCOMPARE(spy3.size(), 1);
}
+void tst_qgpieseries::adjust_limits_and_mode()
+{
+ int visiblecount = 0;
+
+ QPieSeries series;
+ for (int i = 0; i < 10; ++i) {
+ auto slice = new QPieSlice("slice", i + 0.1); // Angle span between 0.8 and 72
+ series.append(slice);
+ }
+
+ // Every slice label under the limit should be hidden
+ series.setAngleSpanVisibleMode(QPieSeries::VisibleMode::None);
+ series.setAngleSpanVisibleLimit(35);
+ for (const QPieSlice *slice : series.slices()) {
+ if (slice->angleSpan() < series.angleSpanVisibleLimit())
+ QCOMPARE(slice->isLabelVisible(), false);
+ else
+ QCOMPARE(slice->isLabelVisible(), true);
+ visiblecount += slice->isLabelVisible();
+ }
+ QCOMPARE(visiblecount, 5);
+
+ series.setAngleSpanVisibleLimit(20);
+ visiblecount = 0;
+ for (const QPieSlice *slice : series.slices()) {
+ if (slice->angleSpan() < series.angleSpanVisibleLimit())
+ QCOMPARE(slice->isLabelVisible(), false);
+ else
+ QCOMPARE(slice->isLabelVisible(), true);
+ visiblecount += slice->isLabelVisible();
+ }
+ QCOMPARE(visiblecount, 7);
+
+ // Only the first label of slices under the limit should be visible
+ series.setAngleSpanVisibleMode(QPieSeries::VisibleMode::First);
+ series.setAngleSpanVisibleLimit(36); // mid-point; half of the labels plus one should be visible
+ visiblecount = 0;
+ for (const QPieSlice *slice : series.slices())
+ visiblecount += slice->isLabelVisible();
+ QCOMPARE(visiblecount, 6);
+
+ series.setAngleSpanVisibleLimit(75); // over max; only one label should be visible
+ visiblecount = 0;
+ for (const QPieSlice *slice : series.slices())
+ visiblecount += slice->isLabelVisible();
+ QCOMPARE(visiblecount, 1);
+
+ // Every other label of slices under the limit should be visible
+ series.setAngleSpanVisibleMode(QPieSeries::VisibleMode::EveryOther);
+ series.setAngleSpanVisibleLimit(36);
+ visiblecount = 0;
+ for (const QPieSlice *slice : series.slices())
+ visiblecount += slice->isLabelVisible();
+ QCOMPARE(visiblecount, 8);
+
+ series.setAngleSpanVisibleLimit(75);
+ visiblecount = 0;
+ for (const QPieSlice *slice : series.slices())
+ visiblecount += slice->isLabelVisible();
+ QCOMPARE(visiblecount, 5);
+}
+
QList<QPoint> tst_qgpieseries::slicePoints(QRectF rect)
{
qreal x1 = rect.topLeft().x() + (rect.width() / 4);
diff --git a/tests/auto/qml2dtest/pies/tst_pieseries.qml b/tests/auto/qml2dtest/pies/tst_pieseries.qml
index 91447baa..3d8542ab 100644
--- a/tests/auto/qml2dtest/pies/tst_pieseries.qml
+++ b/tests/auto/qml2dtest/pies/tst_pieseries.qml
@@ -33,12 +33,22 @@ Item {
target: pieSeries
signalName: "countChanged"
}
+ SignalSpy {
+ id: spanChangedSpy
+ target: pieSeries
+ signalName: "angleSpanVisibleLimitChanged"
+ }
+ SignalSpy {
+ id: modeChangedSpy
+ target: pieSeries
+ signalName: "angleSpanVisibleModeChanged"
+ }
}
TestCase {
name: "tst_qml-qtquicktest PieSeries"
- function test_properties() {
+ function test_01_properties() {
compare(pieSeries.endAngle, 360)
compare(pieSeries.holeSize, 0)
compare(pieSeries.horizontalPosition, 0.5)
@@ -46,9 +56,13 @@ Item {
compare(pieSeries.startAngle, 0)
compare(pieSeries.sum, 0)
compare(pieSeries.verticalPosition, 0.5)
+ compare(pieSeries.angleSpanVisibleLimit, 0)
+ compare(pieSeries.angleSpanVisibleMode, PieSeries.VisibleMode.First)
+
+ pieSeries.clear()
}
- function test_sliceproperties() {
+ function test_02_sliceproperties() {
var slice = pieSeries.append("slice", 10)
compare(slice.angleSpan, 360.0)
verify(slice.borderColor !== undefined)
@@ -69,7 +83,7 @@ Item {
pieSeries.clear()
}
- function test_take() {
+ function test_03_take() {
var count = 20
for (var i = 0; i < count; i++)
pieSeries.append("slice" + i, Math.random() + 0.01)
@@ -77,9 +91,11 @@ Item {
verify(pieSeries.take(pieSeries.find("slice" + 5)))
verify(pieSeries.take(pieSeries.find("slice" + 6)))
compare(pieSeries.count, 18)
+
+ pieSeries.clear()
}
- function test_append() {
+ function test_04_append() {
addedSpy.clear()
countChangedSpy.clear()
sumChangedSpy.clear()
@@ -93,7 +109,7 @@ Item {
pieSeries.clear()
}
- function test_remove() {
+ function test_05_remove() {
removedSpy.clear()
countChangedSpy.clear()
sumChangedSpy.clear()
@@ -127,7 +143,7 @@ Item {
pieSeries.clear()
}
- function test_find_and_at() {
+ function test_06_find_and_at() {
var count = 50
for (var i = 0; i < count; i++)
pieSeries.append("slice" + i,
@@ -137,5 +153,54 @@ Item {
}
pieSeries.clear()
}
+
+ function test_07_adjust_limit_and_mode() {
+ modeChangedSpy.clear()
+ spanChangedSpy.clear()
+
+ var count = 10
+ for (let i = 0; i < count; i++)
+ pieSeries.append("slice" + i, i + 0.1) // Produces angle span range from ~0.8 to ~71.2
+
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.None
+ compare(modeChangedSpy.count, 1)
+
+ pieSeries.angleSpanVisibleLimit = 20
+ compare(spanChangedSpy.count, 1)
+
+ var visiblecount = 0
+ for (let i = 0; i < count; i++)
+ visiblecount += pieSeries.at(i).labelVisible
+ compare(visiblecount, 7)
+
+ pieSeries.angleSpanVisibleLimit = 35
+ compare(spanChangedSpy.count, 2)
+
+ visiblecount = 0
+ for (let i = 0; i < count; i++)
+ visiblecount += pieSeries.at(i).labelVisible
+ compare(visiblecount, 5)
+
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.First
+ compare(modeChangedSpy.count, 2)
+
+ pieSeries.angleSpanVisibleLimit = 75 // This covers all the slices
+ compare(spanChangedSpy.count, 3)
+
+ visiblecount = 0
+ for (let i = 0; i < count; i++)
+ visiblecount += pieSeries.at(i).labelVisible
+ compare(visiblecount, 1)
+
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.EveryOther
+ compare(modeChangedSpy.count, 3)
+
+ visiblecount = 0
+ for (let i = 0; i < count; i++)
+ visiblecount += pieSeries.at(i).labelVisible
+ compare(visiblecount, 5)
+
+ pieSeries.clear()
+ }
}
}
diff --git a/tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml b/tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml
index adbe8984..ecd38c7f 100644
--- a/tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml
+++ b/tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml
@@ -2,6 +2,8 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
+import QtQuick.Controls.Basic
+import QtQuick.Layouts
import QtGraphs
Item {
@@ -9,17 +11,102 @@ Item {
Text {
id: title
- text: "Simple Pie Graph"
+ text: "(Not So) Simple Pie Graph"
anchors.horizontalCenter: parent.horizontalCenter
color: "#f0f0f0"
y: parent.height * .1
}
+ RowLayout {
+ id: controls
+ anchors.top: title.bottom
+ spacing: 12
+ uniformCellSizes: true
+
+ CheckBox {
+ text: "Show minorities"
+ Layout.fillHeight: true
+
+ onCheckedChanged: {
+ if (checked) {
+ pieSeries.append("Jaguar", 2.0)
+ pieSeries.append("Ferrari", 1.0)
+ pieSeries.append("Lamborghini", 0.5)
+ pieSeries.append("Bugatti", 0.3)
+ pieSeries.append("McLaren", 0.2)
+ pieSeries.append("Koenigsegg", 0.1)
+ for (let i = 6; i < 12; ++i) {
+ pieSeries.at(i).labelVisible = true
+ console.log("Appended: " + pieSeries.at(i).label)
+ }
+ } else {
+ pieSeries.removeMultiple(6, 6)
+ }
+ }
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ Text {
+ text: "Angle limit (" + angleslider.value + "°):"
+ color: "white"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ }
+ }
+
+ Slider {
+ id: angleslider
+ from: 0
+ to: 20
+ stepSize: 1
+ value: 0
+ Layout.fillHeight: true
+ onValueChanged: pieSeries.angleSpanVisibleLimit = value
+ }
+
+ Item {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ Text {
+ text: "Label visibility mode:"
+ color: "white"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ }
+ }
+
+ ComboBox {
+ model: [ "None", "First", "EveryOther" ]
+ currentIndex: 1
+ Layout.fillHeight: true
+ onCurrentIndexChanged: {
+ switch (currentIndex) {
+ case 0: {
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.None
+ break
+ }
+ case 1: {
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.First
+ break
+ }
+ case 2: {
+ pieSeries.angleSpanVisibleMode = PieSeries.VisibleMode.EveryOther
+ break
+ }
+ }
+ }
+ }
+ }
+
GraphsView {
id: chartView
width: parent.width
height: parent.height
- anchors.top: title.bottom
+ anchors.top: controls.bottom
anchors.bottom: parent.bottom
property variant otherSlice: 0