Skip to content

Commit 91dca24

Browse files
authored
[Fabric] Implement zoomScale, maximumZoomScale and minimumZoomScale in ScrollView (#14562)
* Implemet maximumZoomScale and minimumZoomScalein ScrollView * Change files * lint fix * Add zoomScale
1 parent 9685da5 commit 91dca24

File tree

4 files changed

+47
-8
lines changed

4 files changed

+47
-8
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Implement zoomScale, maximumZoomScale and minimumZoomScale in ScrollView",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

vnext/Microsoft.ReactNative/CompositionSwitcher.idl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ namespace Microsoft.ReactNative.Composition.Experimental
116116
void TryUpdatePosition(Windows.Foundation.Numerics.Vector3 position, Boolean animate);
117117
void OnPointerPressed(Microsoft.ReactNative.Composition.Input.PointerRoutedEventArgs args);
118118
void SetDecelerationRate(Windows.Foundation.Numerics.Vector3 decelerationRate);
119+
void SetMaximumZoomScale(Single maximumZoomScale);
120+
void SetMinimumZoomScale(Single minimumZoomScale);
119121
Boolean Horizontal;
120122
}
121123

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionContextHelper.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,14 @@ struct CompScrollerVisual : winrt::implements<
840840
m_interactionTracker.PositionInertiaDecayRate(decelerationRate);
841841
}
842842

843+
void SetMaximumZoomScale(float maximumZoomScale) const noexcept {
844+
m_interactionTracker.MaxScale(maximumZoomScale);
845+
}
846+
847+
void SetMinimumZoomScale(float minimumZoomScale) noexcept {
848+
m_interactionTracker.MinScale(minimumZoomScale);
849+
}
850+
843851
void Opacity(float opacity) noexcept {
844852
m_visual.Opacity(opacity);
845853
}

vnext/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ struct ScrollBarComponent {
8181
}
8282

8383
void ContentSize(winrt::Windows::Foundation::Size contentSize) noexcept {
84+
if (m_contentSize == contentSize) {
85+
return;
86+
}
8487
m_contentSize = contentSize;
8588
updateThumb();
8689
updateVisibility(m_visible);
@@ -112,6 +115,12 @@ struct ScrollBarComponent {
112115
}
113116

114117
void updateVisibility(bool visible) noexcept {
118+
if ((m_size.Width <= 0.0f && m_size.Height <= 0.0f) ||
119+
(m_contentSize.Width <= 0.0f && m_contentSize.Height <= 0.0f)) {
120+
m_rootVisual.IsVisible(false);
121+
return;
122+
}
123+
115124
if (!visible) {
116125
m_visible = false;
117126
m_rootVisual.IsVisible(visible);
@@ -769,6 +778,18 @@ void ScrollViewComponentView::updateProps(
769778
if (!oldProps || oldViewProps.decelerationRate != newViewProps.decelerationRate) {
770779
updateDecelerationRate(newViewProps.decelerationRate);
771780
}
781+
782+
if (oldViewProps.maximumZoomScale != newViewProps.maximumZoomScale) {
783+
m_scrollVisual.SetMaximumZoomScale(newViewProps.maximumZoomScale);
784+
}
785+
786+
if (oldViewProps.minimumZoomScale != newViewProps.minimumZoomScale) {
787+
m_scrollVisual.SetMinimumZoomScale(newViewProps.minimumZoomScale);
788+
}
789+
790+
if (oldViewProps.zoomScale != newViewProps.zoomScale) {
791+
m_scrollVisual.Scale({newViewProps.zoomScale, newViewProps.zoomScale, newViewProps.zoomScale});
792+
}
772793
}
773794

774795
void ScrollViewComponentView::updateState(
@@ -800,14 +821,15 @@ void ScrollViewComponentView::updateLayoutMetrics(
800821
facebook::react::LayoutMetrics const &oldLayoutMetrics) noexcept {
801822
// Set Position & Size Properties
802823
ensureVisual();
803-
804-
m_verticalScrollbarComponent->updateLayoutMetrics(layoutMetrics);
805-
m_horizontalScrollbarComponent->updateLayoutMetrics(layoutMetrics);
806-
base_type::updateLayoutMetrics(layoutMetrics, oldLayoutMetrics);
807-
m_scrollVisual.Size(
808-
{layoutMetrics.frame.size.width * layoutMetrics.pointScaleFactor,
809-
layoutMetrics.frame.size.height * layoutMetrics.pointScaleFactor});
810-
updateContentVisualSize();
824+
if (oldLayoutMetrics != layoutMetrics) {
825+
m_verticalScrollbarComponent->updateLayoutMetrics(layoutMetrics);
826+
m_horizontalScrollbarComponent->updateLayoutMetrics(layoutMetrics);
827+
base_type::updateLayoutMetrics(layoutMetrics, oldLayoutMetrics);
828+
m_scrollVisual.Size(
829+
{layoutMetrics.frame.size.width * layoutMetrics.pointScaleFactor,
830+
layoutMetrics.frame.size.height * layoutMetrics.pointScaleFactor});
831+
updateContentVisualSize();
832+
}
811833
}
812834

813835
void ScrollViewComponentView::updateContentVisualSize() noexcept {

0 commit comments

Comments
 (0)