From 1c48f33dc169e4804fe553f0ae5ce91df49f51a6 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 10 Apr 2018 20:58:51 +0400 Subject: [PATCH] Allow gender edition in passport. --- Telegram/SourceFiles/passport/passport.style | 1 + .../passport/passport_panel_details_row.cpp | 92 ++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/passport/passport.style b/Telegram/SourceFiles/passport/passport.style index 86888205f7..392e416087 100644 --- a/Telegram/SourceFiles/passport/passport.style +++ b/Telegram/SourceFiles/passport/passport.style @@ -210,5 +210,6 @@ passportDetailsFieldLeft: 116px; passportDetailsFieldTop: 2px; passportDetailsFieldSkipMin: 12px; passportDetailsSkip: 30px; +passportDetailsGenderSkip: 30px; passportRequestTypeSkip: 16px; diff --git a/Telegram/SourceFiles/passport/passport_panel_details_row.cpp b/Telegram/SourceFiles/passport/passport_panel_details_row.cpp index 821150f287..1cd21f44af 100644 --- a/Telegram/SourceFiles/passport/passport_panel_details_row.cpp +++ b/Telegram/SourceFiles/passport/passport_panel_details_row.cpp @@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/widgets/input_fields.h" #include "ui/widgets/labels.h" #include "ui/widgets/buttons.h" +#include "ui/widgets/checkbox.h" #include "ui/wrap/slide_wrap.h" #include "ui/countryinput.h" #include "styles/style_boxes.h" @@ -145,9 +146,33 @@ private: }; -class GenderRow : public TextRow { +class GenderRow : public PanelDetailsRow { public: - using TextRow::TextRow; + GenderRow( + QWidget *parent, + const QString &label, + const QString &value); + + rpl::producer value() const override; + QString valueCurrent() const override; + +private: + enum class Gender { + Male, + Female, + }; + + static base::optional StringToGender(const QString &value); + static QString GenderToString(Gender gender); + + int resizeInner(int left, int top, int width) override; + void showInnerError() override; + void finishInnerAnimating() override; + + std::shared_ptr> _group; + object_ptr> _male; + object_ptr> _female; + rpl::variable _value; }; @@ -710,6 +735,69 @@ void DateRow::startBorderAnimation() { } } +GenderRow::GenderRow( + QWidget *parent, + const QString &label, + const QString &value) +: PanelDetailsRow(parent, label) +, _group(StringToGender(value).has_value() + ? std::make_shared>(*StringToGender(value)) + : std::make_shared>()) +, _male( + this, + _group, + Gender::Male, + lang(lng_passport_gender_male), + st::defaultCheckbox) +, _female( + this, + _group, + Gender::Female, + lang(lng_passport_gender_female), + st::defaultCheckbox) +, _value(StringToGender(value) ? value : QString()) { + _group->setChangedCallback([=](Gender gender) { + _value = GenderToString(gender); + }); +} + +auto GenderRow::StringToGender(const QString &value) +-> base::optional { + if (value == qstr("male")) { + return Gender::Male; + } else if (value == qstr("female")) { + return Gender::Female; + } + return base::none; +} + +QString GenderRow::GenderToString(Gender gender) { + return (gender == Gender::Male) ? "male" : "female"; +} + +QString GenderRow::valueCurrent() const { + return _value.current(); +} + +rpl::producer GenderRow::value() const { + return _value.value(); +} + +int GenderRow::resizeInner(int left, int top, int width) { + top += st::passportDetailsField.textMargins.top(); + top -= st::defaultCheckbox.textPosition.y(); + _male->moveToLeft(left, top); + left += _male->widthNoMargins() + st::passportDetailsGenderSkip; + _female->moveToLeft(left, top); + return st::semiboldFont->height; +} + +void GenderRow::showInnerError() { +} + +void GenderRow::finishInnerAnimating() { +} + } // namespace int PanelLabel::naturalWidth() const {