diff --git a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/Main.kt b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/Main.kt index 78f0dbc3..7d082bf3 100644 --- a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/Main.kt +++ b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/Main.kt @@ -1,7 +1,9 @@ package io.github.openflocon.flocondesktop +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Window @@ -13,6 +15,12 @@ import coil3.compose.setSingletonImageLoaderFactory import coil3.network.ktor3.KtorNetworkFetcherFactory import flocondesktop.composeapp.generated.resources.Res import flocondesktop.composeapp.generated.resources.app_icon_small +import io.github.openflocon.flocondesktop.window.MIN_WINDOW_HEIGHT +import io.github.openflocon.flocondesktop.window.MIN_WINDOW_WIDTH +import io.github.openflocon.flocondesktop.window.WindowStateData +import io.github.openflocon.flocondesktop.window.WindowStateSaver +import io.github.openflocon.flocondesktop.window.size +import io.github.openflocon.flocondesktop.window.windowPosition import org.jetbrains.compose.resources.painterResource import java.awt.Dimension @@ -25,16 +33,36 @@ fun main() = application { add(KtorNetworkFetcherFactory()) }.build() } + + val savedState = remember { + WindowStateSaver.load() + } + + val windowState = rememberWindowState( + size = savedState.size(), + position = savedState.windowPosition() + ) + Window( - onCloseRequest = ::exitApplication, + state = windowState, + onCloseRequest = { + val currentSize = windowState.size + val currentPosition = windowState.position + WindowStateSaver.save( + WindowStateData( + width = currentSize.width.value.toInt(), + height = currentSize.height.value.toInt(), + x = currentPosition.x.value.toInt(), + y = currentPosition.y.value.toInt(), + ) + ) + + exitApplication() + }, title = "Flocon", icon = painterResource(Res.drawable.app_icon_small), // Remove black behind icon - state = rememberWindowState( - size = DpSize(width = 1200.dp, height = 800.dp), // DĂ©finir la taille de la fenĂȘtre ici - position = WindowPosition(Alignment.Center), - ), ) { - window.minimumSize = Dimension(1200, 800) + window.minimumSize = Dimension(MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT) App() } diff --git a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowConst.kt b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowConst.kt new file mode 100644 index 00000000..6ad9f918 --- /dev/null +++ b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowConst.kt @@ -0,0 +1,6 @@ +package io.github.openflocon.flocondesktop.window + +const val DEFAULT_WINDOW_WIDTH = 1550 // ~80* of fullhd 1920 +const val DEFAULT_WINDOW_HEIGHT = 900 // ~80* of fullhd 1920 +const val MIN_WINDOW_WIDTH = 1200 +const val MIN_WINDOW_HEIGHT = 800 diff --git a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowExt.kt b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowExt.kt new file mode 100644 index 00000000..e515b6c3 --- /dev/null +++ b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowExt.kt @@ -0,0 +1,26 @@ +package io.github.openflocon.flocondesktop.window + +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.WindowPosition +import java.awt.Toolkit +import kotlin.math.min + + +fun WindowStateData?.windowPosition() = this?.let { WindowPosition(x.dp, y.dp) } ?: WindowPosition.PlatformDefault +fun WindowStateData?.size() : DpSize { + val screenSize = Toolkit.getDefaultToolkit().screenSize + + val width = this?.width?.dp ?: min( + DEFAULT_WINDOW_WIDTH, + screenSize.width + ).dp + val height = this?.height?.dp ?: min( + DEFAULT_WINDOW_HEIGHT, + screenSize.height + ).dp + + return DpSize( + width = width, height = height + ) +} diff --git a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateData.kt b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateData.kt new file mode 100644 index 00000000..70d9d0de --- /dev/null +++ b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateData.kt @@ -0,0 +1,11 @@ +package io.github.openflocon.flocondesktop.window + +import kotlinx.serialization.Serializable + +@Serializable +data class WindowStateData( + val width: Int, + val height: Int, + val x: Int, + val y: Int, +) diff --git a/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateSaver.kt b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateSaver.kt new file mode 100644 index 00000000..496b4388 --- /dev/null +++ b/FloconDesktop/composeApp/src/desktopMain/kotlin/io/github/openflocon/flocondesktop/window/WindowStateSaver.kt @@ -0,0 +1,28 @@ +package io.github.openflocon.flocondesktop.window + +import io.github.openflocon.flocondesktop.core.data.settings.datasource.local.createSettings +import kotlinx.serialization.json.Json + +object WindowStateSaver { + + val settings = createSettings() + + fun save(state: WindowStateData) { + try { + settings.putString("window", Json.encodeToString(state)) + } catch (t: Throwable) { + t.printStackTrace() + } + } + + fun load(): WindowStateData? { + return try { + settings.getStringOrNull("window")?.let { json -> + Json.decodeFromString(json) + } + } catch (t: Throwable) { + t.printStackTrace() + null + } + } +}