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

View file

@ -44,6 +44,18 @@ template <typename T>
return ConvertScale(value, Scale()); 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) { [[nodiscard]] inline QSize ConvertScale(QSize size) {
return QSize(ConvertScale(size.width()), ConvertScale(size.height())); return QSize(ConvertScale(size.width()), ConvertScale(size.height()));
} }

View file

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