From 0d085d500fc1ca176b6774f2f5f5d37ac7dfe4ac Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 24 Mar 2025 21:42:35 +0300 Subject: [PATCH] Added ability to provide custom swipe handler to Info::ContentWidget. --- Telegram/SourceFiles/info/info_content_widget.cpp | 13 +++++++++++++ Telegram/SourceFiles/info/info_content_widget.h | 6 ++++++ Telegram/SourceFiles/info/info_wrap_widget.cpp | 5 +++++ Telegram/SourceFiles/info/info_wrap_widget.h | 5 +++++ 4 files changed, 29 insertions(+) diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index 34dbfd783b..f392e132ed 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -410,7 +410,19 @@ not_null ContentWidget::scroll() const { return _scroll.data(); } +void ContentWidget::replaceSwipeHandler( + Ui::Controls::SwipeHandlerArgs *incompleteArgs) { + _swipeHandlerLifetime.destroy(); + auto args = std::move(*incompleteArgs); + args.widget = _innerWrap; + args.scroll = _scroll.data(); + args.onLifetime = &_swipeHandlerLifetime; + Ui::Controls::SetupSwipeHandler(std::move(args)); +} + void ContentWidget::setupSwipeHandler(not_null widget) { + _swipeHandlerLifetime.destroy(); + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!_swipeBackData.callback) { @@ -446,6 +458,7 @@ void ContentWidget::setupSwipeHandler(not_null widget) { .scroll = _scroll.data(), .update = std::move(update), .init = std::move(init), + .onLifetime = &_swipeHandlerLifetime, }); } diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index 84b03d2934..359f46787a 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -24,6 +24,9 @@ enum class SharedMediaType : signed char; } // namespace Storage namespace Ui { +namespace Controls { +struct SwipeHandlerArgs; +} // namespace Controls class RoundRect; class ScrollArea; class InputField; @@ -135,6 +138,8 @@ public: [[nodiscard]] virtual auto desiredBottomShadowVisibility() -> rpl::producer; + void replaceSwipeHandler(Ui::Controls::SwipeHandlerArgs *incompleteArgs); + protected: template Widget *setInnerWidget(object_ptr inner) { @@ -196,6 +201,7 @@ private: style::margins _paintPadding; Ui::Controls::SwipeBackResult _swipeBackData; + rpl::lifetime _swipeHandlerLifetime; }; diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index 15f98f7b8f..56bc9bf193 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -1059,6 +1059,11 @@ bool WrapWidget::willHaveBackButton( return (wrap() == Wrap::Narrow) || willHaveStack; } +void WrapWidget::replaceSwipeHandler( + Ui::Controls::SwipeHandlerArgs *incompleteArgs) { + _content->replaceSwipeHandler(std::move(incompleteArgs)); +} + WrapWidget::~WrapWidget() = default; } // namespace Info diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index fe0c4ccd28..40d4459d44 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -15,6 +15,9 @@ enum class SharedMediaType : signed char; } // namespace Storage namespace Ui { +namespace Controls { +struct SwipeHandlerArgs; +} // namespace Controls class FadeShadow; class PlainShadow; class PopupMenu; @@ -140,6 +143,8 @@ public: return _removeRequests.events(); } + void replaceSwipeHandler(Ui::Controls::SwipeHandlerArgs *incompleteArgs); + ~WrapWidget(); protected: