2023-07-17 15:59:27 +00:00
|
|
|
/*
|
|
|
|
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);
|
2023-07-17 15:59:27 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-17 16:47:44 +00:00
|
|
|
QLinearGradient UnreadStoryOutlineGradient(QRectF rect) {
|
|
|
|
auto result = QLinearGradient(rect.topRight(), rect.bottomLeft());
|
|
|
|
result.setStops({
|
|
|
|
{ 0., st::groupCallLive1->c },
|
|
|
|
{ 1., st::groupCallMuted1->c },
|
|
|
|
});
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-07-17 15:59:27 +00:00
|
|
|
} // namespace Ui
|