From 5ef48cac9cb0576d31d3c15910b4b5e0e9e07858 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 29 Sep 2023 09:38:17 +0400 Subject: [PATCH] Use shared_ptr as settings section id. --- .../info/settings/info_settings_widget.cpp | 2 +- .../settings_cloud_password_common.h | 2 +- .../SourceFiles/settings/settings_common.h | 14 ++++---- .../settings/settings_local_passcode.cpp | 2 +- .../settings/settings_notifications.cpp | 4 +-- .../settings/settings_notifications_type.cpp | 32 +++++++++---------- .../settings/settings_notifications_type.h | 25 ++++----------- Telegram/SourceFiles/settings/settings_type.h | 4 +-- 8 files changed, 37 insertions(+), 48 deletions(-) diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp index 58e5e65f1..42633f1fe 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp @@ -45,7 +45,7 @@ Widget::Widget( , _self(controller->key().settingsSelf()) , _type(controller->section().settingsType()) , _inner([&] { - auto inner = _type()->create(this, controller->parentController()); + auto inner = _type->create(this, controller->parentController()); if (inner->hasFlexibleTopBar()) { auto filler = setInnerWidget(object_ptr(this)); filler->resize(1, 1); 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 ed1d94c7c..d18bca048 100644 --- a/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h +++ b/Telegram/SourceFiles/settings/cloud_password/settings_cloud_password_common.h @@ -162,7 +162,7 @@ public: } [[nodiscard]] static Type Id() { - return &SectionMetaImplementation::Meta; + return SectionFactory::Instance(); } [[nodiscard]] Type id() const final override { return Id(); diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index d601a1c1d..0a7a48384 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -52,14 +52,16 @@ using Button = Ui::SettingsButton; class AbstractSection; -struct SectionMeta { +struct AbstractSectionFactory { [[nodiscard]] virtual object_ptr create( not_null parent, not_null controller) const = 0; + + virtual ~AbstractSectionFactory() = default; }; template -struct SectionMetaImplementation : SectionMeta { +struct SectionFactory : AbstractSectionFactory { object_ptr create( not_null parent, not_null controller @@ -67,9 +69,9 @@ struct SectionMetaImplementation : SectionMeta { return object_ptr(parent, controller); } - [[nodiscard]] static not_null Meta() { - static SectionMetaImplementation result; - return &result; + [[nodiscard]] static const std::shared_ptr &Instance() { + static const auto result = std::make_shared(); + return result; } }; @@ -120,7 +122,7 @@ public: using AbstractSection::AbstractSection; [[nodiscard]] static Type Id() { - return &SectionMetaImplementation::Meta; + return SectionFactory::Instance(); } [[nodiscard]] Type id() const final override { return Id(); diff --git a/Telegram/SourceFiles/settings/settings_local_passcode.cpp b/Telegram/SourceFiles/settings/settings_local_passcode.cpp index 49e8ba019..77dad4027 100644 --- a/Telegram/SourceFiles/settings/settings_local_passcode.cpp +++ b/Telegram/SourceFiles/settings/settings_local_passcode.cpp @@ -330,7 +330,7 @@ public: } [[nodiscard]] static Type Id() { - return &SectionMetaImplementation::Meta; + return SectionFactory::Instance(); } [[nodiscard]] Type id() const final override { return Id(); diff --git a/Telegram/SourceFiles/settings/settings_notifications.cpp b/Telegram/SourceFiles/settings/settings_notifications.cpp index 246e67450..63d7c0160 100644 --- a/Telegram/SourceFiles/settings/settings_notifications.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications.cpp @@ -171,7 +171,7 @@ void AddTypeButton( st::settingsNotificationType, { icon }); button->setClickedCallback([=] { - showOther(NotificationsTypeId(type)); + showOther(NotificationsType::Id(type)); }); const auto session = &controller->session(); @@ -290,7 +290,7 @@ void AddTypeButton( tr::lng_notification_exceptions_view(), [=] { box->closeBox(); - showOther(NotificationsTypeId(type)); + showOther(NotificationsType::Id(type)); }); })); } diff --git a/Telegram/SourceFiles/settings/settings_notifications_type.cpp b/Telegram/SourceFiles/settings/settings_notifications_type.cpp index 5f394face..f1240938f 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_type.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications_type.cpp @@ -36,6 +36,20 @@ namespace { using Notify = Data::DefaultNotify; +struct Factory : AbstractSectionFactory { + explicit Factory(Notify type) : type(type) { + } + + object_ptr create( + not_null parent, + not_null controller + ) const final override { + return object_ptr(parent, controller, type); + } + + const Notify type = {}; +}; + class AddExceptionBoxController final : public ChatsListBoxController , public base::has_weak_ptr { @@ -351,11 +365,6 @@ void ExceptionsController::sort() { delegate()->peerListSortRows(predicate); } -template -[[nodiscard]] Type Id() { - return &NotificationsTypeMetaImplementation::Meta; -} - [[nodiscard]] rpl::producer Title(Notify type) { switch (type) { case Notify::User: return tr::lng_notification_title_private_chats(); @@ -562,15 +571,6 @@ void SetupExceptions( } // namespace -Type NotificationsTypeId(Notify type) { - switch (type) { - case Notify::User: return Id(); - case Notify::Group: return Id(); - case Notify::Broadcast: return Id(); - } - Unexpected("Type in NotificationTypeId."); -} - NotificationsType::NotificationsType( QWidget *parent, not_null controller, @@ -589,8 +589,8 @@ rpl::producer NotificationsType::title() { Unexpected("Type in NotificationsType."); } -Type NotificationsType::id() const { - return NotificationsTypeId(_type); +Type NotificationsType::Id(Notify type) { + return std::make_shared(type); } void NotificationsType::setupContent( diff --git a/Telegram/SourceFiles/settings/settings_notifications_type.h b/Telegram/SourceFiles/settings/settings_notifications_type.h index 59014f0d5..c5f6d95d4 100644 --- a/Telegram/SourceFiles/settings/settings_notifications_type.h +++ b/Telegram/SourceFiles/settings/settings_notifications_type.h @@ -25,32 +25,19 @@ public: [[nodiscard]] rpl::producer title() override; - [[nodiscard]] Type id() const final override; + [[nodiscard]] static Type Id(Data::DefaultNotify type); + + [[nodiscard]] Type id() const final override { + return Id(_type); + } private: void setupContent(not_null controller); - Data::DefaultNotify _type; + const Data::DefaultNotify _type; }; -template -struct NotificationsTypeMetaImplementation : SectionMeta { - object_ptr create( - not_null parent, - not_null controller - ) const final override { - return object_ptr(parent, controller, kType); - } - - [[nodiscard]] static not_null Meta() { - static NotificationsTypeMetaImplementation result; - return &result; - } -}; - -[[nodiscard]] Type NotificationsTypeId(Data::DefaultNotify type); - [[nodiscard]] bool NotificationsEnabledForType( not_null session, Data::DefaultNotify type); diff --git a/Telegram/SourceFiles/settings/settings_type.h b/Telegram/SourceFiles/settings/settings_type.h index 76b8d9840..ee5460916 100644 --- a/Telegram/SourceFiles/settings/settings_type.h +++ b/Telegram/SourceFiles/settings/settings_type.h @@ -9,7 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Settings { -struct SectionMeta; -using Type = not_null(*)(); +struct AbstractSectionFactory; +using Type = std::shared_ptr; } // namespace Settings