From d1f389891f20567ddd6cb43fd984c57ab6ce1508 Mon Sep 17 00:00:00 2001 From: Ivan Matkov Date: Mon, 27 May 2024 16:00:54 +0200 Subject: [PATCH] Fix container size in case of `ImageComposeScene` (#1375) Fixes https://github.com/JetBrains/compose-multiplatform/issues/4875 ## Testing `:compose:ui:ui:desktopTest --tests "androidx.compose.ui.ImageComposeSceneTest"` ## Release Notes ### Fixes - Multiple Platforms - Fix container size for `Dialog` centering inside `ImageComposeScene` --- .../compose/ui/ImageComposeSceneTest.kt | 14 ++++++++++ .../compose/ui/ImageComposeScene.skikoMain.kt | 24 +++++++++++++++++- ...eComposeSceneTest_run_dialog_in_center.png | Bin 0 -> 176 bytes 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 golden/compose/ui/ui-desktop/androidx_compose_ui_ImageComposeSceneTest_run_dialog_in_center.png diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ImageComposeSceneTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ImageComposeSceneTest.kt index 4f229bbc062dc..4eb85bae8c627 100644 --- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ImageComposeSceneTest.kt +++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ImageComposeSceneTest.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.test.InternalTestApi import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog import kotlin.time.Duration.Companion.seconds import kotlin.time.ExperimentalTime import kotlinx.coroutines.runBlocking @@ -94,6 +95,19 @@ class ImageComposeSceneTest { } } + @Test + fun `run dialog in center`() { + val image = renderComposeScene( + width = 80, + height = 40, + ) { + Dialog(onDismissRequest = {}) { + Box(Modifier.size(20.dp).background(Color.Red)) + } + } + screenshotRule.write(image) + } + @Test fun `run multiple ImageComposeScene`() { for (i in 1..300) { diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ImageComposeScene.skikoMain.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ImageComposeScene.skikoMain.kt index 3c7cfabb1ba27..c13f76f4099aa 100644 --- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ImageComposeScene.skikoMain.kt +++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/ImageComposeScene.skikoMain.kt @@ -29,6 +29,10 @@ import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.PointerKeyboardModifiers import androidx.compose.ui.input.pointer.PointerType import androidx.compose.ui.node.RootForTest +import androidx.compose.ui.platform.PlatformContext +import androidx.compose.ui.platform.WindowInfo +import androidx.compose.ui.platform.WindowInfoImpl +import androidx.compose.ui.scene.ComposeSceneContext import androidx.compose.ui.scene.ComposeScenePointer import androidx.compose.ui.scene.MultiLayerComposeScene import androidx.compose.ui.unit.Constraints @@ -132,11 +136,29 @@ class ImageComposeScene @ExperimentalComposeUiApi constructor( private val surface = Surface.makeRasterN32Premul(width, height) + private val imageSize = IntSize(width, height) + + private val _windowInfo = WindowInfoImpl().apply { + isWindowFocused = true + containerSize = imageSize + } + + private val _platformContext = object : PlatformContext by PlatformContext.Empty { + override val windowInfo: WindowInfo + get() = _windowInfo + } + + private val _sceneContext = object : ComposeSceneContext { + override val platformContext: PlatformContext + get() = _platformContext + } + private val scene = MultiLayerComposeScene( density = density, layoutDirection = layoutDirection, - size = IntSize(width, height), + size = imageSize, coroutineContext = coroutineContext, + composeSceneContext = _sceneContext ).also { it.setContent(content = content) } diff --git a/golden/compose/ui/ui-desktop/androidx_compose_ui_ImageComposeSceneTest_run_dialog_in_center.png b/golden/compose/ui/ui-desktop/androidx_compose_ui_ImageComposeSceneTest_run_dialog_in_center.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb0b130c9af337413c6c743617a35c2e6230bcf GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0YI$5!3HEV6KWZO6icy_X9x!n)NrJ90Qu>jE{-7? z_uk&x$a_G6$MxX*j>wyukz#5K7+gJz^BI)qzUlKSaz7r+!NA1A5x~I6#IoY=t$6