Allow fractional stroke values in CrossAnimation.

This commit is contained in:
John Preston 2022-02-25 19:23:05 +03:00
parent ec7af74351
commit bd7c4ee06d
3 changed files with 30 additions and 14 deletions

View file

@ -120,14 +120,18 @@ void CrossAnimation::paint(
float64 loading) {
PainterHighQualityEnabler hq(p);
auto sqrt2 = sqrt(2.);
auto deleteScale = shown + st.minScale * (1. - shown);
auto deleteSkip = (deleteScale * st.skip) + (1. - deleteScale) * (st.size / 2);
auto deleteLeft = style::rtlpoint(x + deleteSkip, 0, outerWidth).x() + 0.;
auto deleteTop = y + deleteSkip + 0.;
auto deleteWidth = st.size - 2 * deleteSkip;
auto deleteHeight = st.size - 2 * deleteSkip;
auto deleteStroke = st.stroke / sqrt2;
const auto stroke = style::ConvertScaleExact(st.stroke);
const auto sqrt2 = sqrt(2.);
const auto deleteScale = shown + st.minScale * (1. - shown);
const auto deleteSkip = (deleteScale * st.skip)
+ (1. - deleteScale) * (st.size / 2);
const auto deleteLeft = 0.
+ style::rtlpoint(x + deleteSkip, 0, outerWidth).x();
const auto deleteTop = y + deleteSkip + 0.;
const auto deleteWidth = st.size - 2 * deleteSkip;
const auto deleteHeight = st.size - 2 * deleteSkip;
const auto deleteStroke = stroke / sqrt2;
std::array<QPointF, kPointCount> pathDelete = { {
{ deleteLeft, deleteTop + deleteStroke },
{ deleteLeft + deleteStroke, deleteTop },
@ -176,10 +180,10 @@ void CrossAnimation::paint(
p.fillPath(path, color);
}
if (loadingArcLength != 0) {
auto roundSkip = (st.size * (1 - sqrt2) + 2 * sqrt2 * deleteSkip + st.stroke) / 2;
auto roundSkip = (st.size * (1 - sqrt2) + 2 * sqrt2 * deleteSkip + stroke) / 2;
auto roundPart = QRectF(x + roundSkip, y + roundSkip, st.size - 2 * roundSkip, st.size - 2 * roundSkip);
if (staticLoading) {
anim::DrawStaticLoading(p, roundPart, st.stroke, color);
anim::DrawStaticLoading(p, roundPart, stroke, color);
} else {
auto loadingArcStart = kFullArcLength / 8;
if (shown < 1.) {
@ -192,7 +196,7 @@ void CrossAnimation::paint(
p.setBrush(Qt::NoBrush);
auto pen = color->p;
pen.setWidthF(st.stroke);
pen.setWidthF(stroke);
pen.setCapStyle(Qt::RoundCap);
p.setPen(pen);
p.drawArc(roundPart, loadingArcStart, loadingArcLength);

View file

@ -44,6 +44,18 @@ template <typename T>
return ConvertScale(value, Scale());
}
template <typename T>
[[nodiscard]] inline T ConvertScaleExact(T value, int scale) {
return (value < 0.)
? (-ConvertScale(-value, scale))
: T(double(value) * scale / 100.);
}
template <typename T>
[[nodiscard]] inline T ConvertScaleExact(T value) {
return ConvertScaleExact(value, Scale());
}
[[nodiscard]] inline QSize ConvertScale(QSize size) {
return QSize(ConvertScale(size.width()), ConvertScale(size.height()));
}

View file

@ -386,7 +386,7 @@ CrossAnimation {
fg: color;
size: pixels;
skip: pixels;
stroke: pixels;
stroke: double;
minScale: double;
}
@ -923,7 +923,7 @@ defaultMultiSelectItem: MultiSelectItem {
deleteCross: CrossAnimation {
size: 32px;
skip: 10px;
stroke: 2px;
stroke: 1.5;
minScale: 0.3;
}
duration: 150;
@ -959,7 +959,7 @@ defaultMultiSelectSearchCancel: CrossButton {
cross: CrossAnimation {
size: 36px;
skip: 12px;
stroke: 2px;
stroke: 1.5;
minScale: 0.3;
}
crossFg: boxTitleCloseFg;