feat: [WINDOW] enlarge window size (#53)

* feat: [WINDOW] enlarge window size

* persist size and position

* refactored

---------

Co-authored-by: Florent Champigny <florent@bere.al>
This commit is contained in:
Florent CHAMPIGNY 2025-08-05 09:27:36 +02:00 committed by GitHub
parent 293c7f805e
commit af9d975123
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 105 additions and 6 deletions

View file

@ -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()
}

View file

@ -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

View file

@ -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
)
}

View file

@ -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,
)

View file

@ -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<WindowStateData>(state))
} catch (t: Throwable) {
t.printStackTrace()
}
}
fun load(): WindowStateData? {
return try {
settings.getStringOrNull("window")?.let { json ->
Json.decodeFromString<WindowStateData>(json)
}
} catch (t: Throwable) {
t.printStackTrace()
null
}
}
}