aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagdalena Stojek <[email protected]>2025-03-07 14:18:03 +0100
committerMagdalena Stojek <[email protected]>2025-03-18 10:47:26 +0100
commit0675e10429234b43ab96de22181c1970416a42ef (patch)
treef28982074f823baba8e624e7f5c7acb5fa72db17
parenta62ef0f62e10b6395bb7f88490c2cc1392d81246 (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.cpp21
-rw-r--r--src/quick/util/qquickpath_p.h4
-rw-r--r--tests/auto/quick/qquickpath/tst_qquickpath.cpp3
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();