From 5e2acdeaa311ed598907ace7a00401b2b65fd76a Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 6 May 2022 03:32:21 +0300 Subject: [PATCH] Added step section of password input to cloud password settings. --- Telegram/CMakeLists.txt | 2 + .../cloud_password/password_input.tgs | Bin 0 -> 27931 bytes Telegram/Resources/langs/lang.strings | 4 +- .../Resources/qrc/telegram/animations.qrc | 1 + .../settings_cloud_password_common.cpp | 18 ++ .../settings_cloud_password_common.h | 19 +- .../settings_cloud_password_input.cpp | 177 ++++++++++++++++++ .../settings_cloud_password_input.h | 17 ++ .../settings_cloud_password_start.cpp | 2 + 9 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 Telegram/Resources/animations/cloud_password/password_input.tgs create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp create mode 100644 Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 3d7cc7f56d..dd4a7fe519 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1074,6 +1074,8 @@ PRIVATE profile/profile_cover_drop_area.h settings/cloud_password/settings_cloud_password_common.cpp settings/cloud_password/settings_cloud_password_common.h + settings/cloud_password/settings_cloud_password_input.cpp + settings/cloud_password/settings_cloud_password_input.h settings/cloud_password/settings_cloud_password_start.cpp settings/cloud_password/settings_cloud_password_start.h settings/settings_advanced.cpp diff --git a/Telegram/Resources/animations/cloud_password/password_input.tgs b/Telegram/Resources/animations/cloud_password/password_input.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f16eca5adadee936af9805df17f283377f1ad055 GIT binary patch literal 27931 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index bdd3018279..9060e836b1 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -699,8 +699,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_cloud_password_reset_cancel" = "Cancel password reset"; "lng_cloud_password_enter_old" = "Enter current password"; "lng_cloud_password_enter_first" = "Enter a password"; -"lng_cloud_password_enter_new" = "Enter new password"; -"lng_cloud_password_confirm_new" = "Re-enter new password"; +"lng_cloud_password_enter_new" = "Enter password"; +"lng_cloud_password_confirm_new" = "Re-enter password"; "lng_cloud_password_hint" = "Enter password hint"; "lng_cloud_password_change_hint" = "Enter new password hint"; "lng_cloud_password_bad" = "Password and hint cannot be the same."; diff --git a/Telegram/Resources/qrc/telegram/animations.qrc b/Telegram/Resources/qrc/telegram/animations.qrc index 889f17357b..3b435db305 100644 --- a/Telegram/Resources/qrc/telegram/animations.qrc +++ b/Telegram/Resources/qrc/telegram/animations.qrc @@ -5,5 +5,6 @@ ../../animations/filters.tgs ../../animations/local_passcode_enter.tgs ../../animations/cloud_password/intro.tgs + ../../animations/cloud_password/password_input.tgs diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp index 8874b8d09f..fc9a3c9fc7 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp @@ -244,6 +244,24 @@ rpl::producer<> AbstractStep::sectionShowBack() { return _showBack.events(); } +void AbstractStep::setStepDataReference(std::any &data) { + _stepData = &data; +} + +StepData AbstractStep::stepData() const { + if (!_stepData || !_stepData->has_value()) { + StepData(); + } + const auto my = std::any_cast(_stepData); + return my ? (*my) : StepData(); +} + +void AbstractStep::setStepData(StepData data) { + if (_stepData) { + *_stepData = data; + } +} + AbstractStep::~AbstractStep() = default; } // namespace Settings::CloudPassword diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h index 9e676f76e4..19db8ab35d 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h @@ -19,6 +19,10 @@ class VerticalLayout; namespace Settings::CloudPassword { +struct StepData { + QString password; +}; + void SetupHeader( not_null content, const QString &lottie, @@ -79,6 +83,8 @@ public: [[nodiscard]] rpl::producer sectionShowOther() override; [[nodiscard]] rpl::producer<> sectionShowBack() override; + void setStepDataReference(std::any &data) override; + protected: [[nodiscard]] not_null controller() const; @@ -89,6 +95,9 @@ protected: [[nodiscard]] rpl::producer<> showFinishes() const; + StepData stepData() const; + void setStepData(StepData data); + private: const not_null _controller; @@ -98,15 +107,17 @@ private: rpl::event_stream _showOther; rpl::event_stream<> _showBack; + std::any *_stepData; + }; template class TypedAbstractStep : public AbstractStep { public: - TypedAbstractStep( - QWidget *parent, - not_null controller) - : AbstractStep(parent, controller) { + using AbstractStep::AbstractStep; + + void setStepDataReference(std::any &data) override final { + AbstractStep::setStepDataReference(data); static_cast(this)->setupContent(); } diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp new file mode 100644 index 0000000000..907ced39c6 --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.cpp @@ -0,0 +1,177 @@ +/* +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 "settings/cloud_password/settings_cloud_password_input.h" + +#include "base/qt_signal_producer.h" +#include "lang/lang_keys.h" +#include "lottie/lottie_icon.h" +#include "settings/cloud_password/settings_cloud_password_common.h" +#include "ui/widgets/buttons.h" +#include "ui/widgets/input_fields.h" +#include "ui/widgets/labels.h" +#include "ui/wrap/vertical_layout.h" +#include "styles/style_boxes.h" +#include "styles/style_settings.h" + +namespace Settings { +namespace CloudPassword { +namespace { + +struct Icon { + not_null icon; + Fn update; +}; + +Icon CreateInteractiveLottieIcon( + not_null container, + Lottie::IconDescriptor &&descriptor, + style::margins padding) { + auto object = object_ptr(container); + const auto raw = object.data(); + + const auto width = descriptor.sizeOverride.width(); + raw->resize(QRect( + QPoint(), + descriptor.sizeOverride).marginsAdded(padding).size()); + + auto owned = Lottie::MakeIcon(std::move(descriptor)); + const auto icon = owned.get(); + + raw->lifetime().add([kept = std::move(owned)]{}); + + raw->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(raw); + const auto left = (raw->width() - width) / 2; + icon->paint(p, left, padding.top()); + }, raw->lifetime()); + + container->add(std::move(object)); + return { .icon = icon, .update = [=] { raw->update(); } }; +} + +} // namespace + +class Input : public TypedAbstractStep { +public: + using TypedAbstractStep::TypedAbstractStep; + + [[nodiscard]] rpl::producer title() override; + void setupContent(); + +}; + +rpl::producer Input::title() { + return tr::lng_settings_cloud_password_password_title(); +} + +void Input::setupContent() { + const auto content = Ui::CreateChild(this); + auto currentStepData = stepData(); + const auto currentStepDataPassword = base::take(currentStepData.password); + setStepData(currentStepData); + + const auto icon = CreateInteractiveLottieIcon( + content, + { + .name = u"cloud_password/password_input"_q, + .sizeOverride = { + st::changePhoneIconSize, + st::changePhoneIconSize + }, + }, + st::settingLocalPasscodeIconPadding); + + SetupHeader( + content, + QString(), + rpl::never<>(), + tr::lng_settings_cloud_password_password_subtitle(), + tr::lng_cloud_password_about()); + + AddSkip(content, st::settingLocalPasscodeDescriptionBottomSkip); + + const auto newInput = AddPasswordField( + content, + tr::lng_cloud_password_enter_new(), + currentStepDataPassword); + const auto reenterInput = AddPasswordField( + content, + tr::lng_cloud_password_confirm_new(), + currentStepDataPassword); + const auto error = AddError(content, reenterInput); + + if (!newInput->text().isEmpty()) { + icon.icon->jumpTo(icon.icon->framesCount() / 2, icon.update); + } + + const auto button = AddDoneButton(content, tr::lng_continue()); + button->setClickedCallback([=] { + const auto newText = newInput->text(); + const auto reenterText = reenterInput->text(); + if (newText.isEmpty()) { + newInput->setFocus(); + newInput->showError(); + } else if (reenterText.isEmpty()) { + reenterInput->setFocus(); + reenterInput->showError(); + } else if (newText != reenterText) { + reenterInput->setFocus(); + reenterInput->showError(); + reenterInput->selectAll(); + error->show(); + error->setText(tr::lng_cloud_password_differ(tr::now)); + } else { + auto data = stepData(); + data.password = newText; + setStepData(std::move(data)); + } + }); + + base::qt_signal_producer( + newInput.get(), + &QLineEdit::textChanged // Covers Undo. + ) | rpl::map([=] { + return newInput->text().isEmpty(); + }) | rpl::distinct_until_changed( + ) | rpl::start_with_next([=](bool empty) { + const auto from = icon.icon->frameIndex(); + const auto to = empty ? 0 : (icon.icon->framesCount() / 2 - 1); + icon.icon->animate(icon.update, from, to); + }, content->lifetime()); + + const auto submit = [=] { + if (reenterInput->hasFocus()) { + button->clicked({}, Qt::LeftButton); + } else { + reenterInput->setFocus(); + } + }; + QObject::connect(newInput, &Ui::MaskedInputField::submitted, submit); + QObject::connect(reenterInput, &Ui::MaskedInputField::submitted, submit); + + setFocusCallback([=] { + if (newInput->text().isEmpty()) { + newInput->setFocus(); + } else if (reenterInput->text().isEmpty()) { + reenterInput->setFocus(); + } else { + newInput->setFocus(); + } + }); + + Ui::ResizeFitChild(this, content); +} + +} // namespace CloudPassword + +Type CloudPasswordInputId() { + return CloudPassword::Input::Id(); +} + +} // namespace Settings diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.h new file mode 100644 index 0000000000..1103047df4 --- /dev/null +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_input.h @@ -0,0 +1,17 @@ +/* +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 "settings/settings_type.h" + +namespace Settings { + +Type CloudPasswordInputId(); + +} // namespace Settings + diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp index a728efee3e..0bb13778d0 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_start.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "settings/cloud_password/settings_cloud_password_common.h" +#include "settings/cloud_password/settings_cloud_password_input.h" #include "ui/widgets/buttons.h" #include "ui/wrap/vertical_layout.h" #include "styles/style_settings.h" @@ -49,6 +50,7 @@ void Start::setupContent() { content, tr::lng_settings_cloud_password_password_subtitle() )->setClickedCallback([=] { + showOther(CloudPasswordInputId()); }); Ui::ResizeFitChild(this, content);