| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /*
- 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 "settings/settings_common.h"
- #include "ui/rp_widget.h"
- #include "base/object_ptr.h"
- #include "settings/settings_type.h"
- namespace Ui {
- class ScrollArea;
- } // namespace Ui
- namespace Ui::Menu {
- struct MenuCallback;
- } // namespace Ui::Menu
- namespace Window {
- class SessionController;
- } // namespace Window
- namespace Settings {
- enum class Container {
- Section,
- Layer,
- };
- class AbstractSection;
- struct AbstractSectionFactory {
- [[nodiscard]] virtual object_ptr<AbstractSection> create(
- not_null<QWidget*> parent,
- not_null<Window::SessionController*> controller,
- not_null<Ui::ScrollArea*> scroll,
- rpl::producer<Container> containerValue) const = 0;
- [[nodiscard]] virtual bool hasCustomTopBar() const {
- return false;
- }
- virtual ~AbstractSectionFactory() = default;
- };
- template <typename SectionType>
- struct SectionFactory : AbstractSectionFactory {
- object_ptr<AbstractSection> create(
- not_null<QWidget*> parent,
- not_null<Window::SessionController*> controller,
- not_null<Ui::ScrollArea*> scroll,
- rpl::producer<Container> containerValue
- ) const final override {
- return object_ptr<SectionType>(parent, controller);
- }
- [[nodiscard]] static const std::shared_ptr<SectionFactory> &Instance() {
- static const auto result = std::make_shared<SectionFactory>();
- return result;
- }
- };
- template <typename SectionType>
- class Section : public AbstractSection {
- public:
- using AbstractSection::AbstractSection;
- [[nodiscard]] static Type Id() {
- return SectionFactory<SectionType>::Instance();
- }
- [[nodiscard]] Type id() const final override {
- return Id();
- }
- [[nodiscard]] rpl::producer<Type> sectionShowOther() final override {
- return _showOtherRequests.events();
- }
- void showOther(Type type) {
- _showOtherRequests.fire_copy(type);
- }
- [[nodiscard]] Fn<void(Type)> showOtherMethod() {
- return crl::guard(this, [=](Type type) {
- showOther(type);
- });
- }
- private:
- rpl::event_stream<Type> _showOtherRequests;
- };
- bool HasMenu(Type type);
- } // namespace Settings
|