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);
 | 
						|
	}
 | 
						|
}
 |