diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 6789e88de..35a19da9a 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -479,6 +479,10 @@ rpl::producer InnerWidget::storiesExpandedRequests() const { _storiesExpandedRequests.events()); } +void InnerWidget::setTouchScrollActive(bool active) { + _stories->setTouchScrollActive(active); +} + int InnerWidget::defaultScrollTop() const { return storiesShown() ? std::max(_stories->height() - st::dialogsStories.height, 0) diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index ce70f3bb3..b23aefa0d 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -104,6 +104,7 @@ public: const QVector &my, const QVector &result); + void setTouchScrollActive(bool active); [[nodiscard]] rpl::producer storiesExpandedRequests() const; [[nodiscard]] int defaultScrollTop() const; void setViewportHeight(int viewportHeight); diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 11f72ace9..74bbd6da8 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -327,6 +327,9 @@ Widget::Widget( _scroll->setCustomWheelProcess([=](not_null e) { return customWheelProcess(e); }); + _scroll->setCustomTouchProcess([=](not_null e) { + return customTouchProcess(e); + }); session().data().chatsListChanges( ) | rpl::filter([=](Data::Folder *folder) { @@ -856,6 +859,7 @@ void Widget::changeOpenedSubsection( } oldContentCache = grabForFolderSlideAnimation(); } + _scroll->verticalScrollBar()->setMinimum(0); _showAnimation = nullptr; destroyChildListCanvas(); change(); @@ -2394,6 +2398,27 @@ bool Widget::customWheelProcess(not_null e) { return false; } +bool Widget::customTouchProcess(not_null e) { + const auto type = e->type(); + const auto now = _scroll->scrollTop(); + const auto def = _inner->defaultScrollTop(); + const auto bar = _scroll->verticalScrollBar(); + _allowStoriesExpandTimer.cancel(); + if (type == QEvent::TouchBegin + || type == QEvent::TouchUpdate) { + _inner->setTouchScrollActive(true); + bar->setMinimum(0); + } else if (type == QEvent::TouchEnd || type == QEvent::TouchCancel) { + _inner->setTouchScrollActive(false); + if (def > 0 && now >= def) { + bar->setMinimum(def); + } else { + bar->setMinimum(0); + } + } + return false; +} + void Widget::resizeEvent(QResizeEvent *e) { updateControlsGeometry(); } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 11a9e4648..901f0c609 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -137,6 +137,7 @@ private: void filterCursorMoved(); void completeHashtag(QString tag); bool customWheelProcess(not_null e); + bool customTouchProcess(not_null e); [[nodiscard]] QString currentSearchQuery() const; void clearSearchField(); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index f1490669f..a76cb5deb 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -306,7 +306,7 @@ List::Layout List::computeLayout() { _lastHeight = shownHeight; if (_lastHeight == st.height || _lastHeight == full.height) { _snapExpandedTimer.cancel(); - } else { + } else if (!_touchScrollActive) { _snapExpandedTimer.callOnce(kSnapExpandedTimeout); } } @@ -831,6 +831,17 @@ void List::setBgOverride(QBrush brush) { _bgOverride = std::move(brush); } +void List::setTouchScrollActive(bool active) { + if (_touchScrollActive != active) { + _touchScrollActive = active; + if (active) { + _snapExpandedTimer.cancel(); + } else { + requestExpanded(_expanded); + } + } +} + void List::contextMenuEvent(QContextMenuEvent *e) { _menu = nullptr; diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h index 1259a0beb..e1bebe00f 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h @@ -69,6 +69,7 @@ public: Fn shownHeight); void setBgOverride(QBrush brush); + void setTouchScrollActive(bool active); [[nodiscard]] rpl::producer clicks() const; [[nodiscard]] rpl::producer showProfileRequests() const; @@ -189,6 +190,7 @@ private: float64 _lastRatio = 0.; int _lastHeight = 0; bool _expanded = false; + bool _touchScrollActive = false; int _selected = -1; int _pressed = -1; diff --git a/Telegram/lib_ui b/Telegram/lib_ui index 8908c9b5c..6fe9e0838 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit 8908c9b5c041f51176383a55e0b324588b28b68d +Subproject commit 6fe9e0838685b0a799057a9218c4beca0cd7c52e