76 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.7 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/glare.h"
 | 
						|
 | 
						|
#include "styles/style_boxes.h"
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
namespace {
 | 
						|
 | 
						|
constexpr auto kMaxGlareOpaque = 0.5;
 | 
						|
 | 
						|
} // namespace
 | 
						|
 | 
						|
float64 GlareEffect::progress(crl::time now) const {
 | 
						|
	return (now - glare.birthTime)
 | 
						|
		/ float64(glare.deathTime - glare.birthTime);
 | 
						|
}
 | 
						|
 | 
						|
void GlareEffect::validate(
 | 
						|
		const QColor &color,
 | 
						|
		Fn<void()> updateCallback,
 | 
						|
		crl::time timeout,
 | 
						|
		crl::time duration) {
 | 
						|
	if (anim::Disabled()) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	if (!width) {
 | 
						|
		width = st::gradientButtonGlareWidth;
 | 
						|
	}
 | 
						|
	animation.init([=](crl::time now) {
 | 
						|
		if (const auto diff = (now - glare.deathTime); diff > 0) {
 | 
						|
			if (diff > timeout && !paused) {
 | 
						|
				glare = {
 | 
						|
					.birthTime = now,
 | 
						|
					.deathTime = now + duration,
 | 
						|
				};
 | 
						|
				updateCallback();
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			updateCallback();
 | 
						|
		}
 | 
						|
	});
 | 
						|
	animation.start();
 | 
						|
	{
 | 
						|
		auto newPixmap = QPixmap(QSize(width, 1)
 | 
						|
			* style::DevicePixelRatio());
 | 
						|
		newPixmap.setDevicePixelRatio(style::DevicePixelRatio());
 | 
						|
		newPixmap.fill(Qt::transparent);
 | 
						|
		{
 | 
						|
			auto p = QPainter(&newPixmap);
 | 
						|
			auto gradient = QLinearGradient(
 | 
						|
				QPointF(0, 0),
 | 
						|
				QPointF(width, 0));
 | 
						|
 | 
						|
			auto tempColor = color;
 | 
						|
			tempColor.setAlphaF(0);
 | 
						|
			const auto edge = tempColor;
 | 
						|
			tempColor.setAlphaF(kMaxGlareOpaque);
 | 
						|
			const auto middle = tempColor;
 | 
						|
			gradient.setStops({
 | 
						|
				{ 0., edge },
 | 
						|
				{ .5, middle },
 | 
						|
				{ 1., edge },
 | 
						|
			});
 | 
						|
			p.fillRect(newPixmap.rect(), QBrush(gradient));
 | 
						|
		}
 | 
						|
		pixmap = std::move(newPixmap);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Ui
 |