Skip to content

Commit 91167d0

Browse files
authored
Merge pull request #50 from Danil0v3s/feat/resizable-window
[Feat] Make settings window resizable
2 parents 921ea5a + 476bc2f commit 91167d0

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ServerMain.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ fun main(vararg args: String) = singleInstance(args) {
1717
ProcessManager.stop()
1818
})
1919
} else {
20-
}
2120
KeyboardManager.registerKeyboardHook()
21+
}
2222

2323
if (!ApplicationParams.isAutostart) {
2424
ProcessManager.start()

target/desktop/src/main/kotlin/app/cleanmeter/target/desktop/ui/settings/SettingsWindow.kt

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package app.cleanmeter.target.desktop.ui.settings
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.LaunchedEffect
45
import androidx.compose.runtime.getValue
56
import androidx.compose.runtime.mutableStateOf
67
import androidx.compose.runtime.remember
78
import androidx.compose.runtime.setValue
9+
import androidx.compose.runtime.snapshotFlow
810
import androidx.compose.ui.res.painterResource
911
import androidx.compose.ui.unit.DpSize
1012
import androidx.compose.ui.unit.IntOffset
@@ -16,13 +18,21 @@ import androidx.compose.ui.window.rememberWindowState
1618
import app.cleanmeter.target.desktop.data.PREFERENCE_START_MINIMIZED
1719
import app.cleanmeter.target.desktop.data.PreferencesRepository
1820
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
1927

2028
@Composable
2129
fun 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

Comments
 (0)