/* 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 "base/timer.h" #include "base/unique_qptr.h" #include "ui/effects/animations.h" namespace Ui { class RpWidget; } // namespace Ui namespace Main { class Account; } // namespace Main namespace Window { class ConnectionState { public: ConnectionState( not_null parent, not_null account, rpl::producer shown); void raise(); void setForceHidden(bool hidden); void setBottomSkip(int skip); rpl::lifetime &lifetime() { return _lifetime; } private: class Widget; struct State { enum class Type { Connected, Connecting, Waiting, }; Type type = Type::Connected; bool useProxy = false; bool exposed = false; bool underCursor = false; bool updateReady = false; int waitTillRetry = 0; bool operator==(const State &other) const; }; struct Layout { bool visible = false; bool hasRetry = false; bool proxyEnabled = false; bool progressShown = false; int contentWidth = 0; QString text; int textWidth = 0; }; void createWidget(); void finishAnimating(); void refreshState(); void applyState(const State &state); void changeVisibilityWithLayout(const Layout &layout); Layout computeLayout(const State &state) const; void setLayout(const Layout &layout); float64 currentVisibility() const; rpl::producer visibility() const; void updateWidth(); void updateVisibility(); void refreshProgressVisibility(); const not_null _account; not_null _parent; base::unique_qptr _exposeFilter; rpl::variable _bottomSkip; base::unique_qptr _widget; bool _forceHidden = false; base::Timer _refreshTimer; State _state; Layout _currentLayout; crl::time _connectingStartedAt = 0; Ui::Animations::Simple _contentWidth; Ui::Animations::Simple _visibility; rpl::event_stream _visibilityValues; rpl::lifetime _lifetime; }; } // namespace Window