diff --git a/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.cpp b/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.cpp index 82f008a0b8..2e003eddd0 100644 --- a/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.cpp +++ b/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.cpp @@ -188,35 +188,13 @@ void SelfForwardsTagger::showSelectorForMessages( base::install_event_filter(selector, list, eventFilterCallback); } - struct State { - rpl::lifetime timerLifetime; - bool expanded = false; - }; - const auto state = selector->lifetime().make_state(); - const auto restartTimer = [=](crl::time ms) { - state->timerLifetime.destroy(); - base::timer_once(ms) | rpl::start_with_next([=] { - hideAndDestroy(); - }, state->timerLifetime); - }; + const auto state = selector->lifetime().make_state(); selector->willExpand() | rpl::start_with_next([=] { state->expanded = true; }, selector->lifetime()); - base::install_event_filter(selector, [=](not_null event) { - if (event->type() == QEvent::MouseButtonPress) { - state->timerLifetime.destroy(); - return base::EventFilterResult::Continue; - } else if (!state->expanded && event->type() == QEvent::Enter) { - state->timerLifetime.destroy(); - return base::EventFilterResult::Continue; - } else if (!state->expanded && event->type() == QEvent::Leave) { - restartTimer(kTimerOnLeave); - return base::EventFilterResult::Continue; - } - return base::EventFilterResult::Continue; - }, selector->lifetime()); + setupToastTimer(selector, state, hideAndDestroy); QObject::connect( _toast->widget(), @@ -237,7 +215,6 @@ void SelfForwardsTagger::showSelectorForMessages( rect.x() + (rect.width() - selector->width()) / 2, rect::bottom(rect) - st::selfForwardsTaggerStripSkip); }, selector->lifetime()); - restartTimer(kInitTimer); selector->show(); } @@ -372,20 +349,10 @@ void SelfForwardsTagger::showChannelFilterToast(not_null peer) { const auto rightButton = createRightButton(widget); const auto history = peer->owner().history(peer); - struct State { - rpl::lifetime timerLifetime; - bool menuExpanded = false; - }; - const auto state = widget->lifetime().make_state(); - const auto restartTimer = [=](crl::time ms) { - state->timerLifetime.destroy(); - base::timer_once(ms) | rpl::start_with_next([=] { - hideToast(); - }, state->timerLifetime); - }; + const auto state = widget->lifetime().make_state(); rightButton->setClickedCallback([=] { - state->menuExpanded = true; + state->expanded = true; state->timerLifetime.destroy(); const auto menu = Ui::CreateChild( rightButton, @@ -406,21 +373,7 @@ void SelfForwardsTagger::showChannelFilterToast(not_null peer) { } }); - base::install_event_filter(widget, [=](not_null event) { - if (event->type() == QEvent::MouseButtonPress) { - state->timerLifetime.destroy(); - return base::EventFilterResult::Continue; - } else if (!state->menuExpanded && event->type() == QEvent::Enter) { - state->timerLifetime.destroy(); - return base::EventFilterResult::Continue; - } else if (!state->menuExpanded && event->type() == QEvent::Leave) { - restartTimer(kTimerOnLeave); - return base::EventFilterResult::Continue; - } - return base::EventFilterResult::Continue; - }, widget->lifetime()); - - restartTimer(kInitTimer); + setupToastTimer(widget, state, [=] { hideToast(); }); } } @@ -439,6 +392,34 @@ not_null SelfForwardsTagger::createRightButton( return button; } +void SelfForwardsTagger::setupToastTimer( + not_null widget, + not_null state, + Fn hideCallback) { + const auto restartTimer = [=](crl::time ms) { + state->timerLifetime.destroy(); + base::timer_once(ms) | rpl::start_with_next([=] { + hideCallback(); + }, state->timerLifetime); + }; + + base::install_event_filter(widget, [=](not_null event) { + if (event->type() == QEvent::MouseButtonPress) { + state->timerLifetime.destroy(); + return base::EventFilterResult::Continue; + } else if (!state->expanded && event->type() == QEvent::Enter) { + state->timerLifetime.destroy(); + return base::EventFilterResult::Continue; + } else if (!state->expanded && event->type() == QEvent::Leave) { + restartTimer(kTimerOnLeave); + return base::EventFilterResult::Continue; + } + return base::EventFilterResult::Continue; + }, state->timerLifetime); + + restartTimer(kInitTimer); +} + void SelfForwardsTagger::hideToast() { if (const auto strong = _toast.get()) { strong->hideAnimated(); diff --git a/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.h b/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.h index 53e5ca4e1f..38659ec030 100644 --- a/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.h +++ b/Telegram/SourceFiles/history/view/history_view_self_forwards_tagger.h @@ -54,6 +54,11 @@ public: ~SelfForwardsTagger(); private: + struct ToastTimerState { + rpl::lifetime timerLifetime; + bool expanded = false; + }; + void setup(); void showSelectorForMessages(const MessageIdsList &ids); void showToast(const TextWithEntities &text, Fn callback); @@ -62,6 +67,10 @@ private: void createLottieIcon(not_null widget, const QString &name); not_null createRightButton( not_null widget); + void setupToastTimer( + not_null widget, + not_null state, + Fn hideCallback); void hideToast(); [[nodiscard]] QRect toastGeometry() const;