intro_code_input.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "ui/rp_widget.h"
  9. namespace Ui {
  10. class CodeDigit;
  11. class PopupMenu;
  12. class CodeInput final : public Ui::RpWidget {
  13. public:
  14. CodeInput(QWidget *parent);
  15. void setDigitsCountMax(int digitsCount);
  16. void setCode(QString code);
  17. void requestCode();
  18. [[nodiscard]] rpl::producer<QString> codeCollected() const;
  19. void clear();
  20. void showError();
  21. protected:
  22. void focusInEvent(QFocusEvent *e) override;
  23. void focusOutEvent(QFocusEvent *e) override;
  24. void paintEvent(QPaintEvent *e) override;
  25. void keyPressEvent(QKeyEvent *e) override;
  26. void contextMenuEvent(QContextMenuEvent *e) override;
  27. private:
  28. [[nodiscard]] QString collectDigits() const;
  29. void insertCodeAndSubmit(const QString &code);
  30. void unfocusAll(int except);
  31. void findEmptyAndPerform(const Fn<void(int)> &callback);
  32. int _digitsCountMax = 0;
  33. std::vector<not_null<CodeDigit*>> _digits;
  34. int _currentIndex = 0;
  35. base::unique_qptr<Ui::PopupMenu> _menu;
  36. rpl::event_stream<QString> _codeCollected;
  37. };
  38. } // namespace Ui