1
1
package app.cleanmeter.target.desktop.ui.settings
2
2
3
3
import androidx.compose.runtime.Composable
4
+ import androidx.compose.runtime.LaunchedEffect
4
5
import androidx.compose.runtime.getValue
5
6
import androidx.compose.runtime.mutableStateOf
6
7
import androidx.compose.runtime.remember
7
8
import androidx.compose.runtime.setValue
9
+ import androidx.compose.runtime.snapshotFlow
8
10
import androidx.compose.ui.res.painterResource
9
11
import androidx.compose.ui.unit.DpSize
10
12
import androidx.compose.ui.unit.IntOffset
@@ -16,13 +18,21 @@ import androidx.compose.ui.window.rememberWindowState
16
18
import app.cleanmeter.target.desktop.data.PREFERENCE_START_MINIMIZED
17
19
import app.cleanmeter.target.desktop.data.PreferencesRepository
18
20
import 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
19
27
20
28
@Composable
21
29
fun ApplicationScope.SettingsWindow (
22
30
isDarkTheme : Boolean ,
23
31
getOverlayPosition : () -> IntOffset ,
24
32
onApplicationExit : () -> Unit ,
25
33
) {
34
+ val maximumWindowBounds = remember { GraphicsEnvironment .getLocalGraphicsEnvironment().maximumWindowBounds.height }
35
+ val minimumHeight = remember { min(800 , maximumWindowBounds) }
26
36
var isVisible by remember {
27
37
mutableStateOf(
28
38
PreferencesRepository .getPreferenceBooleanNullable(
@@ -32,7 +42,7 @@ fun ApplicationScope.SettingsWindow(
32
42
}
33
43
val icon = painterResource(" imgs/logo.png" )
34
44
val state = rememberWindowState().apply {
35
- size = DpSize (650 .dp, 650 .dp)
45
+ size = DpSize (650 .dp, minimumHeight .dp)
36
46
}
37
47
38
48
Window (
@@ -41,10 +51,25 @@ fun ApplicationScope.SettingsWindow(
41
51
icon = icon,
42
52
visible = isVisible,
43
53
title = " Clean Meter" ,
44
- resizable = false ,
54
+ resizable = true ,
45
55
undecorated = true ,
46
56
transparent = true ,
47
57
) {
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
+
48
73
Settings (
49
74
isDarkTheme = isDarkTheme,
50
75
onCloseRequest = { isVisible = false },
0 commit comments