39 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			1.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/shake_animation.h"
 | |
| 
 | |
| #include "styles/style_basic.h"
 | |
| 
 | |
| namespace Ui {
 | |
| 
 | |
| Fn<void(float64)> DefaultShakeCallback(Fn<void(int)> applyShift) {
 | |
| 	constexpr auto kShiftProgress = 6;
 | |
| 	constexpr auto kSegmentsCount = 5;
 | |
| 	return [=, applyShift = std::move(applyShift)](float64 value) {
 | |
| 		const auto fullProgress = value * kShiftProgress;
 | |
| 		const auto segment = std::clamp(
 | |
| 			int(std::floor(fullProgress)),
 | |
| 			0,
 | |
| 			kSegmentsCount);
 | |
| 		const auto part = fullProgress - segment;
 | |
| 		const auto from = (segment == 0)
 | |
| 			? 0.
 | |
| 			: (segment == 1 || segment == 3 || segment == 5)
 | |
| 			? 1.
 | |
| 			: -1.;
 | |
| 		const auto to = (segment == 0 || segment == 2 || segment == 4)
 | |
| 			? 1.
 | |
| 			: (segment == 1 || segment == 3)
 | |
| 			? -1.
 | |
| 			: 0.;
 | |
| 		const auto shift = from * (1. - part) + to * part;
 | |
| 		applyShift(int(base::SafeRound(shift * st::shakeShift)));
 | |
| 	};
 | |
| }
 | |
| 
 | |
| } // namespace Ui
 | 
