tdesktop/Telegram/SourceFiles/intro/introwidget.h

293 lines
7.0 KiB
C
Raw Normal View History

/*
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
2017-05-30 09:31:40 +00:00
#include "mtproto/sender.h"
#include "ui/rp_widget.h"
2017-05-30 09:31:40 +00:00
namespace Ui {
class IconButton;
class RoundButton;
2016-11-24 19:28:23 +00:00
class LinkButton;
class SlideAnimation;
class CrossFadeAnimation;
class FlatLabel;
template <typename Widget>
class FadeWrap;
} // namespace Ui
2018-05-07 17:44:33 +00:00
namespace Window {
class ConnectingWidget;
} // namespace Window
2016-11-24 19:28:23 +00:00
namespace Intro {
class Widget : public Ui::RpWidget, private MTP::Sender, private base::Subscriber {
Q_OBJECT
public:
2016-11-24 19:28:23 +00:00
Widget(QWidget *parent);
void showAnimated(const QPixmap &bgAnimCache, bool back = false);
2016-11-24 19:28:23 +00:00
void setInnerFocus();
2016-11-24 19:28:23 +00:00
~Widget();
protected:
void paintEvent(QPaintEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void keyPressEvent(QKeyEvent *e) override;
signals:
void countryChanged();
#ifndef TDESKTOP_DISABLE_AUTOUPDATE
private slots:
void onCheckUpdateStatus();
#endif // TDESKTOP_DISABLE_AUTOUPDATE
2016-11-24 19:28:23 +00:00
// Internal interface.
public:
struct Data {
QString country;
QString phone;
QByteArray phoneHash;
2016-11-24 19:28:23 +00:00
bool phoneIsRegistered = false;
enum class CallStatus {
Waiting,
Calling,
Called,
Disabled,
};
CallStatus callStatus = CallStatus::Disabled;
int callTimeout = 0;
QString code;
int codeLength = 5;
bool codeByTelegram = false;
QByteArray pwdSalt;
bool hasRecovery = false;
QString pwdHint;
bool pwdNotEmptyPassport = false;
2016-11-24 19:28:23 +00:00
2018-06-01 07:00:18 +00:00
TextWithEntities termsText;
bool termsPopup = false;
int termsAge = 0;
2016-11-24 19:28:23 +00:00
base::Observable<void> updated;
};
enum class Direction {
Back,
Forward,
Replace,
};
class Step : public TWidget, public RPCSender, protected base::Subscriber {
2016-11-24 19:28:23 +00:00
public:
Step(QWidget *parent, Data *data, bool hasCover = false);
2018-06-01 07:00:18 +00:00
virtual void finishInit() {
}
2016-11-24 19:28:23 +00:00
virtual void setInnerFocus() {
setFocus();
}
2018-05-30 15:08:12 +00:00
void setGoCallback(
base::lambda<void(Step *step, Direction direction)> callback);
void setShowResetCallback(base::lambda<void()> callback);
2018-06-01 07:00:18 +00:00
void setShowTermsCallback(
base::lambda<void()> callback);
void setAcceptTermsCallback(
base::lambda<void(base::lambda<void()> callback)> callback);
2016-11-24 19:28:23 +00:00
void prepareShowAnimated(Step *after);
void showAnimated(Direction direction);
void showFast();
bool animating() const;
bool hasCover() const;
virtual bool hasBack() const;
virtual void activate();
virtual void cancelled();
virtual void finished();
virtual void submit() = 0;
virtual QString nextButtonText() const;
int contentLeft() const;
int contentTop() const;
void setErrorCentered(bool centered);
void setErrorBelowLink(bool below);
void showError(base::lambda<QString()> textFactory);
2016-11-24 19:28:23 +00:00
void hideError() {
showError(base::lambda<QString()>());
2016-11-24 19:28:23 +00:00
}
~Step();
2016-11-24 19:28:23 +00:00
protected:
void paintEvent(QPaintEvent *e) override;
void resizeEvent(QResizeEvent *e) override;
void setTitleText(base::lambda<QString()> richTitleTextFactory);
void setDescriptionText(base::lambda<QString()> richDescriptionTextFactory);
2016-11-24 19:28:23 +00:00
bool paintAnimated(Painter &p, QRect clip);
2018-06-01 07:00:18 +00:00
void fillSentCodeData(const MTPDauth_sentCode &type);
2016-11-24 19:28:23 +00:00
void showDescription();
void hideDescription();
Data *getData() const {
return _data;
}
void finish(const MTPUser &user, QImage &&photo = QImage());
2016-11-24 19:28:23 +00:00
void goBack() {
if (_goCallback) _goCallback(nullptr, Direction::Back);
}
void goNext(Step *step) {
if (_goCallback) _goCallback(step, Direction::Forward);
}
void goReplace(Step *step) {
if (_goCallback) _goCallback(step, Direction::Replace);
}
void showResetButton() {
if (_showResetCallback) _showResetCallback();
}
2018-06-01 07:00:18 +00:00
void showTerms() {
if (_showTermsCallback) _showTermsCallback();
2018-05-30 15:08:12 +00:00
}
2018-06-01 07:00:18 +00:00
void acceptTerms(base::lambda<void()> callback) {
2018-05-30 15:08:12 +00:00
if (_acceptTermsCallback) {
2018-06-01 07:00:18 +00:00
_acceptTermsCallback(callback);
2018-05-30 15:08:12 +00:00
}
}
2016-11-24 19:28:23 +00:00
private:
struct CoverAnimation {
CoverAnimation() = default;
CoverAnimation(CoverAnimation &&other) = default;
CoverAnimation &operator=(CoverAnimation &&other) = default;
~CoverAnimation();
std::unique_ptr<Ui::CrossFadeAnimation> title;
std::unique_ptr<Ui::CrossFadeAnimation> description;
2016-11-24 19:28:23 +00:00
// From content top till the next button top.
QPixmap contentSnapshotWas;
QPixmap contentSnapshotNow;
};
void updateLabelsPosition();
void paintContentSnapshot(Painter &p, const QPixmap &snapshot, float64 alpha, float64 howMuchHidden);
void refreshError();
void refreshTitle();
void refreshDescription();
void refreshLang();
2016-11-24 19:28:23 +00:00
CoverAnimation prepareCoverAnimation(Step *step);
QPixmap prepareContentSnapshot();
QPixmap prepareSlideAnimation();
void showFinished();
void prepareCoverMask();
void paintCover(Painter &p, int top);
Data *_data = nullptr;
bool _hasCover = false;
base::lambda<void(Step *step, Direction direction)> _goCallback;
base::lambda<void()> _showResetCallback;
2018-06-01 07:00:18 +00:00
base::lambda<void()> _showTermsCallback;
2018-05-30 15:08:12 +00:00
base::lambda<void(
base::lambda<void()> callback)> _acceptTermsCallback;
2016-11-24 19:28:23 +00:00
object_ptr<Ui::FlatLabel> _title;
base::lambda<QString()> _titleTextFactory;
object_ptr<Ui::FadeWrap<Ui::FlatLabel>> _description;
base::lambda<QString()> _descriptionTextFactory;
2016-11-24 19:28:23 +00:00
bool _errorCentered = false;
bool _errorBelowLink = false;
base::lambda<QString()> _errorTextFactory;
object_ptr<Ui::FadeWrap<Ui::FlatLabel>> _error = { nullptr };
2016-11-24 19:28:23 +00:00
Animation _a_show;
2016-11-24 19:28:23 +00:00
CoverAnimation _coverAnimation;
std::unique_ptr<Ui::SlideAnimation> _slideAnimation;
2016-11-24 19:28:23 +00:00
QPixmap _coverMask;
};
private:
2018-05-07 17:44:33 +00:00
void setupConnectingWidget();
void refreshLang();
void animationCallback();
2017-05-30 09:31:40 +00:00
void createLanguageLink();
2016-11-24 19:28:23 +00:00
void updateControlsGeometry();
2016-11-24 19:28:23 +00:00
Data *getData() {
return &_data;
}
2016-11-24 19:28:23 +00:00
void fixOrder();
void showControls();
void hideControls();
QRect calculateStepRect() const;
2016-11-24 19:28:23 +00:00
void showResetButton();
void resetAccount();
2018-06-01 07:00:18 +00:00
void showTerms();
void acceptTerms(base::lambda<void()> callback);
2018-05-30 15:08:12 +00:00
void hideAndDestroy(object_ptr<Ui::FadeWrap<Ui::RpWidget>> widget);
2016-11-24 19:28:23 +00:00
Step *getStep(int skip = 0) {
Assert(_stepHistory.size() + skip > 0);
return _stepHistory.at(_stepHistory.size() - skip - 1);
}
2016-11-24 19:28:23 +00:00
void historyMove(Direction direction);
void moveToStep(Step *step, Direction direction);
void appendStep(Step *step);
2017-05-30 09:31:40 +00:00
void getNearestDC();
2018-06-01 07:00:18 +00:00
void showTerms(base::lambda<void()> callback);
2017-05-30 09:31:40 +00:00
Animation _a_show;
bool _showBack = false;
QPixmap _cacheUnder, _cacheOver;
QVector<Step*> _stepHistory;
2016-04-14 19:24:42 +00:00
2016-11-24 19:28:23 +00:00
Data _data;
Animation _coverShownAnimation;
2016-11-24 19:28:23 +00:00
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::RoundButton> _next;
object_ptr<Ui::FadeWrap<Ui::LinkButton>> _changeLanguage = { nullptr };
object_ptr<Ui::FadeWrap<Ui::RoundButton>> _resetAccount = { nullptr };
2018-05-30 15:08:12 +00:00
object_ptr<Ui::FadeWrap<Ui::FlatLabel>> _terms = { nullptr };
2018-05-07 17:44:33 +00:00
base::unique_qptr<Window::ConnectingWidget> _connecting;
2016-11-24 19:28:23 +00:00
mtpRequestId _resetRequest = 0;
};
2016-11-24 19:28:23 +00:00
} // namespace Intro