/* 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 "ui/rp_widget.h" #include "base/object_ptr.h" namespace Ui { class InputField; class ScrollArea; class FadeShadow; class PlainShadow; class FlatLabel; class RoundButton; class VerticalLayout; class SettingsButton; class BoxContent; template class SlideWrap; } // namespace Ui namespace Passport::Ui { using namespace ::Ui; enum class PanelDetailsType; class PanelDetailsRow; } // namespace Passport::Ui namespace Passport { class PanelController; struct ValueMap; struct ScanInfo; class EditScans; enum class FileType; struct ScanListData; struct EditDocumentCountry { QString countryCode; QString languageCode; }; struct EditDocumentScheme { enum class ValueClass { Fields, Additional, Scans, }; enum class AdditionalVisibility { Hidden, OnlyIfError, Shown, }; using CountryInfo = EditDocumentCountry; struct Row { using Validator = Fn(const QString &value)>; using Formatter = Fn; ValueClass valueClass = ValueClass::Fields; Ui::PanelDetailsType inputType = Ui::PanelDetailsType(); QString key; QString label; Validator error; Formatter format; int lengthLimit = 0; QString keyForAttachmentTo; // Attach [last|middle]_name to first_*. QString additionalFallbackKey; // *_name_native from *_name. }; std::vector rows; QString fieldsHeader; QString detailsHeader; QString scansHeader; QString additionalDependencyKey; Fn additionalShown; Fn additionalHeader; Fn additionalDescription; Fn(const QString &)> preferredLanguage; }; class PanelEditDocument : public Ui::RpWidget { public: using Scheme = EditDocumentScheme; PanelEditDocument( QWidget *parent, not_null controller, Scheme scheme, const QString &error, const ValueMap &data, const QString &scansError, const ValueMap &scansData, ScanListData &&scans, std::optional &&translations, std::map &&specialFiles); PanelEditDocument( QWidget *parent, not_null controller, Scheme scheme, const QString &scansError, const ValueMap &scansData, ScanListData &&scans, std::optional &&translations, std::map &&specialFiles); PanelEditDocument( QWidget *parent, not_null controller, Scheme scheme, const QString &error, const ValueMap &data); bool hasUnsavedChanges() const; protected: void focusInEvent(QFocusEvent *e) override; void resizeEvent(QResizeEvent *e) override; private: struct Result; void setupControls( const QString *error, const ValueMap *data, const QString *scansError, const ValueMap *scansData, ScanListData &&scans, std::optional &&translations, std::map &&specialFiles); not_null setupContent( const QString *error, const ValueMap *data, const QString *scansError, const ValueMap *scansData, ScanListData &&scans, std::optional &&translations, std::map &&specialFiles); void updateControlsGeometry(); void updateCommonError(); Result collect() const; void fillAdditionalFromFallbacks(Result &result) const; bool validate(); void save(); void createDetailsRow( not_null container, int i, const Scheme::Row &row, const ValueMap &fields, int maxLabelWidth); not_null findRow(const QString &key) const; not_null _controller; Scheme _scheme; object_ptr _scroll; object_ptr _topShadow; object_ptr _bottomShadow; QPointer _editScans; QPointer> _commonError; std::map> _details; bool _fieldsChanged = false; bool _additionalShown = false; QPointer _delete; object_ptr _done; }; object_ptr RequestIdentityType( Fn submit, std::vector labels); object_ptr RequestAddressType( Fn submit, std::vector labels); object_ptr ConfirmDeleteDocument( Fn submit, const QString &text, const QString &detailsCheckbox = QString()); } // namespace Passport