/* 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 "mtproto/sender.h" #include "ui/rp_widget.h" #include "ui/effects/animations.h" #include "window/window_lock_widgets.h" #include "core/core_cloud_password.h" #include "media/player/media_player_float.h" namespace Main { class Account; } // namespace Main namespace Ui { class IconButton; class RoundButton; class LinkButton; class FlatLabel; template <typename Widget> class FadeWrap; } // namespace Ui namespace Window { class ConnectionState; } // namespace Window namespace Intro { namespace details { enum class CallStatus { Waiting, Calling, Called, Disabled, }; struct Data { QString country; QString phone; QByteArray phoneHash; CallStatus callStatus = CallStatus::Disabled; int callTimeout = 0; int codeLength = 5; bool codeByTelegram = false; Core::CloudPasswordCheckRequest pwdRequest; bool hasRecovery = false; QString pwdHint; bool pwdNotEmptyPassport = false; Window::TermsLock termsLock; base::Observable<void> updated; }; enum class StackAction { Back, Forward, Replace, }; enum class Animate { Back, Forward, }; class Step; } // namespace details enum class EnterPoint : uchar { Start, Phone, Qr, }; class Widget : public Ui::RpWidget , private Media::Player::FloatDelegate , private Media::Player::FloatSectionDelegate , private base::Subscriber { public: Widget( QWidget *parent, not_null<Main::Account*> account, EnterPoint point); void showAnimated(const QPixmap &bgAnimCache, bool back = false); void setInnerFocus(); ~Widget(); protected: void paintEvent(QPaintEvent *e) override; void resizeEvent(QResizeEvent *e) override; void keyPressEvent(QKeyEvent *e) override; private: void refreshLang(); void animationCallback(); void createLanguageLink(); void checkUpdateStatus(); void setupNextButton(); void handleUpdates(const MTPUpdates &updates); void handleUpdate(const MTPUpdate &update); void backRequested(); void updateControlsGeometry(); [[nodiscard]] not_null<details::Data*> getData() { return &_data; } void fixOrder(); void showControls(); void hideControls(); void showResetButton(); void resetAccount(); void showTerms(); void acceptTerms(Fn<void()> callback); void hideAndDestroy(object_ptr<Ui::FadeWrap<Ui::RpWidget>> widget); [[nodiscard]] details::Step *getStep(int skip = 0) const { Expects(skip >= 0); Expects(skip < _stepHistory.size()); return _stepHistory[_stepHistory.size() - skip - 1]; } void historyMove(details::StackAction action, details::Animate animate); void moveToStep( details::Step *step, details::StackAction action, details::Animate animate); void appendStep(details::Step *step); void getNearestDC(); void showTerms(Fn<void()> callback); // FloatDelegate [[nodiscard]] auto floatPlayerDelegate() -> not_null<Media::Player::FloatDelegate*>; [[nodiscard]] auto floatPlayerSectionDelegate() -> not_null<Media::Player::FloatSectionDelegate*>; not_null<Ui::RpWidget*> floatPlayerWidget() override; not_null<Media::Player::FloatSectionDelegate*> floatPlayerGetSection( Window::Column column) override; void floatPlayerEnumerateSections(Fn<void( not_null<Media::Player::FloatSectionDelegate*> widget, Window::Column widgetColumn)> callback) override; bool floatPlayerIsVisible(not_null<HistoryItem*> item) override; // FloatSectionDelegate QRect floatPlayerAvailableRect() override; bool floatPlayerHandleWheelEvent(QEvent *e) override; const not_null<Main::Account*> _account; std::optional<MTP::Sender> _api; mtpRequestId _nearestDcRequestId = 0; Ui::Animations::Simple _a_show; bool _showBack = false; QPixmap _cacheUnder, _cacheOver; std::vector<details::Step*> _stepHistory; rpl::lifetime _stepLifetime; details::Data _data; Ui::Animations::Simple _coverShownAnimation; int _nextTopFrom = 0; int _controlsTopFrom = 0; object_ptr<Ui::FadeWrap<Ui::IconButton>> _back; object_ptr<Ui::FadeWrap<Ui::RoundButton>> _update = { nullptr }; object_ptr<Ui::FadeWrap<Ui::RoundButton>> _settings; object_ptr<Ui::FadeWrap<Ui::RoundButton>> _next; object_ptr<Ui::FadeWrap<Ui::LinkButton>> _changeLanguage = { nullptr }; object_ptr<Ui::FadeWrap<Ui::RoundButton>> _resetAccount = { nullptr }; object_ptr<Ui::FadeWrap<Ui::FlatLabel>> _terms = { nullptr }; std::unique_ptr<Window::ConnectionState> _connecting; bool _nextShown = true; Ui::Animations::Simple _nextShownAnimation; mtpRequestId _resetRequest = 0; }; } // namespace Intro