ChromeWindow.kt 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package org.mjdev.desktop.windows
  2. import android.annotation.SuppressLint
  3. import androidx.compose.foundation.layout.Box
  4. import androidx.compose.runtime.Composable
  5. import androidx.compose.ui.Modifier
  6. import androidx.compose.ui.draw.alpha
  7. import androidx.compose.ui.layout.LayoutCoordinates
  8. import androidx.compose.ui.layout.onPlaced
  9. import androidx.compose.ui.layout.positionOnScreen
  10. import androidx.compose.ui.unit.DpOffset
  11. import androidx.compose.ui.unit.DpSize
  12. import androidx.compose.ui.unit.dp
  13. import org.mjdev.desktop.context.DesktopContextScope.Companion.withDesktopContext
  14. import org.mjdev.desktop.context.IDesktopContext
  15. @SuppressLint("UnusedBoxWithConstraintsScope")
  16. @Composable
  17. fun ChromeWindow(
  18. modifier: Modifier = Modifier,
  19. content: @Composable ChromeWindowState.() -> Unit,
  20. ) = withDesktopContext {
  21. val windowState = ChromeWindowState(context)
  22. Box(
  23. modifier =
  24. modifier
  25. .alpha(0f)
  26. .onPlaced { coords ->
  27. windowState.onPlaced(coords)
  28. },
  29. content = { content(windowState) },
  30. )
  31. ChromeWindowInternal(
  32. state = windowState,
  33. ) {
  34. content(windowState)
  35. }
  36. }
  37. @Composable
  38. fun ChromeWindowInternal(
  39. state: ChromeWindowState,
  40. content: @Composable () -> Unit,
  41. ) {
  42. // todo
  43. content()
  44. }
  45. class ChromeWindowState(
  46. val context: IDesktopContext,
  47. ) {
  48. var size: DpSize = DpSize.Zero
  49. var position: DpOffset = DpOffset.Zero
  50. fun onPlaced(coords: LayoutCoordinates) {
  51. position = coords.positionOnScreen().let { pos -> DpOffset(pos.x.dp, pos.y.dp) }
  52. size = coords.size.let { size -> DpSize(size.width.dp, size.height.dp) }
  53. }
  54. }