/* 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 "api/api_user_privacy.h" #include "base/object_ptr.h" #include "settings/settings_common.h" #include "settings/settings_type.h" #include #include class EditPrivacyController; namespace Ui { class RpWidget; class VerticalLayout; class SettingsButton; class Checkbox; } // namespace Ui namespace Main { class Session; } // namespace Main namespace Window { class SessionController; } // namespace Window namespace style { struct SettingsButton; } // namespace style namespace st { extern const int &boxRadius; } // namespace st namespace Ui { template class SlideWrap; } // namespace Ui namespace tr { template struct phrase; } // namespace tr namespace Settings::Builder { class SectionBuilder; enum class SearchEntryCheckIcon { None, Checked, Unchecked, }; struct SearchEntry { QString id; QStringList altIds; QString title; QStringList keywords; Type section; IconDescriptor icon; SearchEntryCheckIcon checkIcon = SearchEntryCheckIcon::None; QString deeplink; explicit operator bool() const { return !id.isEmpty(); } }; using SearchEntriesIndexer = Fn( not_null<::Main::Session*> session)>; struct SearchIndexerEntry { Type sectionId; SearchEntriesIndexer indexer; }; using SectionTitle = std::variant< not_null*>, QString>; struct SectionMeta { Type id; Type parentId; SectionTitle title; not_null icon; }; class SearchRegistry { public: static SearchRegistry &Instance(); void add( not_null meta, SearchEntriesIndexer indexer); [[nodiscard]] std::vector collectAll( not_null<::Main::Session*> session) const; [[nodiscard]] QString sectionTitle(Type sectionId) const; [[nodiscard]] QString sectionPath( Type sectionId, bool parentsOnly = false) const; private: std::vector _indexers; base::flat_map _sections; }; class BuildHelper { public: BuildHelper(SectionMeta &&meta, FnMut method); const SectionBuildMethod build; [[nodiscard]] std::vector index( not_null<::Main::Session*> session) const; private: const SectionMeta _meta; mutable FnMut _method; }; struct WidgetContext { not_null container; not_null controller; Fn showOther; Fn isPaused; HighlightRegistry *highlights = nullptr; }; struct SearchContext { Type sectionId; not_null<::Main::Session*> session; not_null*> entries; }; using BuildContext = std::variant; class SectionBuilder { public: explicit SectionBuilder(BuildContext context); void add(FnMut method); using ToggledScopePtr = not_null*>; Ui::VerticalLayout *scope( FnMut method, rpl::producer shown = nullptr, FnMut hook = nullptr); struct WidgetToAdd { object_ptr widget = { nullptr }; QMargins margin; style::align align = style::al_left; HighlightArgs highlight; explicit operator bool() const { return widget != nullptr; } }; Ui::RpWidget *add( FnMut widget, FnMut search = nullptr); struct ControlArgs { Fn(not_null)> factory; QString id; QStringList altIds; rpl::producer title; style::margins margin; style::align align = style::al_left; HighlightArgs highlight; rpl::producer shown; QStringList keywords; IconDescriptor searchIcon; SearchEntryCheckIcon searchCheckIcon = SearchEntryCheckIcon::None; }; Ui::RpWidget *addControl(ControlArgs &&args); struct ButtonArgs { QString id; QStringList altIds; rpl::producer title; const style::SettingsButton *st = nullptr; IconDescriptor icon; Ui::VerticalLayout *container = nullptr; rpl::producer label; rpl::producer toggled; Fn onClick; QStringList keywords; HighlightArgs highlight; rpl::producer shown; }; Ui::SettingsButton *addButton(ButtonArgs &&args); struct SectionArgs { //QString id; // Sections should register themselves in search. QStringList altIds; rpl::producer title; Type targetSection; IconDescriptor icon; QStringList keywords; }; Ui::SettingsButton *addSectionButton(SectionArgs &&args); struct PremiumButtonArgs { QString id; QStringList altIds; rpl::producer title; rpl::producer label; bool credits = false; Fn onClick; QStringList keywords; }; Ui::SettingsButton *addPremiumButton(PremiumButtonArgs &&args); struct PrivacyButtonArgs { QString id; QStringList altIds; rpl::producer title; Api::UserPrivacy::Key key; Fn()> controllerFactory; bool premium = false; QStringList keywords; }; Ui::SettingsButton *addPrivacyButton(PrivacyButtonArgs &&args); struct CheckboxArgs { QString id; QStringList altIds; rpl::producer title; bool checked = false; QStringList keywords; HighlightArgs highlight = { .radius = st::boxRadius }; rpl::producer shown; }; Ui::Checkbox *addCheckbox(CheckboxArgs &&args); struct SubsectionTitleArgs { QString id; QStringList altIds; rpl::producer title; QStringList keywords; }; void addSubsectionTitle(SubsectionTitleArgs &&args); void addSubsectionTitle(rpl::producer text); void addDivider(); void addDividerText(rpl::producer text); void addSkip(); void addSkip(int height); [[nodiscard]] Ui::VerticalLayout *container() const; [[nodiscard]] Window::SessionController *controller() const; [[nodiscard]] not_null<::Main::Session*> session() const; [[nodiscard]] Fn showOther() const; [[nodiscard]] HighlightRegistry *highlights() const; private: void registerHighlight( QString id, QWidget *widget, HighlightArgs &&args); BuildContext _context; }; } // namespace Settings::Builder