From 9588a3bfafd2b8bd45028ef8a3b060fedf8cf677 Mon Sep 17 00:00:00 2001 From: "Andres Gomez, Thomas (ITDV RL)" Date: Sat, 12 Apr 2025 10:58:05 +0200 Subject: [PATCH] Add LevelUp feature for the NPC and to the GM screens. --- .../lwa/ui/screen/campaign/CampaignScreen.kt | 8 ++++++- .../campaign/player/detail/CharacterDetail.kt | 6 +++++ .../player/detail/CharacterDetailFactory.kt | 1 + .../detail/header/CharacterDetailHeader.kt | 24 +++++++++++++++---- .../ui/screen/gamemaster/GameMasterNavHost.kt | 3 +++ .../ui/screen/gamemaster/GameMasterScreen.kt | 1 + .../character/list/GMCharacterPage.kt | 6 +++++ 7 files changed, 44 insertions(+), 5 deletions(-) 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 e6ab916..12ad9ed 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 @@ -133,6 +133,9 @@ fun CampaignScreen( characterDiminishedViewModel = dismissedViewModel, characteristicDialogViewModel = characteristicDialogViewModel, alterationViewModel = alterationViewModel, + onLevelUp = { + screen.navigateToLevelScreen(characterSheetId = it) + } ) }, rightPanel = { @@ -144,7 +147,7 @@ fun CampaignScreen( } }, onLevelUp = { - + screen.navigateToLevelScreen(characterSheetId = it) } ) }, @@ -160,6 +163,9 @@ fun CampaignScreen( characterDiminishedViewModel = dismissedViewModel, characteristicDialogViewModel = characteristicDialogViewModel, alterationViewModel = alterationViewModel, + onLevelUp = { + screen.navigateToLevelScreen(characterSheetId = it) + } ) }, ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt index 7b33086..4eef888 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetail.kt @@ -64,6 +64,7 @@ fun CharacterDetailPanel( characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel, characterDiminishedViewModel: CharacterSheetDiminishedDialogViewModel, alterationViewModel: CharacterSheetAlterationDialogViewModel, + onLevelUp: (String) -> Unit, ) { val roll = LocalRollHostState.current val scope = rememberCoroutineScope() @@ -76,6 +77,7 @@ fun CharacterDetailPanel( onDismissRequest = { detailViewModel.hideCharacter() }, + onLevelUp = onLevelUp, onAlteration = { blurController.show() alterationViewModel.show(characterSheetId = it) @@ -147,6 +149,7 @@ fun CharacterDetailAnimatedPanel( detail: State, transitionSpec: AnimatedContentTransitionScope.() -> ContentTransform, onDismissRequest: (characterSheetId: String) -> Unit, + onLevelUp: (characterSheetId: String) -> Unit, onAlteration: (characterSheetId: String) -> Unit, onDiminished: (characterSheetId: String) -> Unit, onHp: (characterSheetId: String) -> Unit, @@ -179,6 +182,7 @@ fun CharacterDetailAnimatedPanel( header = it.header.collectAsState(), sheet = it.sheet.collectAsState(), onDismissRequest = { onDismissRequest(it.characterSheetId) }, + onLevelUp = { onLevelUp(it.characterSheetId) }, onAlteration = { onAlteration(it.characterSheetId) }, onDiminished = { onDiminished(it.characterSheetId) }, onHp = { onHp(it.characterSheetId) }, @@ -202,6 +206,7 @@ fun CharacterDetailContent( shape: Shape = MaterialTheme.lwa.shapes.panel, header: State, sheet: State, + onLevelUp: () -> Unit, onAlteration: () -> Unit, onDismissRequest: () -> Unit, onDiminished: () -> Unit, @@ -226,6 +231,7 @@ fun CharacterDetailContent( .fillMaxWidth(), header = header, onDismissRequest = onDismissRequest, + onLevelUp = onLevelUp, onAlteration = onAlteration, onDiminished = onDiminished, onHp = onHp, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt index 7419247..70e976e 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailFactory.kt @@ -74,6 +74,7 @@ class CharacterDetailFactory( portrait = alteredCharacterSheet.portrait, diminished = alteredCharacterSheet.diminished, alteration = settings.isAdmin ?: false, + levelUp = alteredCharacterSheet.shouldLevelUp, name = alteredCharacterSheet.name, level = alteredCharacterSheet.level, hp = "${maxHp - alteredCharacterSheet.damage}", diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt index 363f25d..b428d95 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/header/CharacterDetailHeader.kt @@ -34,24 +34,25 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.ui.composable.shapes.ArrowShape import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipLayout import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction import com.pixelized.desktop.lwa.ui.theme.lwa import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.character_sheet__level +import lwacharactersheet.composeapp.generated.resources.ic_azm_24dp +import lwacharactersheet.composeapp.generated.resources.ic_blur_on_24dp import lwacharactersheet.composeapp.generated.resources.ic_close_24dp import lwacharactersheet.composeapp.generated.resources.ic_cognition_24dp +import lwacharactersheet.composeapp.generated.resources.ic_directions_run_24dp import lwacharactersheet.composeapp.generated.resources.ic_heart_24dp import lwacharactersheet.composeapp.generated.resources.ic_heart_plus_24dp +import lwacharactersheet.composeapp.generated.resources.ic_pan_tool_24dp import lwacharactersheet.composeapp.generated.resources.ic_shield_24dp import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp import lwacharactersheet.composeapp.generated.resources.ic_water_drop_24dp -import lwacharactersheet.composeapp.generated.resources.ic_pan_tool_24dp -import lwacharactersheet.composeapp.generated.resources.ic_azm_24dp -import lwacharactersheet.composeapp.generated.resources.ic_blur_on_24dp -import lwacharactersheet.composeapp.generated.resources.ic_directions_run_24dp import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -61,6 +62,7 @@ data class CharacterDetailHeaderUio( val portrait: String?, val diminished: Int, val alteration: Boolean, + val levelUp: Boolean, val name: String, val level: Int, val hp: String, @@ -93,6 +95,7 @@ fun CharacterDetailHeader( iconSize: Dp = MaterialTheme.lwa.size.sheet.subCategory, header: State, onDismissRequest: () -> Unit, + onLevelUp: () -> Unit, onAlteration: () -> Unit, onDiminished: () -> Unit, onHp: () -> Unit, @@ -143,6 +146,19 @@ fun CharacterDetailHeader( ) } } + AnimatedVisibility( + visible = header.value?.levelUp == true, + enter = fadeIn(), + exit = fadeOut(), + ) { + IconButton( + onClick = onLevelUp, + ) { + ArrowShape( + color = MaterialTheme.lwa.colorScheme.portrait.levelUp, + ) + } + } Box { IconButton( onClick = onDiminished, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterNavHost.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterNavHost.kt index 271be5b..26d9613 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterNavHost.kt @@ -10,6 +10,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableLevelUp import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.GameMasterDestination import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterItemEditPage @@ -38,6 +39,8 @@ fun GameMasterNavHost() { composableGameMasterMainPage() composableGameMasterAlterationEditPage() composableGameMasterItemEditPage() + + composableLevelUp() } } } 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 361fd53..85babfa 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 @@ -28,6 +28,7 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.pixelized.desktop.lwa.BuildKonfig +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.composableLevelUp import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.GMActionDestination import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterPage.kt index 526f2f3..eb9a50f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/character/list/GMCharacterPage.kt @@ -42,6 +42,8 @@ import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterShe import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio +import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController +import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToLevelScreen import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToCharacterSheetEdit import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanel import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel @@ -66,6 +68,7 @@ fun GMCharacterPage( alterationViewModel: CharacterSheetAlterationDialogViewModel = koinViewModel(), ) { val windows = LocalWindowController.current + val screens = LocalScreenController.current val blurController = LocalBlurController.current val scope = rememberCoroutineScope() @@ -114,6 +117,9 @@ fun GMCharacterPage( characterDiminishedViewModel = dismissedViewModel, characteristicDialogViewModel = characteristicDialogViewModel, alterationViewModel = alterationViewModel, + onLevelUp = { + screens.navigateToLevelScreen(characterSheetId = it) + }, ) CharacterSheetCharacteristicDialog(