diff options
-rw-r--r-- | src/graphs2d/piechart/qpieseries.cpp | 174 | ||||
-rw-r--r-- | src/graphs2d/piechart/qpieseries.h | 21 | ||||
-rw-r--r-- | src/graphs2d/piechart/qpieseries_p.h | 4 | ||||
-rw-r--r-- | src/graphs2d/piechart/qpieslice.cpp | 14 | ||||
-rw-r--r-- | src/graphs2d/piechart/qpieslice_p.h | 3 | ||||
-rw-r--r-- | tests/auto/cpp2dtest/qgpieseries/tst_qgpieseries.cpp | 81 | ||||
-rw-r--r-- | tests/auto/qml2dtest/pies/tst_pieseries.qml | 77 | ||||
-rw-r--r-- | tests/manual/qmltestbed/qml/qmltestbed/PieChart.qml | 91 |
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 |