81 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
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);
 | 
						|
	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
 |