Re-pick the anchor (the node at the viewport center) and remember its id + screen position (absolute top relative to the viewport top) so a later content reflow can pin it back. Called from both layout (updateScrollState) and scroll (handleOnScroll) so the anchor never goes stale between layout passes.
| 983 | |
| 984 | // Re-pick the anchor (the node at the viewport center) and remember its id + screen position |
| 985 | // (absolute top relative to the viewport top) so a later content reflow can pin it back. Called |
| 986 | // from both layout (updateScrollState) and scroll (handleOnScroll) so the anchor never goes stale |
| 987 | // between layout passes. |
| 988 | void refreshPreserveAnchor(ViewNode* scrollNode, ViewNodeScrollState& scrollState, float offsetY, float viewportH) { |
| 989 | float probeY = offsetY + viewportH * 0.5f; |
| 990 | // Only anchor on a node with a real, trackable rawId. id 0 (unset/default) can't be re-found |
| 991 | // across passes, so don't record it -- clear instead and re-pick next pass. |
| 992 | if (auto* anchor = preserveDescendantAtY(scrollNode, probeY); anchor != nullptr && anchor->getRawId() != 0) { |
| 993 | scrollState.setPreserveAnchor(anchor->getRawId(), preserveAnchorAbsoluteTop(scrollNode, anchor) - offsetY); |
| 994 | } else { |
| 995 | scrollState.clearPreserveAnchor(); |
| 996 | } |
| 997 | } |
no test coverage detected