diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingInteropContainer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingInteropContainer.desktop.kt index 87a51bd0ccb5a..741910f5bcf61 100644 --- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingInteropContainer.desktop.kt +++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingInteropContainer.desktop.kt @@ -60,12 +60,14 @@ internal class SwingInteropContainer( private var interopComponents = mutableMapOf() override var rootModifier: TrackInteropModifierNode? = null + override val interopViews: Set + get() = interopComponents.values.toSet() override fun addInteropView(nativeView: InteropComponent) { val component = nativeView.container val nonInteropComponents = container.componentCount - interopComponents.size // AWT uses the reverse order for drawing and events, so index = size - count - val index = maxOf(0, interopComponents.size - countInteropComponentsBefore(nativeView)) + val index = interopComponents.size - countInteropComponentsBefore(nativeView) interopComponents[component] = nativeView container.add(component, if (placeInteropAbove) { index diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt index 446fa03d950d9..40b53da9e99a3 100644 --- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt +++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/SwingPanel.desktop.kt @@ -188,7 +188,7 @@ private class SwingPanelContainer( private val focusComponent: Component ): JPanel() { init { - name = "SwingPanel #$key" + name = "SwingPanel #${key.toString(MaxSupportedRadix)}" layout = null focusTraversalPolicy = object : LayoutFocusTraversalPolicy() { override fun getComponentAfter(aContainer: Container?, aComponent: Component?): Component? { @@ -398,3 +398,8 @@ private class InteropPointerInputModifier( return SwingUtilities.getDeepestComponentAt(parent, point.x, point.y) } } + +/** + * The maximum radix available for conversion to and from strings. + */ +private val MaxSupportedRadix = 36 diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/node/InteropContainer.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/node/InteropContainer.kt index 56715e32e526a..b761528452f94 100644 --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/node/InteropContainer.kt +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/node/InteropContainer.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.node.TraversableNode.Companion.TraverseDescendantsAct */ internal interface InteropContainer { var rootModifier: TrackInteropModifierNode? + val interopViews: Set fun addInteropView(nativeView: T) fun removeInteropView(nativeView: T) @@ -44,7 +45,11 @@ internal fun InteropContainer.countInteropComponentsBefore(nativeView: T) var componentsBefore = 0 rootModifier?.traverseDescendants { if (it.nativeView != nativeView) { - componentsBefore++ + // It might be inside Compose tree before adding in InteropContainer in case + // if it was initiated out of scroll visible bounds for example. + if (it.nativeView in interopViews) { + componentsBefore++ + } ContinueTraversal } else { CancelTraversal diff --git a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/interop/UIKitInteropContainer.uikit.kt b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/interop/UIKitInteropContainer.uikit.kt index ccfd9b2c6674c..94dad704884a3 100644 --- a/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/interop/UIKitInteropContainer.uikit.kt +++ b/compose/ui/ui/src/uikitMain/kotlin/androidx/compose/ui/interop/UIKitInteropContainer.uikit.kt @@ -44,14 +44,18 @@ internal val LocalUIKitInteropContainer = staticCompositionLocalOf { val containerView: UIView = UIKitInteropContainerView() override var rootModifier: TrackInteropModifierNode? = null + override var interopViews = mutableSetOf() + private set override fun addInteropView(nativeView: UIView) { val index = countInteropComponentsBefore(nativeView) + interopViews.add(nativeView) containerView.insertSubview(nativeView, index.toLong()) } override fun removeInteropView(nativeView: UIView) { nativeView.removeFromSuperview() + interopViews.remove(nativeView) } }