11package app.cleanmeter.target.desktop.ui.settings
22
33import androidx.compose.runtime.Composable
4+ import androidx.compose.runtime.LaunchedEffect
45import androidx.compose.runtime.getValue
56import androidx.compose.runtime.mutableStateOf
67import androidx.compose.runtime.remember
78import androidx.compose.runtime.setValue
9+ import androidx.compose.runtime.snapshotFlow
810import androidx.compose.ui.res.painterResource
911import androidx.compose.ui.unit.DpSize
1012import androidx.compose.ui.unit.IntOffset
@@ -16,13 +18,21 @@ import androidx.compose.ui.window.rememberWindowState
1618import app.cleanmeter.target.desktop.data.PREFERENCE_START_MINIMIZED
1719import app.cleanmeter.target.desktop.data.PreferencesRepository
1820import com.github.kwhat.jnativehook.GlobalScreen
21+ import kotlinx.coroutines.flow.launchIn
22+ import kotlinx.coroutines.flow.onEach
23+ import java.awt.GraphicsEnvironment
24+ import java.awt.event.ComponentAdapter
25+ import java.awt.event.ComponentEvent
26+ import kotlin.math.min
1927
2028@Composable
2129fun ApplicationScope.SettingsWindow (
2230 isDarkTheme : Boolean ,
2331 getOverlayPosition : () -> IntOffset ,
2432 onApplicationExit : () -> Unit ,
2533) {
34+ val maximumWindowBounds = remember { GraphicsEnvironment .getLocalGraphicsEnvironment().maximumWindowBounds.height }
35+ val minimumHeight = remember { min(800 , maximumWindowBounds) }
2636 var isVisible by remember {
2737 mutableStateOf(
2838 PreferencesRepository .getPreferenceBooleanNullable(
@@ -32,7 +42,7 @@ fun ApplicationScope.SettingsWindow(
3242 }
3343 val icon = painterResource(" imgs/logo.png" )
3444 val state = rememberWindowState().apply {
35- size = DpSize (650 .dp, 650 .dp)
45+ size = DpSize (650 .dp, minimumHeight .dp)
3646 }
3747
3848 Window (
@@ -41,10 +51,25 @@ fun ApplicationScope.SettingsWindow(
4151 icon = icon,
4252 visible = isVisible,
4353 title = " Clean Meter" ,
44- resizable = false ,
54+ resizable = true ,
4555 undecorated = true ,
4656 transparent = true ,
4757 ) {
58+ LaunchedEffect (state) {
59+ snapshotFlow { state.size }
60+ .onEach {
61+ var size = it
62+ if (it.width != 650 .dp) {
63+ size = it.copy(width = 650 .dp)
64+ }
65+ if (it.height < minimumHeight.dp || it.height > maximumWindowBounds.dp ) {
66+ size = it.copy(height = minimumHeight.dp)
67+ }
68+ state.size = size
69+ }
70+ .launchIn(this )
71+ }
72+
4873 Settings (
4974 isDarkTheme = isDarkTheme,
5075 onCloseRequest = { isVisible = false },
0 commit comments