64 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.5 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 "calls/calls_signal_bars.h"
 | 
						|
 | 
						|
#include "calls/calls_call.h"
 | 
						|
#include "styles/style_calls.h"
 | 
						|
 | 
						|
namespace Calls {
 | 
						|
 | 
						|
SignalBars::SignalBars(
 | 
						|
	QWidget *parent,
 | 
						|
	not_null<Call*> call,
 | 
						|
	const style::CallSignalBars &st)
 | 
						|
: RpWidget(parent)
 | 
						|
, _st(st)
 | 
						|
, _count(Call::kSignalBarStarting) {
 | 
						|
	resize(
 | 
						|
		_st.width + (_st.width + _st.skip) * (Call::kSignalBarCount - 1),
 | 
						|
		_st.max);
 | 
						|
	call->signalBarCountValue(
 | 
						|
	) | rpl::start_with_next([=](int count) {
 | 
						|
		changed(count);
 | 
						|
	}, lifetime());
 | 
						|
}
 | 
						|
 | 
						|
void SignalBars::paintEvent(QPaintEvent *e) {
 | 
						|
	Painter p(this);
 | 
						|
 | 
						|
	PainterHighQualityEnabler hq(p);
 | 
						|
	p.setPen(Qt::NoPen);
 | 
						|
	p.setBrush(_st.color);
 | 
						|
	for (auto i = 0; i < Call::kSignalBarCount; ++i) {
 | 
						|
		p.setOpacity((i < _count) ? 1. : _st.inactiveOpacity);
 | 
						|
		const auto barHeight = _st.min
 | 
						|
			+ (_st.max - _st.min) * (i / float64(Call::kSignalBarCount - 1));
 | 
						|
		const auto barLeft = i * (_st.width + _st.skip);
 | 
						|
		const auto barTop = height() - barHeight;
 | 
						|
		p.drawRoundedRect(
 | 
						|
			QRectF(
 | 
						|
				barLeft,
 | 
						|
				barTop,
 | 
						|
				_st.width,
 | 
						|
				barHeight),
 | 
						|
			_st.radius,
 | 
						|
			_st.radius);
 | 
						|
	}
 | 
						|
	p.setOpacity(1.);
 | 
						|
}
 | 
						|
 | 
						|
void SignalBars::changed(int count) {
 | 
						|
	if (_count == Call::kSignalBarFinished) {
 | 
						|
		return;
 | 
						|
	} else if (_count != count) {
 | 
						|
		_count = count;
 | 
						|
		update();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Calls
 |