#pragma once #include "settings/settings_common.h" #include "ui/text/text.h" #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" namespace Ui { class VerticalLayout; } // namespace Ui namespace style { struct DetailedSettingsButtonStyle; } // namespace style class DetailedSettingsButton final : public Ui::RippleButton { public: DetailedSettingsButton( QWidget *parent, rpl::producer title, rpl::producer description, Settings::IconDescriptor icon, rpl::producer toggled, const style::DetailedSettingsButtonStyle &rowStyle); QString accessibilityName() override; Ui::AccessibilityState accessibilityState() const override; #if QT_VERSION >= QT_VERSION_CHECK(6, 11, 0) QAccessible::Role accessibilityRole() override; #endif [[nodiscard]] bool toggled() const; [[nodiscard]] rpl::producer toggledChanges() const; [[nodiscard]] rpl::producer> clickAreaEvents() const; void setToggleLocked(bool locked); void finishAnimating(); protected: void onStateChanged(State was, StateChangeSource source) override; void paintEvent(QPaintEvent *e) override; int resizeGetHeight(int newWidth) override; private: void refreshLayout(); [[nodiscard]] int titleTop() const; [[nodiscard]] int titleHeight() const; [[nodiscard]] int descriptionTopValue() const; [[nodiscard]] int firstDescriptionLineBottom() const; [[nodiscard]] int textAvailableWidth(int outerw) const; [[nodiscard]] QRect toggleRect() const; [[nodiscard]] QRect iconAreaRect() const; [[nodiscard]] QRect iconRect() const; [[nodiscard]] QRect iconForegroundRect(QRect iconRect) const; [[nodiscard]] int iconSize() const; void paintIcon(QPainter &p) const; const style::DetailedSettingsButtonStyle &_style; Ui::Text::String _title; Ui::Text::String _description; std::unique_ptr _toggle; const style::icon *_iconForeground = nullptr; const style::color *_iconBackground = nullptr; const std::optional _iconBackgroundBrush; int _titleWidth = 0; int _descriptionWidth = 0; int _descriptionTop = 0; int _descriptionHeight = 0; bool _toggleLocked = false; }; [[nodiscard]] not_null AddDetailedSettingsButton( not_null container, rpl::producer title, rpl::producer description, Settings::IconDescriptor icon, rpl::producer toggled, const style::DetailedSettingsButtonStyle &rowStyle);