Forráskód Böngészése

chrome window scope

milan jurkulák 2 éve
szülő
commit
f5a27421c4

+ 11 - 4
src/main/kotlin/eu/mjdev/desktop/windows/ChromeWindow.kt

@@ -7,6 +7,7 @@ import androidx.compose.ui.input.key.KeyEvent
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.window.WindowPosition
+import eu.mjdev.desktop.windows.ChromeWindowScope.Companion.withChromeWindowScope
 import eu.mjdev.desktop.windows.ChromeWindowState.Companion.rememberAnimState
 import eu.mjdev.desktop.windows.ChromeWindowState.Companion.rememberChromeWindowState
 import eu.mjdev.desktop.windows.ChromeWindowState.Companion.rememberWnState
@@ -32,7 +33,7 @@ fun ChromeWindow(
     onFocusChange: (Boolean) -> Unit = {},
     onOpened: () -> Unit = {},
     onClosed: () -> Unit = {},
-    content: @Composable () -> Unit = {}
+    content: @Composable ChromeWindowScope.() -> Unit = {}
 ) = ChromeWindow(
     windowState,
     visible,
@@ -70,7 +71,7 @@ fun ChromeWindow(
     onFocusChange: (Boolean) -> Unit = {},
     onOpened: () -> Unit = {},
     onClosed: () -> Unit = {},
-    content: @Composable () -> Unit = {}
+    content: @Composable ChromeWindowScope.() -> Unit = {}
 ) = ChromeWindow(
     windowState,
     visible,
@@ -107,7 +108,7 @@ fun ChromeWindow(
     onFocusChange: (Boolean) -> Unit = {},
     onOpened: () -> Unit = {},
     onClosed: () -> Unit = {},
-    content: @Composable () -> Unit = {}
+    content: @Composable ChromeWindowScope.() -> Unit = {}
 ) {
     val animState = rememberAnimState(visible)
     val wnState = rememberWnState()
@@ -143,7 +144,13 @@ fun ChromeWindow(
                 enter = enterAnimation,
                 exit = exitAnimation
             ) {
-                content()
+                withChromeWindowScope(
+                    windowState,
+                    animState,
+                    wnState
+                ) {
+                    content()
+                }
             }
         }
     )

+ 73 - 0
src/main/kotlin/eu/mjdev/desktop/windows/ChromeWindowScope.kt

@@ -0,0 +1,73 @@
+package eu.mjdev.desktop.windows
+
+import androidx.compose.animation.core.MutableTransitionState
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.State
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpOffset
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.window.FrameWindowScope
+import androidx.compose.ui.window.WindowPosition
+
+@Suppress("unused", "MemberVisibilityCanBePrivate")
+class ChromeWindowScope(
+    private val frameScope: FrameWindowScope,
+    val windowState: ChromeWindowState,
+    val animState: State<MutableTransitionState<Boolean>>,
+    val windowVisibleState: MutableState<Boolean>
+) {
+    val window
+        get() = frameScope.window
+
+    val stateHelper: WindowStateHelper
+        get() = windowState.stateHelper
+
+    val focusHelper: WindowFocusHelper
+        get() = windowState.focusHelper
+
+    val x
+        get() = stateHelper.x
+
+    val y
+        get() = stateHelper.y
+
+    val width
+        get() = stateHelper.window
+
+    val height
+        get() = stateHelper.height
+
+    fun apply(
+        block: ChromeWindowScope.() -> Unit
+    ) = with(this) {
+        block()
+    }
+
+    fun requestFocus() =
+        stateHelper.requestFocus()
+
+    fun setBounds(
+        x: Dp = this.x,
+        y: Dp = this.y,
+        width: Dp = stateHelper.width,
+        height: Dp = stateHelper.height
+    ) = stateHelper.setBounds(x, y, width, height)
+
+    fun setOffset(offset: DpOffset) =
+        stateHelper.setBounds(x = offset.x, y = offset.y)
+
+    fun setSize(size: DpSize) =
+        stateHelper.setBounds(width = size.width, height = size.height)
+
+    fun setPosition(position: WindowPosition) =
+        stateHelper.setPosition(position)
+
+    companion object {
+        fun FrameWindowScope.withChromeWindowScope(
+            windowState: ChromeWindowState,
+            animState: State<MutableTransitionState<Boolean>>,
+            windowVisibleState: MutableState<Boolean>,
+            block: ChromeWindowScope.() -> Unit
+        ) = ChromeWindowScope(this, windowState, animState, windowVisibleState).apply(block)
+    }
+}

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/windows/FullScreenWindow.kt

@@ -20,7 +20,7 @@ fun FullScreenWindow(
         size = api.containerSize,
         position = WindowPosition.Aligned(Alignment.Center)
     ),
-    content: @Composable () -> Unit = {}
+    content: @Composable ChromeWindowScope.() -> Unit = {}
 ) = ChromeWindow(
     windowState = windowState,
     resizable = false,

+ 5 - 1
src/main/kotlin/eu/mjdev/desktop/windows/WindowFocusHelper.kt

@@ -6,7 +6,7 @@ import java.awt.event.WindowEvent.*
 import java.awt.event.WindowFocusListener
 import java.awt.event.WindowStateListener
 
-@Suppress("MemberVisibilityCanBePrivate")
+@Suppress("MemberVisibilityCanBePrivate", "unused")
 class WindowFocusHelper(
     val onFocusChange: WindowFocusHelper.(window: ComposeWindow?, focus: Boolean) -> Unit
 ) : WindowFocusListener, WindowStateListener {
@@ -24,6 +24,10 @@ class WindowFocusHelper(
         window.removeWindowStateListener(this)
     }
 
+    fun requestFocus() {
+        window?.requestFocus()
+    }
+
     override fun windowGainedFocus(e: WindowEvent?) {
         onFocusChange(window, true)
     }