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
 | 
