special_fields.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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/widgets/fields/masked_input_field.h"
  9. namespace Ui {
  10. class CountryCodeInput : public MaskedInputField {
  11. public:
  12. CountryCodeInput(QWidget *parent, const style::InputField &st);
  13. void startErasing(QKeyEvent *e);
  14. [[nodiscard]] rpl::producer<QString> addedToNumber() const {
  15. return _addedToNumber.events();
  16. }
  17. [[nodiscard]] rpl::producer<QString> codeChanged() const {
  18. return _codeChanged.events();
  19. }
  20. void codeSelected(const QString &code);
  21. protected:
  22. void correctValue(
  23. const QString &was,
  24. int wasCursor,
  25. QString &now,
  26. int &nowCursor) override;
  27. private:
  28. bool _nosignal = false;
  29. rpl::event_stream<QString> _addedToNumber;
  30. rpl::event_stream<QString> _codeChanged;
  31. };
  32. class PhonePartInput : public MaskedInputField {
  33. public:
  34. using GroupsCallback = Fn<QVector<int>(const QString &)>;
  35. PhonePartInput(
  36. QWidget *parent,
  37. const style::InputField &st,
  38. GroupsCallback groupsCallback);
  39. [[nodiscard]] auto frontBackspaceEvent() const
  40. -> rpl::producer<not_null<QKeyEvent*>> {
  41. return _frontBackspaceEvent.events();
  42. }
  43. void addedToNumber(const QString &added);
  44. void chooseCode(const QString &code);
  45. protected:
  46. void keyPressEvent(QKeyEvent *e) override;
  47. void correctValue(
  48. const QString &was,
  49. int wasCursor,
  50. QString &now,
  51. int &nowCursor) override;
  52. void paintAdditionalPlaceholder(QPainter &p) override;
  53. private:
  54. void updatePattern(QVector<int> &&pattern);
  55. QString _code;
  56. QString _lastDigits;
  57. QVector<int> _pattern;
  58. QString _additionalPlaceholder;
  59. rpl::event_stream<not_null<QKeyEvent*>> _frontBackspaceEvent;
  60. GroupsCallback _groupsCallback;
  61. };
  62. class UsernameInput : public MaskedInputField {
  63. public:
  64. UsernameInput(
  65. QWidget *parent,
  66. const style::InputField &st,
  67. rpl::producer<QString> placeholder,
  68. const QString &val,
  69. const QString &linkPlaceholder);
  70. void setLinkPlaceholder(const QString &placeholder);
  71. protected:
  72. void correctValue(
  73. const QString &was,
  74. int wasCursor,
  75. QString &now,
  76. int &nowCursor) override;
  77. void paintAdditionalPlaceholder(QPainter &p) override;
  78. private:
  79. QString _linkPlaceholder;
  80. };
  81. class PhoneInput : public MaskedInputField {
  82. public:
  83. using GroupsCallback = Fn<QVector<int>(const QString &)>;
  84. PhoneInput(
  85. QWidget *parent,
  86. const style::InputField &st,
  87. rpl::producer<QString> placeholder,
  88. const QString &defaultValue,
  89. QString value,
  90. GroupsCallback groupsCallback);
  91. void clearText();
  92. protected:
  93. void focusInEvent(QFocusEvent *e) override;
  94. void correctValue(
  95. const QString &was,
  96. int wasCursor,
  97. QString &now,
  98. int &nowCursor) override;
  99. void paintAdditionalPlaceholder(QPainter &p) override;
  100. private:
  101. QString _defaultValue;
  102. QVector<int> _pattern;
  103. QString _additionalPlaceholder;
  104. GroupsCallback _groupsCallback;
  105. };
  106. } // namespace Ui