diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp index 417cb9593a..6d2d1637e3 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp @@ -561,12 +561,12 @@ void TabbedSelector::reinstallSwipe(not_null widget) { } }; - auto init = [=](int, Qt::LayoutDirection direction) { + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { if (!_tabsSlider) { return Ui::Controls::SwipeHandlerFinishData(); } const auto activeSection = _tabsSlider->activeSection(); - const auto isToLeft = direction == Qt::RightToLeft; + const auto isToLeft = data.direction == Qt::RightToLeft; if ((isToLeft && activeSection > 0) || (!isToLeft && activeSection < _tabs.size() - 1)) { return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index a32ce957af..3f0c9893c5 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -774,14 +774,14 @@ void Widget::setupSwipeBack() { } }; - auto init = [=](int top, Qt::LayoutDirection direction) { - top -= _inner->y(); + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + const auto top = data.cursorPosition.y() - _inner->y(); _swipeBackIconMirrored = false; _swipeBackMirrored = false; if (_childListShown.current()) { return Ui::Controls::SwipeHandlerFinishData(); } - const auto isRightToLeft = direction == Qt::RightToLeft; + const auto isRightToLeft = data.direction == Qt::RightToLeft; const auto action = Core::App().settings().quickDialogAction(); const auto isDisabled = action == Ui::QuickDialogAction::Disabled; if (_inner) { diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp index d93db6152e..c3dc482b21 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp @@ -1633,12 +1633,12 @@ Ui::Controls::SwipeHandlerArgs Suggestions::generateIncompleteSwipeArgs() { _swipeBackData = {}; } }; - auto init = [=](int, Qt::LayoutDirection direction) { + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { if (!_tabs) { return Ui::Controls::SwipeHandlerFinishData(); } const auto activeSection = _tabs->activeSection(); - const auto isToLeft = direction == Qt::RightToLeft; + const auto isToLeft = data.direction == Qt::RightToLeft; if ((isToLeft && activeSection > 0) || (!isToLeft && activeSection < _tabKeys.size() - 1)) { return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { 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 d7ecda74d8..1790805f50 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp @@ -532,8 +532,8 @@ void Widget::setupSwipeReply() { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - if (direction == Qt::RightToLeft) { + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + if (data.direction == Qt::RightToLeft) { return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { controller()->showBackFromStack(); }); diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index b0d2bb4c50..cc17a4d5ba 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -663,9 +663,8 @@ void HistoryInner::setupSwipeReplyAndBack() { }; auto init = [=, show = _controller->uiShow()]( - int cursorTop, - Qt::LayoutDirection direction) { - if (direction == Qt::RightToLeft) { + Ui::Controls::SwipeHandlerInitData data) { + if (data.direction == Qt::RightToLeft) { auto good = true; enumerateItems([&]( not_null view, @@ -694,8 +693,8 @@ void HistoryInner::setupSwipeReplyAndBack() { not_null view, int itemtop, int itembottom) { - if ((cursorTop < itemtop) - || (cursorTop > itembottom) + if ((data.cursorPosition.y() < itemtop) + || (data.cursorPosition.y() > itembottom) || !view->data()->isRegular() || view->data()->showSimilarChannels() || view->data()->isService()) { diff --git a/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp b/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp index b757a0aad0..2cf2116093 100644 --- a/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp +++ b/Telegram/SourceFiles/history/history_view_swipe_back_session.cpp @@ -43,8 +43,8 @@ void SetupSwipeBackSection( (*swipeBackData) = {}; } }; - auto init = [=](int, Qt::LayoutDirection direction) { - if (direction != Qt::RightToLeft) { + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + if (data.direction != Qt::RightToLeft) { return Ui::Controls::SwipeHandlerFinishData(); } return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { diff --git a/Telegram/SourceFiles/history/view/history_view_chat_section.cpp b/Telegram/SourceFiles/history/view/history_view_chat_section.cpp index 06a819361f..609c5f0622 100644 --- a/Telegram/SourceFiles/history/view/history_view_chat_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_chat_section.cpp @@ -1049,9 +1049,8 @@ void ChatWidget::setupSwipeReplyAndBack() { }; auto init = [=, show = controller()->uiShow()]( - int cursorTop, - Qt::LayoutDirection direction) { - if (direction == Qt::RightToLeft) { + Ui::Controls::SwipeHandlerInitData data) { + if (data.direction == Qt::RightToLeft) { return Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { controller()->showBackFromStack(); }); @@ -1060,7 +1059,7 @@ void ChatWidget::setupSwipeReplyAndBack() { if (_inner->elementInSelectionMode(nullptr).inSelectionMode) { return result; } - const auto view = _inner->lookupItemByY(cursorTop); + const auto view = _inner->lookupItemByY(data.cursorPosition.y()); if (!view || !view->data()->isRegular() || view->data()->isService()) { diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index b41b18d85d..b2841ba47c 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -517,8 +517,10 @@ void ContentWidget::setupSwipeHandler(not_null widget) { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - return (direction == Qt::RightToLeft && _controller->hasBackButton()) + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + const auto isBack = (data.direction == Qt::RightToLeft) + && _controller->hasBackButton(); + return isBack ? Ui::Controls::DefaultSwipeBackHandlerFinishData([=] { checkBeforeClose(crl::guard(this, [=] { _controller->parentController()->hideLayer(); diff --git a/Telegram/SourceFiles/settings/sections/settings_business.cpp b/Telegram/SourceFiles/settings/sections/settings_business.cpp index 14074a0101..6a9328c2ec 100644 --- a/Telegram/SourceFiles/settings/sections/settings_business.cpp +++ b/Telegram/SourceFiles/settings/sections/settings_business.cpp @@ -741,8 +741,8 @@ void Business::setupSwipeBack() { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - return (direction == Qt::RightToLeft) + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + return (data.direction == Qt::RightToLeft) ? DefaultSwipeBackHandlerFinishData([=] { _showBack.fire({}); }) diff --git a/Telegram/SourceFiles/settings/sections/settings_credits.cpp b/Telegram/SourceFiles/settings/sections/settings_credits.cpp index c2d1c009a2..c0a05b20f7 100644 --- a/Telegram/SourceFiles/settings/sections/settings_credits.cpp +++ b/Telegram/SourceFiles/settings/sections/settings_credits.cpp @@ -463,8 +463,8 @@ void Credits::setupSwipeBack() { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - return (direction == Qt::RightToLeft) + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + return (data.direction == Qt::RightToLeft) ? DefaultSwipeBackHandlerFinishData([=] { _showBack.fire({}); }) diff --git a/Telegram/SourceFiles/settings/sections/settings_premium.cpp b/Telegram/SourceFiles/settings/sections/settings_premium.cpp index b3f606f975..98d5fac2e2 100644 --- a/Telegram/SourceFiles/settings/sections/settings_premium.cpp +++ b/Telegram/SourceFiles/settings/sections/settings_premium.cpp @@ -1425,8 +1425,8 @@ void Premium::setupSwipeBack() { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - return (direction == Qt::RightToLeft) + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + return (data.direction == Qt::RightToLeft) ? DefaultSwipeBackHandlerFinishData([=] { _showBack.fire({}); }) diff --git a/Telegram/SourceFiles/ui/controls/swipe_handler.cpp b/Telegram/SourceFiles/ui/controls/swipe_handler.cpp index ed20a8116d..98f793019d 100644 --- a/Telegram/SourceFiles/ui/controls/swipe_handler.cpp +++ b/Telegram/SourceFiles/ui/controls/swipe_handler.cpp @@ -86,7 +86,7 @@ void SetupSwipeHandler(SwipeHandlerArgs &&args) { int directionInt = 1.; QPointF startAt; QPointF delta; - int cursorTop = 0; + QPoint cursorPosition; bool dontStart = false; bool started = false; bool reached = false; @@ -126,7 +126,7 @@ void SetupSwipeHandler(SwipeHandlerArgs &&args) { state->data.msgBareId = state->finishByTopData.msgBareId; state->data.translation = translation * state->directionInt; - state->data.cursorTop = state->cursorTop; + state->data.cursorTop = state->cursorPosition.y(); update(state->data); }; const auto setOrientation = [=](std::optional o) { @@ -197,9 +197,10 @@ void SetupSwipeHandler(SwipeHandlerArgs &&args) { state->directionInt = (state->direction == Qt::LeftToRight) ? 1 : -1; - state->finishByTopData = generateFinish( - state->cursorTop, - *state->direction); + state->finishByTopData = generateFinish({ + .cursorPosition = state->cursorPosition, + .direction = *state->direction, + }); state->threshold = style::ConvertFloatScale(kThresholdWidth) * state->finishByTopData.speedRatio; if (!state->finishByTopData.callback @@ -213,7 +214,7 @@ void SetupSwipeHandler(SwipeHandlerArgs &&args) { state->data.reachRatio = 0.; state->touch = args.touch; state->startAt = args.position; - state->cursorTop = widget->mapFromGlobal(args.globalCursor).y(); + state->cursorPosition = widget->mapFromGlobal(args.globalCursor); if (!state->touch) { // args.delta already is valid. fillFinishByTop(); @@ -289,7 +290,7 @@ void SetupSwipeHandler(SwipeHandlerArgs &&args) { case QEvent::MouseMove: { if (state->orientation == Qt::Horizontal) { const auto m = static_cast(e.get()); - if (std::abs(m->pos().y() - state->cursorTop) + if (std::abs(m->pos().y() - state->cursorPosition.y()) > QApplication::startDragDistance()) { processEnd(); } diff --git a/Telegram/SourceFiles/ui/controls/swipe_handler.h b/Telegram/SourceFiles/ui/controls/swipe_handler.h index 10448cea36..9b653dc4e3 100644 --- a/Telegram/SourceFiles/ui/controls/swipe_handler.h +++ b/Telegram/SourceFiles/ui/controls/swipe_handler.h @@ -17,6 +17,7 @@ namespace Ui::Controls { struct SwipeContextData; struct SwipeBackResult; +struct SwipeHandlerInitData; struct SwipeHandlerFinishData { Fn callback; @@ -36,7 +37,7 @@ struct SwipeHandlerArgs { not_null widget; Scroll scroll; Fn update; - Fn init; + Fn init; rpl::producer dontStart = nullptr; rpl::lifetime *onLifetime = nullptr; }; diff --git a/Telegram/SourceFiles/ui/controls/swipe_handler_data.h b/Telegram/SourceFiles/ui/controls/swipe_handler_data.h index c0f5da0b90..c96c6b65e5 100644 --- a/Telegram/SourceFiles/ui/controls/swipe_handler_data.h +++ b/Telegram/SourceFiles/ui/controls/swipe_handler_data.h @@ -27,6 +27,11 @@ struct SwipeContextData final { int cursorTop = 0; }; +struct SwipeHandlerInitData final { + QPoint cursorPosition; + Qt::LayoutDirection direction = Qt::LeftToRight; +}; + struct SwipeBackResult final { rpl::lifetime lifetime; Fn callback; diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 16a5705ee7..89ecba366f 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -1004,8 +1004,8 @@ void MainMenu::setupSwipe() { } }; - auto init = [=](int, Qt::LayoutDirection direction) { - if (direction != Qt::LeftToRight) { + auto init = [=](Ui::Controls::SwipeHandlerInitData data) { + if (data.direction != Qt::LeftToRight) { return Ui::Controls::SwipeHandlerFinishData(); } if (_emojiStatusPanel && _emojiStatusPanel->hasFocus()) {