tdesktop/Telegram/SourceFiles/ui/effects/outline_segments.cpp

82 lines
2.1 KiB
C++
Raw Normal View History

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "ui/effects/outline_segments.h"
namespace Ui {
void PaintOutlineSegments(
QPainter &p,
QRectF ellipse,
const std::vector<OutlineSegment> &segments,
float64 fromFullProgress) {
Expects(!segments.empty());
p.setBrush(Qt::NoBrush);
2023-07-18 08:15:19 +00:00
const auto count = std::min(int(segments.size()), kOutlineSegmentsMax);
if (count == 1) {
p.setPen(QPen(segments.front().brush, segments.front().width));
p.drawEllipse(ellipse);
return;
}
const auto small = 160;
const auto full = arc::kFullLength;
const auto separator = (full > 1.1 * small * count)
? small
: (full / (count * 1.1));
const auto left = full - (separator * count);
const auto length = left / float64(count);
const auto spin = separator * (1. - fromFullProgress);
auto start = 0. + (arc::kQuarterLength + (separator / 2)) + (3. * spin);
auto pen = QPen(
segments.back().brush,
segments.back().width,
Qt::SolidLine,
Qt::RoundCap);
p.setPen(pen);
for (auto i = 0; i != count;) {
const auto &segment = segments[count - (++i)];
if (!segment.width) {
start += length + separator;
continue;
} else if (pen.brush() != segment.brush
|| pen.widthF() != segment.width) {
pen = QPen(
segment.brush,
segment.width,
Qt::SolidLine,
Qt::RoundCap);
p.setPen(pen);
}
const auto from = int(base::SafeRound(start));
const auto till = start + length;
auto added = spin;
for (; i != count;) {
start += length + separator;
const auto &next = segments[count - (++i)];
if (next.width) {
--i;
break;
}
added += (separator + length) * (1. - fromFullProgress);
}
p.drawArc(ellipse, from, int(base::SafeRound(till + added)) - from);
}
}
QLinearGradient UnreadStoryOutlineGradient(QRectF rect) {
auto result = QLinearGradient(rect.topRight(), rect.bottomLeft());
result.setStops({
{ 0., st::groupCallLive1->c },
{ 1., st::groupCallMuted1->c },
});
return result;
}
} // namespace Ui