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)
)
}