 dd81f5d59f
			
		
	
	
		dd81f5d59f
		
	
	
	
	
		
			
			base::lambda -> Fn (type alias for std::function). base::lambda_once -> FnMut (type alias for base::unique_function). base::lambda_guarded -> crl::guard. base::lambda_call_type_t -> crl::deduced_call_type.
		
			
				
	
	
		
			59 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.3 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 "core/single_timer.h"
 | |
| 
 | |
| #include "application.h"
 | |
| 
 | |
| SingleTimer::SingleTimer(QObject *parent) : QTimer(parent) {
 | |
| 	QTimer::setSingleShot(true);
 | |
| 	Sandbox::connect(SIGNAL(adjustSingleTimers()), this, SLOT(adjust()));
 | |
| }
 | |
| 
 | |
| void SingleTimer::setTimeoutHandler(Fn<void()> handler) {
 | |
| 	if (_handler && !handler) {
 | |
| 		disconnect(this, SIGNAL(timeout()), this, SLOT(onTimeout()));
 | |
| 	} else if (handler && !_handler) {
 | |
| 		connect(this, SIGNAL(timeout()), this, SLOT(onTimeout()));
 | |
| 	}
 | |
| 	_handler = std::move(handler);
 | |
| }
 | |
| 
 | |
| void SingleTimer::adjust() {
 | |
| 	auto n = getms(true);
 | |
| 	if (isActive()) {
 | |
| 		if (n >= _finishing) {
 | |
| 			start(0);
 | |
| 		} else {
 | |
| 			start(_finishing - n);
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void SingleTimer::onTimeout() {
 | |
| 	if (_handler) {
 | |
| 		_handler();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void SingleTimer::start(int msec) {
 | |
| 	_finishing = getms(true) + (msec < 0 ? 0 : msec);
 | |
| 	QTimer::start(msec);
 | |
| }
 | |
| 
 | |
| void SingleTimer::startIfNotActive(int msec) {
 | |
| 	if (isActive()) {
 | |
| 		int remains = remainingTime();
 | |
| 		if (remains > msec) {
 | |
| 			start(msec);
 | |
| 		} else if (!remains) {
 | |
| 			start(1);
 | |
| 		}
 | |
| 	} else {
 | |
| 		start(msec);
 | |
| 	}
 | |
| }
 |