Add restart option

This commit is contained in:
Christian Basler
2025-04-29 06:00:34 +02:00
parent d02043bbdb
commit f8d7702fca
6 changed files with 65 additions and 11 deletions

View File

@@ -1,3 +1,5 @@
package ch.dissem.yaep.ui.desktop
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
@@ -14,17 +16,25 @@ import androidx.compose.material3.SwitchDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.WindowScope
import androidx.compose.ui.window.WindowState
import ch.dissem.yaep.domain.Game
import ch.dissem.yaep.ui.common.theme.AppTheme
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import yaep.commonui.generated.resources.action_restart
import yaep.commonui.generated.resources.app_name_full
import yaep.commonui.generated.resources.moon
import yaep.commonui.generated.resources.restart
import yaep.commonui.generated.resources.sun
import yaep.commonui.generated.resources.window_close
import yaep.commonui.generated.resources.window_maximize
@@ -58,8 +68,17 @@ fun AppBar(
useDarkMode: Boolean,
setDarkMode: (Boolean) -> Unit,
onCloseRequest: () -> Unit,
onRestart: () -> Unit,
windowState: WindowState,
game: Game,
) {
var gameSolved by remember { mutableStateOf(false) }
LaunchedEffect(game) {
game.onSolved {
gameSolved = true
}
}
TopAppBar(
navigationIcon = {
Image(
@@ -70,6 +89,16 @@ fun AppBar(
},
title = { Text(text = stringResource(CRes.string.app_name_full)) },
actions = {
IconButton(
onClick = onRestart
) {
Icon(
painter = painterResource(CRes.drawable.action_restart),
contentDescription = stringResource(CRes.string.restart),
modifier = Modifier.size(SwitchDefaults.IconSize),
)
}
Spacer(Modifier.width(8.dp))
Switch(
checked = useDarkMode,
onCheckedChange = setDarkMode,
@@ -98,6 +127,7 @@ fun AppBar(
)
}
IconButton(
enabled = !gameSolved,
onClick = {
windowState.placement =
if (windowState.placement == WindowPlacement.Maximized)

View File

@@ -14,8 +14,12 @@ import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import ch.dissem.yaep.domain.Game
import ch.dissem.yaep.domain.generateGame
import ch.dissem.yaep.ui.common.App
import ch.dissem.yaep.ui.common.theme.emojiFontFamily
import ch.dissem.yaep.ui.desktop.AppBar
import ch.dissem.yaep.ui.desktop.DesktopWindow
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import yaep.commonui.generated.resources.app_name
@@ -35,6 +39,7 @@ fun main() = application {
placement = WindowPlacement.Floating,
size = DpSize(1200.dp, 800.dp)
)
var game by remember { mutableStateOf<Game>(generateGame()) }
Window(
onCloseRequest = ::exitApplication,
@@ -44,6 +49,7 @@ fun main() = application {
icon = painterResource(DRes.drawable.ic_launcher)
) {
var useDarkMode by remember { mutableStateOf(true) }
var resetCluesBeacon by remember { mutableStateOf(Any()) }
DesktopWindow(
useDarkMode = useDarkMode,
topBar = {
@@ -51,11 +57,21 @@ fun main() = application {
useDarkMode = useDarkMode,
setDarkMode = { useDarkMode = it },
onCloseRequest = ::exitApplication,
windowState = windowState
onRestart = {
do while (game.grid.undo());
resetCluesBeacon = Any()
},
windowState = windowState,
game = game,
)
}
) {
App(modifier = Modifier.padding(it))
App(
modifier = Modifier.padding(it),
game = game,
onNewGame = { game = generateGame() },
resetCluesBeacon = resetCluesBeacon
)
}
}
}