From f4b2261423dfe4244e22cd57d5a8dfeed8a2604c Mon Sep 17 00:00:00 2001 From: alina sireneva Date: Thu, 23 Jul 2026 06:02:02 +0400 Subject: [PATCH] Collapse stories smoothly when switching chats --- .../SourceFiles/dialogs/dialogs_widget.cpp | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 0847494755..0c66d09268 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -1810,6 +1810,10 @@ void Widget::setupStories() { void Widget::storiesToggleExplicitExpand(bool expand) { if (_storiesExplicitExpand == expand) { + if (!expand && _scroll->position().overscroll < 0) { + _scroll->setOverscrollDefaults(0, 0); + _scroll->returnToOverscrollDefaults(); + } return; } _storiesExplicitExpand = expand; @@ -2285,8 +2289,7 @@ void Widget::storiesExplicitCollapse() { storiesToggleExplicitExpand(false); } else if (_stories) { using Type = Ui::ElasticScroll::OverscrollType; - _scroll->setOverscrollDefaults(0, 0); - _scroll->setOverscrollTypes(Type::None, Type::Real); + _scroll->clearOverscroll(); _scroll->setOverscrollTypes( _stories->isHidden() ? Type::Real : Type::Virtual, Type::Real); @@ -2732,13 +2735,6 @@ void Widget::updateStoriesVisibility() { const auto widthAnimation = !_widthAnimationCache.isNull(); const auto suggestionsAnimation = widthAnimation && (!_suggestions || !_hidingSuggestions.empty()); - const auto hiddenInstant = _showAnimation - || _openedForum - || _openedCommunity - || (widthAnimation && !suggestionsAnimation) - || _childList - || _stories->empty() - || (_scroll->position().overscroll < -st::dialogsFilterSkip); const auto hiddenAnimated = _searchHasFocus || _searchSuggestionsLocked || !_searchState.query.isEmpty() @@ -2747,17 +2743,23 @@ void Widget::updateStoriesVisibility() { || (_openedFolder && _subsectionTopBar && _subsectionTopBar->searchMode()); + const auto pulledDown = _scroll->position().overscroll + < -st::dialogsFilterSkip; + const auto hiddenInstant = _showAnimation + || _openedForum + || _openedCommunity + || (widthAnimation && !suggestionsAnimation) + || _childList + || _stories->empty() + || (pulledDown && hiddenAnimated); const auto hidden = hiddenInstant || hiddenAnimated; const auto changed = (_stories->toggledHidden() != hidden); _stories->setToggledHidden(hiddenInstant, hiddenAnimated); if (changed) { using Type = Ui::ElasticScroll::OverscrollType; if (hidden) { - _scroll->setOverscrollDefaults(0, 0); + _scroll->clearOverscroll(); _scroll->setOverscrollTypes(Type::Real, Type::Real); - if (_scroll->position().overscroll < 0) { - _scroll->scrollToY(0); - } _scroll->update(); } else { _scroll->setOverscrollDefaults(0, 0);