From 9f0b4bc79992a1bae006d6bf88544f16c085129b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 28 Nov 2023 06:57:55 +0300 Subject: [PATCH] Added ability to paste login code from clipboard to new code input. --- .../SourceFiles/intro/intro_code_input.cpp | 31 +++++++++++++++++++ Telegram/SourceFiles/intro/intro_code_input.h | 5 +++ 2 files changed, 36 insertions(+) diff --git a/Telegram/SourceFiles/intro/intro_code_input.cpp b/Telegram/SourceFiles/intro/intro_code_input.cpp index ff06c1f92..b68da1c65 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.cpp +++ b/Telegram/SourceFiles/intro/intro_code_input.cpp @@ -6,14 +6,18 @@ // #include "intro/intro_code_input.h" +#include "lang/lang_keys.h" #include "ui/abstract_button.h" #include "ui/effects/shake_animation.h" #include "ui/rect.h" #include "ui/text/text_entity.h" +#include "ui/widgets/popup_menu.h" #include "styles/style_intro.h" #include "styles/style_layers.h" // boxRadius #include +#include +#include namespace Ui { namespace { @@ -268,6 +272,8 @@ void CodeInput::keyPressEvent(QKeyEvent *e) { unfocusAll(_currentIndex); } else if (key == Qt::Key_Enter || key == Qt::Key_Return) { requestCode(); + } else if (e == QKeySequence::Paste) { + insertCodeAndSubmit(QGuiApplication::clipboard()->text()); } else if (key >= Qt::Key_A && key <= Qt::Key_Z) { _digits[_currentIndex]->shake(); } else if (key == Qt::Key_Home || key == Qt::Key_PageUp) { @@ -277,6 +283,31 @@ void CodeInput::keyPressEvent(QKeyEvent *e) { } } +void CodeInput::contextMenuEvent(QContextMenuEvent *e) { + if (_menu) { + return; + } + _menu = base::make_unique_q(this, st::defaultPopupMenu); + _menu->addAction(tr::lng_mac_menu_paste(tr::now), [=] { + insertCodeAndSubmit(QGuiApplication::clipboard()->text()); + })->setEnabled(!QGuiApplication::clipboard()->text().isEmpty()); + _menu->popup(QCursor::pos()); +} + +void CodeInput::insertCodeAndSubmit(const QString &code) { + if (code.isEmpty()) { + return; + } + setCode(code); + _currentIndex = _digits.size() - 1; + findEmptyAndPerform([&](int i) { _currentIndex = i; }); + unfocusAll(_currentIndex); + if ((_currentIndex == _digits.size() - 1) + && _digits[_currentIndex]->digit() != kDigitNone) { + requestCode(); + } +} + QString CodeInput::collectDigits() const { auto result = QString(); for (const auto &digit : _digits) { diff --git a/Telegram/SourceFiles/intro/intro_code_input.h b/Telegram/SourceFiles/intro/intro_code_input.h index fc030fcde..f929142df 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.h +++ b/Telegram/SourceFiles/intro/intro_code_input.h @@ -11,6 +11,7 @@ namespace Ui { class CodeDigit; +class PopupMenu; class CodeInput final : public Ui::RpWidget { public: @@ -31,10 +32,12 @@ protected: void focusOutEvent(QFocusEvent *e) override; void paintEvent(QPaintEvent *e) override; void keyPressEvent(QKeyEvent *e) override; + void contextMenuEvent(QContextMenuEvent *e) override; private: [[nodiscard]] QString collectDigits() const; + void insertCodeAndSubmit(const QString &code); void unfocusAll(int except); void findEmptyAndPerform(const Fn &callback); @@ -42,6 +45,8 @@ private: std::vector> _digits; int _currentIndex = 0; + base::unique_qptr _menu; + rpl::event_stream _codeCollected; };