From f734c0475bcbb78f0c1a6b83c02f200955d535c0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 24 Mar 2025 14:50:11 +0300 Subject: [PATCH] Replaced SetupSwipeHandler signature from arguments to struct. --- .../chat_helpers/tabbed_selector.cpp | 18 +++++++++++---- .../SourceFiles/dialogs/dialogs_widget.cpp | 16 +++++++++++--- .../admin_log/history_admin_log_section.cpp | 14 +++++++++--- .../history/history_inner_widget.cpp | 18 +++++++++++---- .../history_view_swipe_back_session.cpp | 15 +++++++++---- .../view/history_view_replies_section.cpp | 18 +++++++++++---- .../SourceFiles/info/info_content_widget.cpp | 14 +++++++++--- .../SourceFiles/ui/controls/swipe_handler.cpp | 22 +++++++++---------- .../SourceFiles/ui/controls/swipe_handler.h | 17 ++++++++------ .../SourceFiles/window/window_main_menu.cpp | 14 +++++++++--- 10 files changed, 120 insertions(+), 46 deletions(-) diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp index 3b73b3d8b0..04d49849d2 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp @@ -533,8 +533,7 @@ TabbedSelector::~TabbedSelector() = default; void TabbedSelector::reinstallSwipe(not_null widget) { _swipeLifetime.destroy(); - Ui::Controls::SetupSwipeHandler(widget, _scroll.data(), [=]( - Ui::Controls::SwipeContextData data) { + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation != 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -552,7 +551,9 @@ void TabbedSelector::reinstallSwipe(not_null widget) { } else if (_swipeBackData.lifetime) { _swipeBackData = {}; } - }, [=](int, Qt::LayoutDirection direction) { + }; + + auto init = [=](int, Qt::LayoutDirection direction) { if (!_tabsSlider) { return Ui::Controls::SwipeHandlerFinishData(); } @@ -571,7 +572,16 @@ void TabbedSelector::reinstallSwipe(not_null widget) { }); } return Ui::Controls::SwipeHandlerFinishData(); - }, nullptr, &_swipeLifetime); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = widget, + .scroll = _scroll.data(), + .update = std::move(update), + .init = std::move(init), + .dontStart = nullptr, + .onLifetime = &_swipeLifetime, + }); } const style::EmojiPan &TabbedSelector::st() const { diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index ea75281db7..a75b229fe1 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -691,8 +691,8 @@ void Widget::setupSwipeBack() { } return !current; }; - Ui::Controls::SetupSwipeHandler(_inner, _scroll.data(), [=]( - Ui::Controls::SwipeContextData data) { + + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation != 0) { if (data.translation < 0 && _inner @@ -724,7 +724,9 @@ void Widget::setupSwipeBack() { _inner->update(); } } - }, [=](int top, Qt::LayoutDirection direction) { + }; + + auto init = [=](int top, Qt::LayoutDirection direction) { _swipeBackIconMirrored = false; _swipeBackMirrored = false; if (_childListShown.current()) { @@ -812,7 +814,15 @@ void Widget::setupSwipeBack() { }); } } + return Ui::Controls::SwipeHandlerFinishData(); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = _inner, + .scroll = _scroll.data(), + .update = std::move(update), + .init = std::move(init), }); } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp index ef88f0b384..56fce9db19 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp @@ -420,8 +420,7 @@ void Widget::setupShortcuts() { } void Widget::setupSwipeReply() { - Ui::Controls::SetupSwipeHandler(_inner.data(), _scroll.data(), [=]( - Ui::Controls::SwipeContextData data) { + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -439,13 +438,22 @@ void Widget::setupSwipeReply() { } else if (_swipeBackData.lifetime) { _swipeBackData = {}; } - }, [=](int, Qt::LayoutDirection direction) { + }; + + auto init = [=](int, Qt::LayoutDirection direction) { if (direction == Qt::RightToLeft) { return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { controller()->showBackFromStack(); }); } return Ui::Controls::SwipeHandlerFinishData(); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = _inner.data(), + .scroll = _scroll.data(), + .update = std::move(update), + .init = std::move(init), }); } diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 643a59998c..8abce4dd04 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -528,8 +528,8 @@ void HistoryInner::setupSwipeReplyAndBack() { return; } const auto peer = _peer; - Ui::Controls::SetupSwipeHandler(this, _scroll, [=, history = _history]( - Ui::Controls::SwipeContextData data) { + + auto update = [=, history = _history](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -559,7 +559,9 @@ void HistoryInner::setupSwipeReplyAndBack() { repaintItem(item); } } - }, [=, show = _controller->uiShow()]( + }; + + auto init = [=, show = _controller->uiShow()]( int cursorTop, Qt::LayoutDirection direction) { if (direction == Qt::RightToLeft) { @@ -607,7 +609,15 @@ void HistoryInner::setupSwipeReplyAndBack() { return false; }); return result; - }, _touchMaybeSelecting.value()); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = this, + .scroll = _scroll, + .update = std::move(update), + .init = std::move(init), + .dontStart = _touchMaybeSelecting.value(), + }); } bool HistoryInner::hasSelectRestriction() const { diff --git a/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp b/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp index 05dfa6df6c..b757a0aad0 100644 --- a/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp +++ b/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp @@ -21,8 +21,7 @@ void SetupSwipeBackSection( not_null list) { const auto swipeBackData = list->lifetime().make_state(); - Ui::Controls::SetupSwipeHandler(list, scroll, [=]( - Ui::Controls::SwipeContextData data) { + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!swipeBackData->callback) { const auto color = [=]() -> std::pair { @@ -43,14 +42,22 @@ void SetupSwipeBackSection( } else if (swipeBackData->lifetime) { (*swipeBackData) = {}; } - }, [=](int, Qt::LayoutDirection direction) { + }; + auto init = [=](int, Qt::LayoutDirection direction) { if (direction != Qt::RightToLeft) { return Ui::Controls::SwipeHandlerFinishData(); } return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { list->controller()->showBackFromStack(); }); - }, list->touchMaybeSelectingValue()); + }; + Ui::Controls::SetupSwipeHandler({ + .widget = list, + .scroll = scroll, + .update = std::move(update), + .init = std::move(init), + .dontStart = list->touchMaybeSelectingValue(), + }); } } // namespace Window diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index 5900e2e6c1..59dd3d6c4b 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -890,8 +890,8 @@ void RepliesWidget::setupSwipeReplyAndBack() { } return false; }; - Ui::Controls::SetupSwipeHandler(_inner, _scroll.get(), [=]( - Ui::Controls::SwipeContextData data) { + + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -923,7 +923,9 @@ void RepliesWidget::setupSwipeReplyAndBack() { _history->owner().requestItemRepaint(item); } } - }, [=, show = controller()->uiShow()]( + }; + + auto init = [=, show = controller()->uiShow()]( int cursorTop, Qt::LayoutDirection direction) { if (direction == Qt::RightToLeft) { @@ -962,7 +964,15 @@ void RepliesWidget::setupSwipeReplyAndBack() { }); }; return result; - }, _inner->touchMaybeSelectingValue()); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = _inner, + .scroll = _scroll.get(), + .update = std::move(update), + .init = std::move(init), + .dontStart = _inner->touchMaybeSelectingValue(), + }); } void RepliesWidget::chooseAttach( diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index b7078a984b..34dbfd783b 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -411,8 +411,7 @@ not_null ContentWidget::scroll() const { } void ContentWidget::setupSwipeHandler(not_null widget) { - Ui::Controls::SetupSwipeHandler(widget, _scroll.data(), [=]( - Ui::Controls::SwipeContextData data) { + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation > 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -429,7 +428,9 @@ void ContentWidget::setupSwipeHandler(not_null widget) { } else if (_swipeBackData.lifetime) { _swipeBackData = {}; } - }, [=](int, Qt::LayoutDirection direction) { + }; + + auto init = [=](int, Qt::LayoutDirection direction) { return (direction == Qt::RightToLeft && _controller->hasBackButton()) ? Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { checkBeforeClose(crl::guard(this, [=] { @@ -438,6 +439,13 @@ void ContentWidget::setupSwipeHandler(not_null widget) { })); }) : Ui::Controls::SwipeHandlerFinishData(); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = widget, + .scroll = _scroll.data(), + .update = std::move(update), + .init = std::move(init), }); } diff --git a/Telegram/SourceFiles/ui/controls/swipe_handler.cpp b/Telegram/SourceFiles/ui/controls/swipe_handler.cpp index f5c3cb60ce..36f5a34e3e 100644 --- a/Telegram/SourceFiles/ui/controls/swipe_handler.cpp +++ b/Telegram/SourceFiles/ui/controls/swipe_handler.cpp @@ -61,16 +61,14 @@ private: } // namespace -void SetupSwipeHandler( - not_null widget, - Scroll scroll, - Fn update, - Fn generateFinish, - rpl::producer dontStart, - rpl::lifetime *onLifetime) { +void SetupSwipeHandler(SwipeHandlerArgs &&args) { static constexpr auto kThresholdWidth = 50; static constexpr auto kMaxRatio = 1.5; + const auto widget = std::move(args.widget); + const auto scroll = std::move(args.scroll); + const auto update = std::move(args.update); + struct UpdateArgs { QPoint globalCursor; QPointF position; @@ -98,11 +96,13 @@ void SetupSwipeHandler( rpl::lifetime lifetime; }; - auto &useLifetime = onLifetime ? *onLifetime : widget->lifetime(); + auto &useLifetime = args.onLifetime + ? *(args.onLifetime) + : args.widget->lifetime(); const auto state = useLifetime.make_state(); - if (dontStart) { + if (args.dontStart) { std::move( - dontStart + args.dontStart ) | rpl::start_with_next([=](bool dontStart) { state->dontStart = dontStart; }, state->lifetime); @@ -188,7 +188,7 @@ void SetupSwipeHandler( state->data.reachRatio = value; update(state->data); }; - const auto updateWith = [=](UpdateArgs args) { + const auto updateWith = [=, generateFinish = args.init](UpdateArgs args) { const auto fillFinishByTop = [&] { if (!args.delta.x()) { LOG(("SKIPPING fillFinishByTop.")); diff --git a/Telegram/SourceFiles/ui/controls/swipe_handler.h b/Telegram/SourceFiles/ui/controls/swipe_handler.h index 6d3f796b1e..10448cea36 100644 --- a/Telegram/SourceFiles/ui/controls/swipe_handler.h +++ b/Telegram/SourceFiles/ui/controls/swipe_handler.h @@ -32,13 +32,16 @@ using Scroll = std::variant< not_null, not_null>; -void SetupSwipeHandler( - not_null widget, - Scroll scroll, - Fn update, - Fn generateFinishByTop, - rpl::producer dontStart = nullptr, - rpl::lifetime *onLifetime = nullptr); +struct SwipeHandlerArgs { + not_null widget; + Scroll scroll; + Fn update; + Fn init; + rpl::producer dontStart = nullptr; + rpl::lifetime *onLifetime = nullptr; +}; + +void SetupSwipeHandler(SwipeHandlerArgs &&args); [[nodiscard]] SwipeBackResult SetupSwipeBack( not_null widget, diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index b4344d2023..9ae782dbbc 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -1051,8 +1051,7 @@ void MainMenu::setupSwipe() { }); } - Ui::Controls::SetupSwipeHandler(_inner, _scroll.data(), [=]( - Ui::Controls::SwipeContextData data) { + auto update = [=](Ui::Controls::SwipeContextData data) { if (data.translation < 0) { if (!_swipeBackData.callback) { _swipeBackData = Ui::Controls::SetupSwipeBack( @@ -1069,13 +1068,22 @@ void MainMenu::setupSwipe() { } else if (_swipeBackData.lifetime) { _swipeBackData = {}; } - }, [=](int, Qt::LayoutDirection direction) { + }; + + auto init = [=](int, Qt::LayoutDirection direction) { if (direction != Qt::LeftToRight) { return Ui::Controls::SwipeHandlerFinishData(); } return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { closeLayer(); }); + }; + + Ui::Controls::SetupSwipeHandler({ + .widget = _inner, + .scroll = _scroll.data(), + .update = std::move(update), + .init = std::move(init), }); }