passport_panel_edit_document.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. #include "base/object_ptr.h"
  10. namespace Ui {
  11. class InputField;
  12. class ScrollArea;
  13. class FlatLabel;
  14. class RoundButton;
  15. class VerticalLayout;
  16. class SettingsButton;
  17. class BoxContent;
  18. template <typename Widget>
  19. class SlideWrap;
  20. } // namespace Ui
  21. namespace Passport::Ui {
  22. using namespace ::Ui;
  23. enum class PanelDetailsType;
  24. class PanelDetailsRow;
  25. } // namespace Passport::Ui
  26. namespace Passport {
  27. class PanelController;
  28. struct ValueMap;
  29. struct ScanInfo;
  30. class EditScans;
  31. enum class FileType;
  32. struct ScanListData;
  33. struct EditDocumentCountry {
  34. QString countryCode;
  35. QString languageCode;
  36. };
  37. struct EditDocumentScheme {
  38. enum class ValueClass {
  39. Fields,
  40. Additional,
  41. Scans,
  42. };
  43. enum class AdditionalVisibility {
  44. Hidden,
  45. OnlyIfError,
  46. Shown,
  47. };
  48. using CountryInfo = EditDocumentCountry;
  49. struct Row {
  50. using Validator = Fn<std::optional<QString>(const QString &value)>;
  51. using Formatter = Fn<QString(const QString &value)>;
  52. ValueClass valueClass = ValueClass::Fields;
  53. Ui::PanelDetailsType inputType = Ui::PanelDetailsType();
  54. QString key;
  55. QString label;
  56. Validator error;
  57. Formatter format;
  58. int lengthLimit = 0;
  59. QString keyForAttachmentTo; // Attach [last|middle]_name to first_*.
  60. QString additionalFallbackKey; // *_name_native from *_name.
  61. };
  62. std::vector<Row> rows;
  63. QString fieldsHeader;
  64. QString detailsHeader;
  65. QString scansHeader;
  66. QString additionalDependencyKey;
  67. Fn<AdditionalVisibility(const CountryInfo &dependency)> additionalShown;
  68. Fn<QString(const CountryInfo &dependency)> additionalHeader;
  69. Fn<QString(const CountryInfo &dependency)> additionalDescription;
  70. Fn<rpl::producer<CountryInfo>(const QString &)> preferredLanguage;
  71. };
  72. class PanelEditDocument : public Ui::RpWidget {
  73. public:
  74. using Scheme = EditDocumentScheme;
  75. PanelEditDocument(
  76. QWidget *parent,
  77. not_null<PanelController*> controller,
  78. Scheme scheme,
  79. const QString &error,
  80. const ValueMap &data,
  81. const QString &scansError,
  82. const ValueMap &scansData,
  83. ScanListData &&scans,
  84. std::optional<ScanListData> &&translations,
  85. std::map<FileType, ScanInfo> &&specialFiles);
  86. PanelEditDocument(
  87. QWidget *parent,
  88. not_null<PanelController*> controller,
  89. Scheme scheme,
  90. const QString &scansError,
  91. const ValueMap &scansData,
  92. ScanListData &&scans,
  93. std::optional<ScanListData> &&translations,
  94. std::map<FileType, ScanInfo> &&specialFiles);
  95. PanelEditDocument(
  96. QWidget *parent,
  97. not_null<PanelController*> controller,
  98. Scheme scheme,
  99. const QString &error,
  100. const ValueMap &data);
  101. bool hasUnsavedChanges() const;
  102. protected:
  103. void focusInEvent(QFocusEvent *e) override;
  104. void resizeEvent(QResizeEvent *e) override;
  105. private:
  106. struct Result;
  107. void setupControls(
  108. const QString *error,
  109. const ValueMap *data,
  110. const QString *scansError,
  111. const ValueMap *scansData,
  112. ScanListData &&scans,
  113. std::optional<ScanListData> &&translations,
  114. std::map<FileType, ScanInfo> &&specialFiles);
  115. not_null<Ui::RpWidget*> setupContent(
  116. const QString *error,
  117. const ValueMap *data,
  118. const QString *scansError,
  119. const ValueMap *scansData,
  120. ScanListData &&scans,
  121. std::optional<ScanListData> &&translations,
  122. std::map<FileType, ScanInfo> &&specialFiles);
  123. void updateControlsGeometry();
  124. void updateCommonError();
  125. Result collect() const;
  126. void fillAdditionalFromFallbacks(Result &result) const;
  127. bool validate();
  128. void save();
  129. void createDetailsRow(
  130. not_null<Ui::VerticalLayout*> container,
  131. int i,
  132. const Scheme::Row &row,
  133. const ValueMap &fields,
  134. int maxLabelWidth);
  135. not_null<Ui::PanelDetailsRow*> findRow(const QString &key) const;
  136. not_null<PanelController*> _controller;
  137. Scheme _scheme;
  138. object_ptr<Ui::ScrollArea> _scroll;
  139. QPointer<EditScans> _editScans;
  140. QPointer<Ui::SlideWrap<Ui::FlatLabel>> _commonError;
  141. std::map<int, QPointer<Ui::PanelDetailsRow>> _details;
  142. bool _fieldsChanged = false;
  143. bool _additionalShown = false;
  144. QPointer<Ui::SettingsButton> _delete;
  145. object_ptr<Ui::RoundButton> _done;
  146. };
  147. object_ptr<Ui::BoxContent> RequestIdentityType(
  148. Fn<void(int index)> submit,
  149. std::vector<QString> labels);
  150. object_ptr<Ui::BoxContent> RequestAddressType(
  151. Fn<void(int index)> submit,
  152. std::vector<QString> labels);
  153. object_ptr<Ui::BoxContent> ConfirmDeleteDocument(
  154. Fn<void(bool withDetails)> submit,
  155. const QString &text,
  156. const QString &detailsCheckbox = QString());
  157. } // namespace Passport