[go: nahoru, domu]

Improve LayoutCoordinates API

Fixes: 175421052

Relnote: "Deprecated global coordinates methods and made
new window-based coordinates methods."

Made a few improvements to the LayoutCoordinates API:
* Replaced screen coordinate APIs with window coordinate
  APIs
* childToLocal() is replaced with localPositionOf(), which
  offers coordinate transforms betweeen any layouts in
  the same hierarchy.
* childBoundingBox() is replaced with localBoundingBoxOf(),
  which offers coordinate transforms between any layouts in
  the same hierarchy.
* positionInRoot and boundsInRoot were replaced with
  methods positionInRoot() and boundsInRoot() to better
  indicate that it is doing some work to calculate.

Test: ran existing tests and added new ones
Change-Id: Iee284dee7dbc4226493feb144d446a0289b7c83e
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt
index c9b5105..444c464 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionManager.kt
@@ -27,7 +27,7 @@
 import androidx.compose.ui.hapticfeedback.HapticFeedback
 import androidx.compose.ui.hapticfeedback.HapticFeedbackType
 import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.layout.globalBounds
+import androidx.compose.ui.layout.boundsInWindow
 import androidx.compose.ui.platform.ClipboardManager
 import androidx.compose.ui.platform.TextToolbar
 import androidx.compose.ui.platform.TextToolbarStatus
@@ -183,14 +183,14 @@
             return
         }
 
-        val startHandlePosition = containerCoordinates.childToLocal(
+        val startHandlePosition = containerCoordinates.localPositionOf(
             startLayoutCoordinates,
             selection.start.selectable.getHandlePosition(
                 selection = selection,
                 isStartHandle = true
             )
         )
-        val endHandlePosition = containerCoordinates.childToLocal(
+        val endHandlePosition = containerCoordinates.localPositionOf(
             endLayoutCoordinates,
             selection.end.selectable.getHandlePosition(
                 selection = selection,
@@ -331,14 +331,14 @@
 
         val localLayoutCoordinates = containerLayoutCoordinates
         if (localLayoutCoordinates != null && localLayoutCoordinates.isAttached) {
-            var startOffset = localLayoutCoordinates.childToLocal(
+            var startOffset = localLayoutCoordinates.localPositionOf(
                 startLayoutCoordinates,
                 selection.start.selectable.getHandlePosition(
                     selection = selection,
                     isStartHandle = true
                 )
             )
-            var endOffset = localLayoutCoordinates.childToLocal(
+            var endOffset = localLayoutCoordinates.localPositionOf(
                 endLayoutCoordinates,
                 selection.end.selectable.getHandlePosition(
                     selection = selection,
@@ -352,7 +352,7 @@
             val left = min(startOffset.x, endOffset.x)
             val right = max(startOffset.x, endOffset.x)
 
-            var startTop = localLayoutCoordinates.childToLocal(
+            var startTop = localLayoutCoordinates.localPositionOf(
                 startLayoutCoordinates,
                 Offset(
                     0f,
@@ -360,7 +360,7 @@
                 )
             )
 
-            var endTop = localLayoutCoordinates.childToLocal(
+            var endTop = localLayoutCoordinates.localPositionOf(
                 endLayoutCoordinates,
                 Offset(
                     0.0f,
@@ -427,7 +427,7 @@
 
                 // Convert the position where drag gesture begins from composable coordinates to
                 // selection container coordinates.
-                dragBeginPosition = requireContainerCoordinates().childToLocal(
+                dragBeginPosition = requireContainerCoordinates().localPositionOf(
                     beginLayoutCoordinates,
                     beginCoordinates
                 )
@@ -443,7 +443,7 @@
                 val currentStart = if (isStartHandle) {
                     dragBeginPosition + dragTotalDistance
                 } else {
-                    requireContainerCoordinates().childToLocal(
+                    requireContainerCoordinates().localPositionOf(
                         selection.start.selectable.getLayoutCoordinates()!!,
                         getAdjustedCoordinates(
                             selection.start.selectable.getHandlePosition(
@@ -455,7 +455,7 @@
                 }
 
                 val currentEnd = if (isStartHandle) {
-                    requireContainerCoordinates().childToLocal(
+                    requireContainerCoordinates().localPositionOf(
                         selection.end.selectable.getLayoutCoordinates()!!,
                         getAdjustedCoordinates(
                             selection.end.selectable.getHandlePosition(
@@ -491,7 +491,7 @@
     ): Offset? {
         val coordinates = containerLayoutCoordinates
         if (coordinates == null || !coordinates.isAttached) return null
-        return requireContainerCoordinates().childToLocal(layoutCoordinates, offset)
+        return requireContainerCoordinates().localPositionOf(layoutCoordinates, offset)
     }
 
     private fun updateSelection(
@@ -565,9 +565,10 @@
     // globalBounds is the global boundaries of this LayoutCoordinates after it's clipped by
     // parents. We can think it as the global visible bounds of this Layout. Here globalBounds
     // is convert to local, which is the boundary of the visible area within the LayoutCoordinates.
+    val boundsInWindow = boundsInWindow()
     return Rect(
-        globalToLocal(globalBounds.topLeft),
-        globalToLocal(globalBounds.bottomRight)
+        windowToLocal(boundsInWindow.topLeft),
+        windowToLocal(boundsInWindow.bottomRight)
     )
 }