diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp index 12d7300cc..8874b8d09 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.cpp @@ -20,6 +20,73 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Settings::CloudPassword { +void OneEdgeBoxContentDivider::skipEdge(Qt::Edge edge, bool skip) { + const auto was = _skipEdges; + if (skip) { + _skipEdges |= edge; + } else { + _skipEdges &= ~edge; + } + if (was != _skipEdges) { + update(); + } +} + +void OneEdgeBoxContentDivider::paintEvent(QPaintEvent *e) { + Painter p(this); + p.fillRect(e->rect(), Ui::BoxContentDivider::color()); + if (!(_skipEdges & Qt::TopEdge)) { + Ui::BoxContentDivider::paintTop(p); + } + if (!(_skipEdges & Qt::BottomEdge)) { + Ui::BoxContentDivider::paintBottom(p); + } +} + +BottomButton CreateBottomDisableButton( + not_null parent, + rpl::producer &§ionGeometryValue, + rpl::producer &&buttonText, + Fn &&callback) { + const auto content = Ui::CreateChild(parent.get()); + + AddSkip(content); + + AddButton( + content, + std::move(buttonText), + st::settingsAttentionButton + )->addClickHandler(std::move(callback)); + + const auto divider = Ui::CreateChild( + parent.get()); + divider->skipEdge(Qt::TopEdge, true); + rpl::combine( + std::move(sectionGeometryValue), + parent->geometryValue(), + content->geometryValue() + ) | rpl::start_with_next([=]( + const QRect &r, + const QRect &parentRect, + const QRect &bottomRect) { + const auto top = r.y() + r.height(); + divider->setGeometry( + 0, + top, + r.width(), + parentRect.height() - top - bottomRect.height()); + }, divider->lifetime()); + divider->show(); + + return { + .content = Ui::MakeWeak(not_null{ content }), + .isBottomFillerShown = divider->geometryValue( + ) | rpl::map([](const QRect &r) { + return r.height() > 0; + }), + }; +} + void SetupHeader( not_null content, const QString &lottie, diff --git a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h index 29912658c..9e676f76e 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "settings/settings_common.h" +#include "ui/widgets/box_content_divider.h" namespace Ui { class FlatLabel; @@ -41,6 +42,31 @@ void SetupHeader( void AddSkipInsteadOfField(not_null content); void AddSkipInsteadOfError(not_null content); +struct BottomButton { + QPointer content; + rpl::producer isBottomFillerShown; +}; + +BottomButton CreateBottomDisableButton( + not_null parent, + rpl::producer &§ionGeometryValue, + rpl::producer &&buttonText, + Fn &&callback); + +class OneEdgeBoxContentDivider : public Ui::BoxContentDivider { +public: + using Ui::BoxContentDivider::BoxContentDivider; + + void skipEdge(Qt::Edge edge, bool skip); + +protected: + void paintEvent(QPaintEvent *e) override; + +private: + Qt::Edges _skipEdges; + +}; + class AbstractStep : public AbstractSection { public: AbstractStep( diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.cpp b/Telegram/SourceFiles/settings/settings_local_passcode.cpp index 44b82b208..72f01c894 100644 --- a/Telegram/SourceFiles/settings/settings_local_passcode.cpp +++ b/Telegram/SourceFiles/settings/settings_local_passcode.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lottie/lottie_icon.h" #include "main/main_domain.h" #include "main/main_session.h" +#include "settings/cloud_password/settings_cloud_password_common.h" #include "settings/settings_common.h" #include "storage/storage_domain.h" #include "ui/boxes/confirm_box.h" @@ -51,43 +52,6 @@ void SetupAutoCloseTimer(rpl::lifetime &lifetime, Fn callback) { timer->callEach(kTimerCheck); } -class Divider : public Ui::BoxContentDivider { -public: - using Ui::BoxContentDivider::BoxContentDivider; - - void skipEdge(Qt::Edge edge, bool skip); - -protected: - void paintEvent(QPaintEvent *e) override; - -private: - Qt::Edges _skipEdges; - -}; - -void Divider::skipEdge(Qt::Edge edge, bool skip) { - const auto was = _skipEdges; - if (skip) { - _skipEdges |= edge; - } else { - _skipEdges &= ~edge; - } - if (was != _skipEdges) { - update(); - } -} - -void Divider::paintEvent(QPaintEvent *e) { - Painter p(this); - p.fillRect(e->rect(), Ui::BoxContentDivider::color()); - if (!(_skipEdges & Qt::TopEdge)) { - Ui::BoxContentDivider::paintTop(p); - } - if (!(_skipEdges & Qt::BottomEdge)) { - Ui::BoxContentDivider::paintBottom(p); - } -} - } // namespace namespace details { @@ -525,6 +489,7 @@ void LocalPasscodeManage::setupContent() { AddSkip(content); + using Divider = CloudPassword::OneEdgeBoxContentDivider; const auto divider = Ui::CreateChild(this); divider->lower(); const auto about = content->add( @@ -554,15 +519,7 @@ void LocalPasscodeManage::setupContent() { QPointer LocalPasscodeManage::createPinnedToBottom( not_null parent) { - const auto content = Ui::CreateChild(parent.get()); - - AddSkip(content); - - AddButton( - content, - tr::lng_settings_passcode_disable(), - st::settingsAttentionButton - )->addClickHandler([=] { + auto callback = [=] { _controller->show( Ui::MakeConfirmBox({ .text = tr::lng_settings_passcode_disable_sure(), @@ -575,32 +532,16 @@ QPointer LocalPasscodeManage::createPinnedToBottom( .confirmText = tr::lng_settings_auto_night_disable(), .confirmStyle = &st::attentionBoxButton, })); - }); - - const auto divider = Ui::CreateChild(parent.get()); - divider->skipEdge(Qt::TopEdge, true); - rpl::combine( + }; + auto bottomButton = CloudPassword::CreateBottomDisableButton( + parent, geometryValue(), - parent->geometryValue(), - content->geometryValue() - ) | rpl::start_with_next([=]( - const QRect &r, - const QRect &parentRect, - const QRect &bottomRect) { - const auto top = r.y() + r.height(); - divider->setGeometry( - 0, - top, - r.width(), - parentRect.height() - top - bottomRect.height()); - }, divider->lifetime()); - divider->show(); - _isBottomFillerShown = divider->geometryValue( - ) | rpl::map([](const QRect &r) { - return r.height() > 0; - }); + tr::lng_settings_passcode_disable(), + std::move(callback)); - return Ui::MakeWeak(not_null{ content }); + _isBottomFillerShown = base::take(bottomButton.isBottomFillerShown); + + return bottomButton.content; } void LocalPasscodeManage::showFinished() {