From c27e4a7f6ffcf0e596cfda027951f4fbb8fd4394 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Tue, 18 Mar 2025 18:24:04 +0100 Subject: [PATCH] Add more strings and improve launcher icon --- .../composeResources/values/strings.xml | 72 ++++++++ .../kotlin/ch/dissem/yaep/ui/common/App.kt | 2 +- .../kotlin/ch/dissem/yaep/ui/common/end.kt | 9 +- .../kotlin/ch/dissem/yaep/ui/common/names.kt | 163 ++++++++++++++++++ .../composeResources/drawable/ic_launcher.svg | 160 +++++++++-------- .../dissem/yaep/ui/desktop/desktop window.kt | 26 ++- 6 files changed, 348 insertions(+), 84 deletions(-) create mode 100644 commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/names.kt diff --git a/commonUI/src/commonMain/composeResources/values/strings.xml b/commonUI/src/commonMain/composeResources/values/strings.xml index 0f55b09..8d0c491 100644 --- a/commonUI/src/commonMain/composeResources/values/strings.xml +++ b/commonUI/src/commonMain/composeResources/values/strings.xml @@ -1,4 +1,76 @@ YAEP Yet Another Einstein Puzzle + Congratulations! You solved the puzzle in %1$s + Restart + + + Zebra + Octopus + Goat + Sloth + Dog + Snail + Ant + + + Ice Cream + Doughnut + Cookie + Cake + Cupcake + Pie + Chocolate + Lollipop + Custard + + + Milk + Wine + Cocktail + Coffee + Tea + Beer + Beverage + + + Banana + Cherries + Grapes + Kiwi + Lemon + Mango + Pear + Pineapple + Strawberry + Watermelon + + + Canadian + Japanese + Norwegian + Spanish + Swedish + Swiss + British + Ukrainian + + + Astronaut + Health_worker + Farmer + Rock_star + Scientist + Software_dev + Firefighter + Teacher + + + Bicycle + Motor Scooter + Skateboard + Taxi + Locomotive + Tram Car + Bus \ No newline at end of file diff --git a/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/App.kt b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/App.kt index 46b68ac..5aab950 100644 --- a/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/App.kt +++ b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/App.kt @@ -101,7 +101,7 @@ fun App(modifier: Modifier = Modifier) { Text(time, fontSize = TextUnit(4f, TextUnitType.Em)) } } - EndOfGame(isSolved = isSolved) { + EndOfGame(isSolved = isSolved, time = time) { game = generateGame() } } diff --git a/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/end.kt b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/end.kt index ed014d7..5185ada 100644 --- a/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/end.kt +++ b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/end.kt @@ -18,11 +18,16 @@ import androidx.compose.ui.graphics.BlurEffect import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.stringResource +import yaep.commonui.generated.resources.Res +import yaep.commonui.generated.resources.restart +import yaep.commonui.generated.resources.solved @Composable fun EndOfGame( modifier: Modifier = Modifier, isSolved: Boolean, + time: String, onRestart: () -> Unit ) { AnimatedVisibility( @@ -43,7 +48,7 @@ fun EndOfGame( .align(Alignment.Center) ) { Text( - text = "You won", + text = stringResource(Res.string.solved, time), fontSize = 128.sp, textAlign = TextAlign.Center, ) @@ -51,7 +56,7 @@ fun EndOfGame( modifier = Modifier.align(CenterHorizontally), onClick = onRestart ) { - Text("Restart") + Text(stringResource(Res.string.restart)) } } } diff --git a/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/names.kt b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/names.kt new file mode 100644 index 0000000..1b21714 --- /dev/null +++ b/commonUI/src/commonMain/kotlin/ch/dissem/yaep/ui/common/names.kt @@ -0,0 +1,163 @@ +package ch.dissem.yaep.ui.common + +import ch.dissem.yaep.domain.Animal +import ch.dissem.yaep.domain.Dessert +import ch.dissem.yaep.domain.Drink +import ch.dissem.yaep.domain.Fruit +import ch.dissem.yaep.domain.ItemClass +import ch.dissem.yaep.domain.Nationality +import ch.dissem.yaep.domain.Profession +import ch.dissem.yaep.domain.Transportation +import org.jetbrains.compose.resources.StringResource +import yaep.commonui.generated.resources.Res +import yaep.commonui.generated.resources.ant +import yaep.commonui.generated.resources.astronaut +import yaep.commonui.generated.resources.banana +import yaep.commonui.generated.resources.beer +import yaep.commonui.generated.resources.beverage +import yaep.commonui.generated.resources.bicycle +import yaep.commonui.generated.resources.british +import yaep.commonui.generated.resources.bus +import yaep.commonui.generated.resources.cake +import yaep.commonui.generated.resources.canadian +import yaep.commonui.generated.resources.cherries +import yaep.commonui.generated.resources.chocolate +import yaep.commonui.generated.resources.cocktail +import yaep.commonui.generated.resources.coffee +import yaep.commonui.generated.resources.cookie +import yaep.commonui.generated.resources.cupcake +import yaep.commonui.generated.resources.custard +import yaep.commonui.generated.resources.dog +import yaep.commonui.generated.resources.doughnut +import yaep.commonui.generated.resources.farmer +import yaep.commonui.generated.resources.firefighter +import yaep.commonui.generated.resources.goat +import yaep.commonui.generated.resources.grapes +import yaep.commonui.generated.resources.health_worker +import yaep.commonui.generated.resources.ice_cream +import yaep.commonui.generated.resources.japanese +import yaep.commonui.generated.resources.kiwi +import yaep.commonui.generated.resources.lemon +import yaep.commonui.generated.resources.locomotive +import yaep.commonui.generated.resources.lollipop +import yaep.commonui.generated.resources.mango +import yaep.commonui.generated.resources.milk +import yaep.commonui.generated.resources.motor_scooter +import yaep.commonui.generated.resources.norwegian +import yaep.commonui.generated.resources.octopus +import yaep.commonui.generated.resources.pear +import yaep.commonui.generated.resources.pie +import yaep.commonui.generated.resources.pineapple +import yaep.commonui.generated.resources.rock_star +import yaep.commonui.generated.resources.scientist +import yaep.commonui.generated.resources.skateboard +import yaep.commonui.generated.resources.sloth +import yaep.commonui.generated.resources.snail +import yaep.commonui.generated.resources.software_dev +import yaep.commonui.generated.resources.spanish +import yaep.commonui.generated.resources.strawberry +import yaep.commonui.generated.resources.swedish +import yaep.commonui.generated.resources.swiss +import yaep.commonui.generated.resources.taxi +import yaep.commonui.generated.resources.tea +import yaep.commonui.generated.resources.teacher +import yaep.commonui.generated.resources.tram_car +import yaep.commonui.generated.resources.ukrainian +import yaep.commonui.generated.resources.watermelon +import yaep.commonui.generated.resources.wine +import yaep.commonui.generated.resources.zebra + +val ItemClass<*>.localName: StringResource + get() = when (this) { + is Animal -> this.stringResource + is Dessert -> this.stringResource + is Drink -> this.stringResource + is Fruit -> this.stringResource + is Nationality -> this.stringResource + is Profession -> this.stringResource + is Transportation -> this.stringResource + } + +private val Animal.stringResource: StringResource + get() = when (this) { + Animal.ZEBRA -> Res.string.zebra + Animal.OCTOPUS -> Res.string.octopus + Animal.GOAT -> Res.string.goat + Animal.SLOTH -> Res.string.sloth + Animal.DOG -> Res.string.dog + Animal.SNAIL -> Res.string.snail + Animal.ANT -> Res.string.ant + } + +private val Dessert.stringResource: StringResource + get() = when (this) { + Dessert.ICE_CREAM -> Res.string.ice_cream + Dessert.DOUGHNUT -> Res.string.doughnut + Dessert.COOKIE -> Res.string.cookie + Dessert.CAKE -> Res.string.cake + Dessert.CUPCAKE -> Res.string.cupcake + Dessert.PIE -> Res.string.pie + Dessert.CHOCOLATE -> Res.string.chocolate + Dessert.LOLLIPOP -> Res.string.lollipop + Dessert.CUSTARD -> Res.string.custard + } + +private val Drink.stringResource: StringResource + get() = when (this) { + Drink.MILK -> Res.string.milk + Drink.WINE -> Res.string.wine + Drink.COCKTAIL -> Res.string.cocktail + Drink.COFFEE -> Res.string.coffee + Drink.TEA -> Res.string.tea + Drink.BEER -> Res.string.beer + Drink.BEVERAGE -> Res.string.beverage + } + +private val Fruit.stringResource: StringResource + get() = when (this) { + Fruit.BANANA -> Res.string.banana + Fruit.CHERRIES -> Res.string.cherries + Fruit.GRAPES -> Res.string.grapes + Fruit.KIWI -> Res.string.kiwi + Fruit.LEMON -> Res.string.lemon + Fruit.MANGO -> Res.string.mango + Fruit.PEAR -> Res.string.pear + Fruit.PINEAPPLE -> Res.string.pineapple + Fruit.STRAWBERRY -> Res.string.strawberry + Fruit.WATERMELON -> Res.string.watermelon + } + +private val Nationality.stringResource: StringResource + get() = when (this) { + Nationality.CANADA -> Res.string.canadian + Nationality.JAPAN -> Res.string.japanese + Nationality.NORWAY -> Res.string.norwegian + Nationality.SPAIN -> Res.string.spanish + Nationality.SWEDEN -> Res.string.swedish + Nationality.SWITZERLAND -> Res.string.swiss + Nationality.UNITED_KINGDOM -> Res.string.british + Nationality.UKRAINE -> Res.string.ukrainian + } + +private val Profession.stringResource: StringResource + get() = when (this) { + Profession.ASTRONAUT -> Res.string.astronaut + Profession.HEALTH_WORKER -> Res.string.health_worker + Profession.FARMER -> Res.string.farmer + Profession.ROCK_STAR -> Res.string.rock_star + Profession.SCIENTIST -> Res.string.scientist + Profession.SOFTWARE_DEV -> Res.string.software_dev + Profession.FIREFIGHTER -> Res.string.firefighter + Profession.TEACHER -> Res.string.teacher + } + +private val Transportation.stringResource: StringResource + get() = when (this) { + Transportation.BICYCLE -> Res.string.bicycle + Transportation.MOTOR_SCOOTER -> Res.string.motor_scooter + Transportation.SKATEBOARD -> Res.string.skateboard + Transportation.TAXI -> Res.string.taxi + Transportation.LOCOMOTIVE -> Res.string.locomotive + Transportation.TRAM_CAR -> Res.string.tram_car + Transportation.BUS -> Res.string.bus + } \ No newline at end of file diff --git a/desktop/src/main/composeResources/drawable/ic_launcher.svg b/desktop/src/main/composeResources/drawable/ic_launcher.svg index cfe3871..f98f17b 100644 --- a/desktop/src/main/composeResources/drawable/ic_launcher.svg +++ b/desktop/src/main/composeResources/drawable/ic_launcher.svg @@ -6,23 +6,24 @@ id="Layer_2" x="0px" y="0px" - viewBox="0 0 128 128" - style="enable-background:new 0 0 128 128;" + viewBox="0 0 32 32" xml:space="preserve" - sodipodi:docname="app_icon.svg" + sodipodi:docname="ic_launcher.svg" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" + width="32" + height="32" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + diff --git a/desktop/src/main/kotlin/ch/dissem/yaep/ui/desktop/desktop window.kt b/desktop/src/main/kotlin/ch/dissem/yaep/ui/desktop/desktop window.kt index 63acdd5..08cce0a 100644 --- a/desktop/src/main/kotlin/ch/dissem/yaep/ui/desktop/desktop window.kt +++ b/desktop/src/main/kotlin/ch/dissem/yaep/ui/desktop/desktop window.kt @@ -1,5 +1,7 @@ +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.window.WindowDraggableArea @@ -13,6 +15,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable 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 @@ -20,14 +23,15 @@ import androidx.compose.ui.window.WindowState 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.Res import yaep.commonui.generated.resources.app_name_full -import yaep.commonui.generated.resources.lightbulb import yaep.commonui.generated.resources.moon import yaep.commonui.generated.resources.sun import yaep.commonui.generated.resources.window_close import yaep.commonui.generated.resources.window_maximize import yaep.commonui.generated.resources.window_minimize +import yaep.desktop.generated.resources.ic_launcher +import yaep.commonui.generated.resources.Res as CRes +import yaep.desktop.generated.resources.Res as DRes @Composable fun WindowScope.DesktopWindow( @@ -58,9 +62,13 @@ fun AppBar( ) { TopAppBar( navigationIcon = { - Icon(painterResource(Res.drawable.lightbulb), null) + Image( + painter = painterResource(DRes.drawable.ic_launcher), + contentDescription = null, + modifier = Modifier.aspectRatio(1f).scale(0.5f), + ) }, - title = { Text(text = stringResource(Res.string.app_name_full)) }, + title = { Text(text = stringResource(CRes.string.app_name_full)) }, actions = { Switch( checked = useDarkMode, @@ -69,9 +77,9 @@ fun AppBar( Icon( painter = painterResource( if (useDarkMode) { - Res.drawable.sun + CRes.drawable.sun } else { - Res.drawable.moon + CRes.drawable.moon } ), contentDescription = null, @@ -84,7 +92,7 @@ fun AppBar( onClick = { windowState.isMinimized = !windowState.isMinimized } ) { Icon( - painter = painterResource(Res.drawable.window_minimize), + painter = painterResource(CRes.drawable.window_minimize), contentDescription = null, modifier = Modifier.size(SwitchDefaults.IconSize), ) @@ -97,7 +105,7 @@ fun AppBar( } ) { Icon( - painter = painterResource(Res.drawable.window_maximize), + painter = painterResource(CRes.drawable.window_maximize), contentDescription = null, modifier = Modifier.size(SwitchDefaults.IconSize), ) @@ -106,7 +114,7 @@ fun AppBar( onClick = onCloseRequest ) { Icon( - painter = painterResource(Res.drawable.window_close), + painter = painterResource(CRes.drawable.window_close), contentDescription = null, modifier = Modifier.size(SwitchDefaults.IconSize), )