From 7dd5ade1f5c78cefb995bb27786a4ee3feebf767 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Sat, 12 Apr 2025 09:41:23 +0200 Subject: [PATCH] Add splashscreen. --- .../composeResources/values/strings.xml | 4 +- .../lwa/ui/navigation/screen/MainNavHost.kt | 6 +- .../screen/destination/SplashDestination.kt | 27 +++++++++ .../lwa/ui/screen/campaign/CampaignScreen.kt | 43 ++++++++----- .../player/ribbon/CharacterRibbonViewModel.kt | 12 ++-- .../player/ribbon/npc/NpcRibbonViewModel.kt | 8 ++- .../ribbon/player/PlayerRibbonViewModel.kt | 4 +- .../ui/screen/gamemaster/GameMasterScreen.kt | 4 +- .../lwa/ui/screen/splash/SplashScreen.kt | 60 +++++++++++++++++++ 9 files changed, 138 insertions(+), 30 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/destination/SplashDestination.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/splash/SplashScreen.kt diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 8c72632..1824163 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -6,7 +6,8 @@ La feuille de personnage est introuvable Ok - La table de Lwa + La Table de Lwa + version : %1$s Confirmer Annuler @@ -231,7 +232,6 @@ niv : %1$d - Admin - version : %1$s GameMaster Sauvegarder Filtrer par nom : diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/MainNavHost.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/MainNavHost.kt index e2937b5..dff9597 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/MainNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/MainNavHost.kt @@ -6,7 +6,8 @@ import androidx.compose.runtime.compositionLocalOf import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController -import com.pixelized.desktop.lwa.ui.navigation.screen.destination.MainDestination +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.SplashDestination +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableSplash import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableLevelUp import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableMainPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableSettingsPage @@ -18,7 +19,7 @@ val LocalScreenController = compositionLocalOf { @Composable fun MainNavHost( controller: NavHostController = rememberNavController(), - startDestination: String = MainDestination.navigationRoute(), + startDestination: String = SplashDestination.navigationRoute(), ) { CompositionLocalProvider( LocalScreenController provides controller, @@ -27,6 +28,7 @@ fun MainNavHost( navController = controller, startDestination = startDestination, ) { + composableSplash() composableMainPage() composableSettingsPage() composableLevelUp() diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/destination/SplashDestination.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/destination/SplashDestination.kt new file mode 100644 index 0000000..154651b --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/navigation/screen/destination/SplashDestination.kt @@ -0,0 +1,27 @@ +package com.pixelized.desktop.lwa.ui.navigation.screen.destination + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.compose.composable +import com.pixelized.desktop.lwa.ui.screen.splash.SplashScreen + +object SplashDestination { + private const val ROUTE = "splash" + + fun baseRoute() = ROUTE + fun navigationRoute() = ROUTE +} + +fun NavGraphBuilder.composableSplash() { + composable( + route = SplashDestination.baseRoute(), + ) { + SplashScreen() + } +} + + +fun NavHostController.navigateToSplash() { + val route = SplashDestination.navigationRoute() + navigate(route = route) +} diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt index 3f028f4..e6ab916 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt @@ -90,14 +90,7 @@ fun CampaignScreen( }, main = { - Box( - modifier = Modifier.matchParentSize(), - contentAlignment = Alignment.BottomCenter, - ) { - PortraitOverlay( - modifier = Modifier.padding(all = 8.dp) - ) - } + }, chat = { CampaignChat( @@ -105,6 +98,16 @@ fun CampaignScreen( chatViewModel = campaignChatViewModel, ) }, + overlay = { + Box( + modifier = Modifier.matchParentSize(), + contentAlignment = Alignment.Center, + ) { + PortraitOverlay( + modifier = Modifier.padding(all = 8.dp), + ) + } + }, leftPanel = { PlayerRibbon( modifier = Modifier.fillMaxHeight(), @@ -239,6 +242,7 @@ private fun CampaignLayout( bottom: @Composable () -> Unit, main: @Composable () -> Unit, chat: @Composable () -> Unit, + overlay: @Composable () -> Unit, leftPanel: @Composable () -> Unit, rightPanel: @Composable () -> Unit, leftOverlay: @Composable () -> Unit, @@ -281,7 +285,7 @@ private fun CampaignLayout( Box( modifier = Modifier .align(alignment = Alignment.BottomEnd) - .onSizeChanged { } + .onSizeChanged { chatOverlayState.value = it.toDp(density) }, ) { chat() } @@ -292,13 +296,6 @@ private fun CampaignLayout( ) { leftPanel() } - Box( - modifier = Modifier - .align(alignment = Alignment.CenterStart) - .onSizeChanged { leftOverlayState.value = it.toDp(density) }, - ) { - leftOverlay() - } Box( modifier = Modifier .align(alignment = Alignment.CenterEnd) @@ -306,6 +303,20 @@ private fun CampaignLayout( ) { rightPanel() } + Box( + modifier = Modifier + .align(alignment = Alignment.Center) + .fillMaxSize(), + ) { + overlay() + } + Box( + modifier = Modifier + .align(alignment = Alignment.CenterStart) + .onSizeChanged { leftOverlayState.value = it.toDp(density) }, + ) { + leftOverlay() + } Box( modifier = Modifier .align(alignment = Alignment.CenterEnd) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt index eb1ca0d..155ba74 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonViewModel.kt @@ -50,9 +50,13 @@ abstract class CharacterRibbonViewModel( settings: Settings, ): Boolean - abstract val enableCharacterSheet: Boolean + abstract fun enableCharacterSheet( + settings: Settings, + ): Boolean - abstract val enableCharacterStats: Boolean + abstract fun enableCharacterStats( + settings: Settings, + ): Boolean /** * This flow is a tad complex so there is an explanation of wtf it's about : @@ -82,8 +86,8 @@ abstract class CharacterRibbonViewModel( characterSheet = sheet, alterations = alterations, hideOverruled = hideOverruled, - enableCharacterSheet = enableCharacterSheet || settings.isGameMaster ?: false, - enableCharacterStats = enableCharacterStats || settings.isGameMaster ?: false, + enableCharacterSheet = enableCharacterSheet(settings = settings), + enableCharacterStats = enableCharacterStats(settings = settings), ) } }, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/npc/NpcRibbonViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/npc/NpcRibbonViewModel.kt index ce86bf3..243e88d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/npc/NpcRibbonViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/npc/NpcRibbonViewModel.kt @@ -36,7 +36,11 @@ class NpcRibbonViewModel( return !campaign.options.showNpcs && settings.isGameMaster == true } - override val enableCharacterSheet = false + override fun enableCharacterSheet(settings: Settings) : Boolean { + return settings.isGameMaster ?: false + } - override val enableCharacterStats = false + override fun enableCharacterStats(settings: Settings) : Boolean { + return settings.isGameMaster ?: false + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/player/PlayerRibbonViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/player/PlayerRibbonViewModel.kt index 8eaaec4..97c80c6 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/player/PlayerRibbonViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/player/PlayerRibbonViewModel.kt @@ -36,7 +36,7 @@ class PlayerRibbonViewModel( return !campaign.options.showParty && settings.isGameMaster == true } - override val enableCharacterSheet = true + override fun enableCharacterSheet(settings: Settings) = true - override val enableCharacterStats = true + override fun enableCharacterStats(settings: Settings) = true } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt index 06f3600..361fd53 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt @@ -45,7 +45,7 @@ import com.pixelized.desktop.lwa.ui.theme.lwa import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.game_master__action import lwacharactersheet.composeapp.generated.resources.game_master__title -import lwacharactersheet.composeapp.generated.resources.game_master__version +import lwacharactersheet.composeapp.generated.resources.app_version import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel @@ -95,7 +95,7 @@ private fun GameMasterContent( Text( modifier = Modifier.alignByBaseline(), style = MaterialTheme.lwa.typography.base.caption, - text = stringResource(Res.string.game_master__version, BuildKonfig.version), + text = stringResource(Res.string.app_version, BuildKonfig.version), ) } }, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/splash/SplashScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/splash/SplashScreen.kt new file mode 100644 index 0000000..ccf7f29 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/splash/SplashScreen.kt @@ -0,0 +1,60 @@ +package com.pixelized.desktop.lwa.ui.screen.splash + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.BuildKonfig +import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToMainPage +import com.pixelized.desktop.lwa.ui.theme.lwa +import kotlinx.coroutines.delay +import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.app_name +import lwacharactersheet.composeapp.generated.resources.app_version +import org.jetbrains.compose.resources.stringResource + +@Composable +fun SplashScreen() { + val screen = LocalScreenController.current + + Surface { + SplashContent( + modifier = Modifier + .fillMaxSize() + .padding(all = 16.dp), + ) + } + + LaunchedEffect(Unit) { + delay(3000) + screen.navigateToMainPage() + } +} + +@Composable +private fun SplashContent( + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier, + ) { + Text( + modifier = Modifier.align(Alignment.Center), + style = MaterialTheme.lwa.typography.base.h3, + text = stringResource(Res.string.app_name) + ) + Text( + modifier = Modifier.align(Alignment.BottomEnd), + style = MaterialTheme.lwa.typography.base.caption, + text = stringResource(Res.string.app_version, BuildKonfig.version) + ) + } +} \ No newline at end of file