/* 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::FadeWrap( QWidget *parent, object_ptr &&child, float64 scale) : Parent(parent, std::move(child)) , _animation(this, scale) , _duration(st::fadeWrapDuration) { if (auto weak = wrapped()) { weak->show(); } } FadeWrap *FadeWrap::setDuration(int duration) { _duration = duration; return this; } FadeWrap *FadeWrap::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 *FadeWrap::finishAnimating() { _animation.finish(); wrapped()->show(); return this; } FadeWrap *FadeWrap::toggleOn( rpl::producer &&shown) { std::move( shown ) | rpl::start_with_next([this](bool shown) { toggle(shown, anim::type::normal); }, lifetime()); finishAnimating(); return this; } void FadeWrap::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(parent, color)) { hide(anim::type::instant); } } // namespace Ui