116 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
	
		
			2.4 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/wrap/fade_wrap.h"
 | 
						|
 | 
						|
#include "ui/widgets/shadow.h"
 | 
						|
 | 
						|
namespace Ui {
 | 
						|
 | 
						|
FadeWrap<RpWidget>::FadeWrap(
 | 
						|
	QWidget *parent,
 | 
						|
	object_ptr<RpWidget> &&child,
 | 
						|
	float64 scale)
 | 
						|
: Parent(parent, std::move(child))
 | 
						|
, _animation(this, scale)
 | 
						|
, _duration(st::fadeWrapDuration) {
 | 
						|
	if (auto weak = wrapped()) {
 | 
						|
		weak->show();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
FadeWrap<RpWidget> *FadeWrap<RpWidget>::setDuration(int duration) {
 | 
						|
	_duration = duration;
 | 
						|
	return this;
 | 
						|
}
 | 
						|
 | 
						|
FadeWrap<RpWidget> *FadeWrap<RpWidget>::toggle(
 | 
						|
		bool shown,
 | 
						|
		anim::type animated) {
 | 
						|
	auto changed = (shown != _animation.visible());
 | 
						|
	if (shown) {
 | 
						|
		if (animated == anim::type::normal) {
 | 
						|
			if (!_animation.animating()) {
 | 
						|
				wrapped()->show();
 | 
						|
			}
 | 
						|
			_animation.fadeIn(_duration);
 | 
						|
			if (_animation.animating()) {
 | 
						|
				wrapped()->hide();
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			_animation.show();
 | 
						|
			if (!_animation.animating()) {
 | 
						|
				wrapped()->show();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		if (animated == anim::type::normal) {
 | 
						|
			if (!_animation.animating()) {
 | 
						|
				wrapped()->show();
 | 
						|
			}
 | 
						|
			_animation.fadeOut(_duration);
 | 
						|
			if (_animation.animating()) {
 | 
						|
				wrapped()->hide();
 | 
						|
			}
 | 
						|
		} else {
 | 
						|
			_animation.hide();
 | 
						|
			if (!_animation.animating()) {
 | 
						|
				wrapped()->show();
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if (changed) {
 | 
						|
		_toggledChanged.fire_copy(shown);
 | 
						|
	}
 | 
						|
	return this;
 | 
						|
}
 | 
						|
 | 
						|
FadeWrap<RpWidget> *FadeWrap<RpWidget>::finishAnimating() {
 | 
						|
	_animation.finish();
 | 
						|
	wrapped()->show();
 | 
						|
	return this;
 | 
						|
}
 | 
						|
 | 
						|
FadeWrap<RpWidget> *FadeWrap<RpWidget>::toggleOn(
 | 
						|
		rpl::producer<bool> &&shown) {
 | 
						|
	std::move(
 | 
						|
		shown
 | 
						|
	) | rpl::start_with_next([this](bool shown) {
 | 
						|
		toggle(shown, anim::type::normal);
 | 
						|
	}, lifetime());
 | 
						|
	finishAnimating();
 | 
						|
	return this;
 | 
						|
}
 | 
						|
 | 
						|
void FadeWrap<RpWidget>::paintEvent(QPaintEvent *e) {
 | 
						|
	Painter p(this);
 | 
						|
	if (_animation.paint(p)) {
 | 
						|
		if (!_animation.animating() && _animation.visible()) {
 | 
						|
			crl::on_main(this, [=] {
 | 
						|
				if (!_animation.animating() && _animation.visible()) {
 | 
						|
					wrapped()->show();
 | 
						|
				}
 | 
						|
			});
 | 
						|
		}
 | 
						|
		return;
 | 
						|
	}
 | 
						|
	if (!_animation.animating()) {
 | 
						|
		wrapped()->show();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
FadeShadow::FadeShadow(QWidget *parent)
 | 
						|
: FadeShadow(parent, st::shadowFg) {
 | 
						|
}
 | 
						|
 | 
						|
FadeShadow::FadeShadow(QWidget *parent, style::color color)
 | 
						|
: Parent(parent, object_ptr<PlainShadow>(parent, color)) {
 | 
						|
	hide(anim::type::instant);
 | 
						|
}
 | 
						|
 | 
						|
} // namespace Ui
 | 
						|
 |