[thanos] Added scrollToY delegate callback for synthetic scroll support.

This commit is contained in:
23rd
2026-04-10 10:17:56 +03:00
parent f33dc62f5f
commit 2b75b48919
5 changed files with 12 additions and 7 deletions
@@ -4249,6 +4249,9 @@ void HistoryInner::setupThanosEffect() {
.scrollArea = [=]() -> not_null<Ui::ScrollArea*> {
return _scroll;
},
.scrollToY = [=](int y) {
_widget->synteticScrollToY(y);
},
.setCollapseGaps = [=](std::vector<CollapseGap> gaps) {
setCollapseGaps(std::move(gaps));
},
@@ -338,6 +338,9 @@ protected:
void mouseReleaseEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
public:
void synteticScrollToY(int y);
private:
using TabbedPanel = ChatHelpers::TabbedPanel;
using TabbedSelector = ChatHelpers::TabbedSelector;
@@ -651,11 +654,6 @@ private:
int itemTopForHighlight(not_null<HistoryView::Element*> view) const;
void scrollToCurrentVoiceMessage(FullMsgId fromId, FullMsgId toId);
// Scroll to current y without updating the _lastUserScrolled time.
// Used to distinguish between user scrolls and syntetic scrolls.
// This one is syntetic.
void synteticScrollToY(int y);
void writeDrafts();
void writeDraftTexts();
void writeDraftCursors();
@@ -4411,6 +4411,9 @@ void ListWidget::setupThanosEffect() {
.scrollArea = [=]() -> not_null<Ui::ScrollArea*> {
return scroll;
},
.scrollToY = [=](int y) {
scroll->scrollToY(y);
},
.setCollapseGaps = [=](std::vector<Ui::CollapseGap> gaps) {
setCollapseGaps(std::move(gaps));
},
@@ -229,7 +229,7 @@ void ThanosEffectController::startCollapseAnimation(
const auto aboveViewport = std::max(0, scrollTop - itemTop);
const auto scrollAdjust = std::min(height, aboveViewport);
if (scrollAdjust > 0) {
scroll->scrollToY(scrollTop + scrollAdjust);
_delegate.scrollToY(scrollTop + scrollAdjust);
}
auto totalHeight = 0;
@@ -266,7 +266,7 @@ void ThanosEffectController::collapseAnimationCallback() {
const auto scroll = _delegate.scrollArea();
const auto scrollTop = scroll->scrollTop();
syncCollapseGapsToHost();
scroll->scrollToY(std::max(scrollTop - totalDelta, 0));
_delegate.scrollToY(std::max(scrollTop - totalDelta, 0));
}
if (!_collapseAnimation.animating()) {
@@ -46,6 +46,7 @@ public:
Fn<ChatPaintContext(QRect)> preparePaintContext;
Fn<QWidget*()> window;
Fn<not_null<ScrollArea*>()> scrollArea;
Fn<void(int scrollTop)> scrollToY;
Fn<void(std::vector<CollapseGap>)> setCollapseGaps;
};