/* 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 "ui/round_rect.h" #include "base/object_ptr.h" #include "settings/settings_type.h" namespace anim { enum class repeat : uchar; } // namespace anim namespace Main { class Session; } // namespace Main namespace Ui { class VerticalLayout; class FlatLabel; class SettingsButton; class AbstractButton; class MediaSlider; } // namespace Ui namespace Ui::Menu { struct MenuCallback; } // namespace Ui::Menu namespace Window { class SessionController; } // namespace Window namespace style { struct FlatLabel; struct SettingsButton; struct MediaSlider; } // namespace style namespace Lottie { struct IconDescriptor; } // namespace Lottie namespace Settings { using Button = Ui::SettingsButton; class AbstractSection; struct AbstractSectionFactory { [[nodiscard]] virtual object_ptr create( not_null parent, not_null controller) const = 0; [[nodiscard]] virtual bool hasCustomTopBar() const { return false; } virtual ~AbstractSectionFactory() = default; }; template struct SectionFactory : AbstractSectionFactory { object_ptr create( not_null parent, not_null controller ) const final override { return object_ptr(parent, controller); } [[nodiscard]] static const std::shared_ptr &Instance() { static const auto result = std::make_shared(); return result; } }; class AbstractSection : public Ui::RpWidget { public: using RpWidget::RpWidget; [[nodiscard]] virtual Type id() const = 0; [[nodiscard]] virtual rpl::producer sectionShowOther() { return nullptr; } [[nodiscard]] virtual rpl::producer<> sectionShowBack() { return nullptr; } [[nodiscard]] virtual rpl::producer> removeFromStack() { return nullptr; } [[nodiscard]] virtual rpl::producer title() = 0; virtual void sectionSaveChanges(FnMut done) { done(); } virtual void showFinished() { } virtual void setInnerFocus() { setFocus(); } [[nodiscard]] virtual const Ui::RoundRect *bottomSkipRounding() const { return nullptr; } [[nodiscard]] virtual QPointer createPinnedToTop( not_null parent) { return nullptr; } [[nodiscard]] virtual QPointer createPinnedToBottom( not_null parent) { return nullptr; } [[nodiscard]] virtual bool hasFlexibleTopBar() const { return false; } virtual void setStepDataReference(std::any &data) { } }; template class Section : public AbstractSection { public: using AbstractSection::AbstractSection; [[nodiscard]] static Type Id() { return SectionFactory::Instance(); } [[nodiscard]] Type id() const final override { return Id(); } }; enum class IconType { Rounded, Round, Simple, }; struct IconDescriptor { const style::icon *icon = nullptr; IconType type = IconType::Rounded; const style::color *background = nullptr; std::optional backgroundBrush; // Can be useful for gradients. explicit operator bool() const { return (icon != nullptr); } }; class Icon final { public: explicit Icon(IconDescriptor descriptor); void paint(QPainter &p, QPoint position) const; void paint(QPainter &p, int x, int y) const; [[nodiscard]] int width() const; [[nodiscard]] int height() const; [[nodiscard]] QSize size() const; private: not_null _icon; std::optional _background; std::optional> _backgroundBrush; }; void AddSkip(not_null container); void AddSkip(not_null container, int skip); void AddDivider(not_null container); void AddDividerText( not_null container, rpl::producer text); void AddButtonIcon( not_null button, const style::SettingsButton &st, IconDescriptor &&descriptor); object_ptr