/* 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 */ #pragma once #include "ui/wrap/wrap.h" #include "ui/effects/fade_animation.h" namespace Ui { template class FadeWrapScaled; template class FadeWrap; template <> class FadeWrap : public Wrap { using Parent = Wrap; public: FadeWrap( QWidget *parent, object_ptr &&child, float64 scale = 1.); FadeWrap *setDuration(int duration); FadeWrap *toggle(bool shown, anim::type animated); FadeWrap *show(anim::type animated) { return toggle(true, animated); } FadeWrap *hide(anim::type animated) { return toggle(false, animated); } FadeWrap *finishAnimating(); FadeWrap *toggleOn(rpl::producer &&shown); bool animating() const { return _animation.animating(); } bool toggled() const { return _animation.visible(); } auto toggledValue() const { return _toggledChanged.events_starting_with( _animation.visible()); } protected: void paintEvent(QPaintEvent *e) final override; private: rpl::event_stream _toggledChanged; FadeAnimation _animation; int _duration = 0; }; template class FadeWrap : public Wrap> { using Parent = Wrap>; public: FadeWrap( QWidget *parent, object_ptr &&child, float64 scale = 1.) : Parent(parent, std::move(child), scale) { } FadeWrap *setDuration(int duration) { return chain(Parent::setDuration(duration)); } FadeWrap *toggle(bool shown, anim::type animated) { return chain(Parent::toggle(shown, animated)); } FadeWrap *show(anim::type animated) { return chain(Parent::show(animated)); } FadeWrap *hide(anim::type animated) { return chain(Parent::hide(animated)); } FadeWrap *finishAnimating() { return chain(Parent::finishAnimating()); } FadeWrap *toggleOn(rpl::producer &&shown) { return chain(Parent::toggleOn(std::move(shown))); } private: FadeWrap *chain(FadeWrap *result) { return static_cast(result); } }; template class FadeWrapScaled : public FadeWrap { using Parent = FadeWrap; public: FadeWrapScaled(QWidget *parent, object_ptr &&child) : Parent(parent, std::move(child), 0.) { } }; class PlainShadow; class FadeShadow : public FadeWrap { using Parent = FadeWrap; public: FadeShadow(QWidget *parent); FadeShadow(QWidget *parent, style::color color); }; } // namespace Ui