Improve touchscreen chats list stories physics.

This commit is contained in:
John Preston 2023-06-27 21:25:36 +04:00
parent fba1b79252
commit 71e341237d
7 changed files with 46 additions and 2 deletions

View File

@ -479,6 +479,10 @@ rpl::producer<bool> 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)

View File

@ -104,6 +104,7 @@ public:
const QVector<MTPPeer> &my,
const QVector<MTPPeer> &result);
void setTouchScrollActive(bool active);
[[nodiscard]] rpl::producer<bool> storiesExpandedRequests() const;
[[nodiscard]] int defaultScrollTop() const;
void setViewportHeight(int viewportHeight);

View File

@ -327,6 +327,9 @@ Widget::Widget(
_scroll->setCustomWheelProcess([=](not_null<QWheelEvent*> e) {
return customWheelProcess(e);
});
_scroll->setCustomTouchProcess([=](not_null<QTouchEvent*> 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<QWheelEvent*> e) {
return false;
}
bool Widget::customTouchProcess(not_null<QTouchEvent*> 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();
}

View File

@ -137,6 +137,7 @@ private:
void filterCursorMoved();
void completeHashtag(QString tag);
bool customWheelProcess(not_null<QWheelEvent*> e);
bool customTouchProcess(not_null<QTouchEvent*> e);
[[nodiscard]] QString currentSearchQuery() const;
void clearSearchField();

View File

@ -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;

View File

@ -69,6 +69,7 @@ public:
Fn<int()> shownHeight);
void setBgOverride(QBrush brush);
void setTouchScrollActive(bool active);
[[nodiscard]] rpl::producer<uint64> clicks() const;
[[nodiscard]] rpl::producer<uint64> 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;

@ -1 +1 @@
Subproject commit 8908c9b5c041f51176383a55e0b324588b28b68d
Subproject commit 6fe9e0838685b0a799057a9218c4beca0cd7c52e