diff options
author | Magdalena Stojek <[email protected]> | 2025-03-07 14:18:03 +0100 |
---|---|---|
committer | Magdalena Stojek <[email protected]> | 2025-03-18 10:47:26 +0100 |
commit | 0675e10429234b43ab96de22181c1970416a42ef (patch) | |
tree | f28982074f823baba8e624e7f5c7acb5fa72db17 | |
parent | a62ef0f62e10b6395bb7f88490c2cc1392d81246 (diff) |
QQuickPathRectangle: Align corner radius behavior with QQuickRectangle
This change introduces isCornerRadiusSet flag to track whether each
corner radius is explicitly set, mirroring QQuickRectangle's behavior.
If a corner radius is unset, it correctly falls back to the global
radius, ensuring consistency between QQuickPathRectangle and
QQuickRectangle.
This update is required because QQuickRectangle was modified to use
flags to indicate an unset corner radius instead of -1, which previously
caused issues when animating. Since tests verify that both components
must behave the same way, QQuickPathRectangle has been updated
accordingly.
Fixes: QTBUG-134404
Change-Id: Id13401ef264a82c2746744ca5accd72f647c65c8
Reviewed-by: Shawn Rutledge <[email protected]>
Reviewed-by: Eirik Aavitsland <[email protected]>
-rw-r--r-- | src/quick/util/qquickpath.cpp | 21 | ||||
-rw-r--r-- | src/quick/util/qquickpath_p.h | 4 | ||||
-rw-r--r-- | tests/auto/quick/qquickpath/tst_qquickpath.cpp | 3 |
3 files changed, 16 insertions, 12 deletions
diff --git a/src/quick/util/qquickpath.cpp b/src/quick/util/qquickpath.cpp index 9a9844df1e..67df8913ad 100644 --- a/src/quick/util/qquickpath.cpp +++ b/src/quick/util/qquickpath.cpp @@ -2486,13 +2486,13 @@ void QQuickPathRectangle::setRadius(qreal newRadius) return; _extra->radius = newRadius; emit radiusChanged(); - if (_extra->cornerRadii[Qt::TopLeftCorner] < 0) + if (!(_extra->isCornerRadiusSet & (1 << Qt::TopLeftCorner))) emit topLeftRadiusChanged(); - if (_extra->cornerRadii[Qt::TopRightCorner] < 0) + if (!(_extra->isCornerRadiusSet & (1 << Qt::TopRightCorner))) emit topRightRadiusChanged(); - if (_extra->cornerRadii[Qt::BottomLeftCorner] < 0) + if (!(_extra->isCornerRadiusSet & (1 << Qt::BottomLeftCorner))) emit bottomLeftRadiusChanged(); - if (_extra->cornerRadii[Qt::BottomRightCorner] < 0) + if (!(_extra->isCornerRadiusSet & (1 << Qt::BottomRightCorner))) emit bottomRightRadiusChanged(); emit changed(); } @@ -2504,24 +2504,27 @@ void QQuickPathRectangle::setRadius(qreal newRadius) qreal QQuickPathRectangle::cornerRadius(Qt::Corner corner) const { if (_extra.isAllocated()) - return _extra->cornerRadii[corner] < 0 ? _extra->radius : _extra->cornerRadii[corner]; + return (_extra->isCornerRadiusSet & (1 << corner)) ? _extra->cornerRadii[corner] : _extra->radius; else return 0; } void QQuickPathRectangle::setCornerRadius(Qt::Corner corner, qreal newCornerRadius) { - if (newCornerRadius < 0 || _extra.value().cornerRadii[corner] == newCornerRadius) + if (_extra.value().cornerRadii[corner] == newCornerRadius + && (_extra->isCornerRadiusSet & (1 << corner))) return; _extra->cornerRadii[corner] = newCornerRadius; + _extra->isCornerRadiusSet |= (1 << corner); + emitCornerRadiusChanged(corner); } void QQuickPathRectangle::resetCornerRadius(Qt::Corner corner) { - if (!_extra.isAllocated() || _extra->cornerRadii[corner] < 0) + if (!_extra.isAllocated() || !(_extra->isCornerRadiusSet & (1 << corner))) return; - _extra->cornerRadii[corner] = -1; + _extra->isCornerRadiusSet &= ~(1 << corner); emitCornerRadiusChanged(corner); } @@ -2638,7 +2641,7 @@ void QQuickPathRectangle::addToPath(QPainterPath &path, const QQuickPathData &da const qreal generalDiameter = qMax(qreal(0), qMin(maxDiameter, 2 * _extra->radius)); auto effectiveDiameter = [&](Qt::Corner corner) { qreal radius = _extra->cornerRadii[corner]; - return radius < 0 ? generalDiameter : qMin(maxDiameter, 2 * radius); + return (_extra->isCornerRadiusSet & ( 1 << corner)) ? qMin(maxDiameter, 2 * radius) : generalDiameter; }; const qreal diamTL = effectiveDiameter(Qt::TopLeftCorner); const qreal diamTR = effectiveDiameter(Qt::TopRightCorner); diff --git a/src/quick/util/qquickpath_p.h b/src/quick/util/qquickpath_p.h index be1aa81cac..6f2b63e336 100644 --- a/src/quick/util/qquickpath_p.h +++ b/src/quick/util/qquickpath_p.h @@ -510,11 +510,13 @@ private: struct ExtraData { ExtraData() { - std::fill_n(cornerRadii, 4, -1); + std::fill_n(cornerRadii, 4, 0); std::fill_n(cornerBevel, 4, std::optional<bool>()); + isCornerRadiusSet = 0; } qreal radius = 0; qreal cornerRadii[4]; + unsigned isCornerRadiusSet : 4; bool bevel = false; std::optional<bool> cornerBevel[4]; }; diff --git a/tests/auto/quick/qquickpath/tst_qquickpath.cpp b/tests/auto/quick/qquickpath/tst_qquickpath.cpp index f11348b75a..52fd7756bb 100644 --- a/tests/auto/quick/qquickpath/tst_qquickpath.cpp +++ b/tests/auto/quick/qquickpath/tst_qquickpath.cpp @@ -411,9 +411,8 @@ void tst_QuickPath::rectangleRadii() COMPARE_RADII(pathRectangle, quickRectangle); pathRectangle.setTopLeftRadius(-7); quickRectangle->setTopLeftRadius(-7); - QEXPECT_FAIL("", "Need to adapt to changes from QTBUG-120188", Continue); QCOMPARE(pathRectangle.topLeftRadius(), quickRectangle->topLeftRadius()); - // COMPARE_RADII(pathRectangle, quickRectangle); + COMPARE_RADII(pathRectangle, quickRectangle); pathRectangle.setRadius(4); quickRectangle->setRadius(4); pathRectangle.resetBottomLeftRadius(); |