Add LevelUp feature for the NPC and to the GM screens.

This commit is contained in:
Andres Gomez, Thomas (ITDV RL) 2025-04-12 10:58:05 +02:00
parent a55753494f
commit 9588a3bfaf
7 changed files with 44 additions and 5 deletions

View file

@ -133,6 +133,9 @@ fun CampaignScreen(
characterDiminishedViewModel = dismissedViewModel, characterDiminishedViewModel = dismissedViewModel,
characteristicDialogViewModel = characteristicDialogViewModel, characteristicDialogViewModel = characteristicDialogViewModel,
alterationViewModel = alterationViewModel, alterationViewModel = alterationViewModel,
onLevelUp = {
screen.navigateToLevelScreen(characterSheetId = it)
}
) )
}, },
rightPanel = { rightPanel = {
@ -144,7 +147,7 @@ fun CampaignScreen(
} }
}, },
onLevelUp = { onLevelUp = {
screen.navigateToLevelScreen(characterSheetId = it)
} }
) )
}, },
@ -160,6 +163,9 @@ fun CampaignScreen(
characterDiminishedViewModel = dismissedViewModel, characterDiminishedViewModel = dismissedViewModel,
characteristicDialogViewModel = characteristicDialogViewModel, characteristicDialogViewModel = characteristicDialogViewModel,
alterationViewModel = alterationViewModel, alterationViewModel = alterationViewModel,
onLevelUp = {
screen.navigateToLevelScreen(characterSheetId = it)
}
) )
}, },
) )

View file

@ -64,6 +64,7 @@ fun CharacterDetailPanel(
characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel, characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel,
characterDiminishedViewModel: CharacterSheetDiminishedDialogViewModel, characterDiminishedViewModel: CharacterSheetDiminishedDialogViewModel,
alterationViewModel: CharacterSheetAlterationDialogViewModel, alterationViewModel: CharacterSheetAlterationDialogViewModel,
onLevelUp: (String) -> Unit,
) { ) {
val roll = LocalRollHostState.current val roll = LocalRollHostState.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
@ -76,6 +77,7 @@ fun CharacterDetailPanel(
onDismissRequest = { onDismissRequest = {
detailViewModel.hideCharacter() detailViewModel.hideCharacter()
}, },
onLevelUp = onLevelUp,
onAlteration = { onAlteration = {
blurController.show() blurController.show()
alterationViewModel.show(characterSheetId = it) alterationViewModel.show(characterSheetId = it)
@ -147,6 +149,7 @@ fun CharacterDetailAnimatedPanel(
detail: State<CharacterDetailPanelUio>, detail: State<CharacterDetailPanelUio>,
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform, transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform,
onDismissRequest: (characterSheetId: String) -> Unit, onDismissRequest: (characterSheetId: String) -> Unit,
onLevelUp: (characterSheetId: String) -> Unit,
onAlteration: (characterSheetId: String) -> Unit, onAlteration: (characterSheetId: String) -> Unit,
onDiminished: (characterSheetId: String) -> Unit, onDiminished: (characterSheetId: String) -> Unit,
onHp: (characterSheetId: String) -> Unit, onHp: (characterSheetId: String) -> Unit,
@ -179,6 +182,7 @@ fun CharacterDetailAnimatedPanel(
header = it.header.collectAsState(), header = it.header.collectAsState(),
sheet = it.sheet.collectAsState(), sheet = it.sheet.collectAsState(),
onDismissRequest = { onDismissRequest(it.characterSheetId) }, onDismissRequest = { onDismissRequest(it.characterSheetId) },
onLevelUp = { onLevelUp(it.characterSheetId) },
onAlteration = { onAlteration(it.characterSheetId) }, onAlteration = { onAlteration(it.characterSheetId) },
onDiminished = { onDiminished(it.characterSheetId) }, onDiminished = { onDiminished(it.characterSheetId) },
onHp = { onHp(it.characterSheetId) }, onHp = { onHp(it.characterSheetId) },
@ -202,6 +206,7 @@ fun CharacterDetailContent(
shape: Shape = MaterialTheme.lwa.shapes.panel, shape: Shape = MaterialTheme.lwa.shapes.panel,
header: State<CharacterDetailHeaderUio?>, header: State<CharacterDetailHeaderUio?>,
sheet: State<CharacterDetailSheetUio?>, sheet: State<CharacterDetailSheetUio?>,
onLevelUp: () -> Unit,
onAlteration: () -> Unit, onAlteration: () -> Unit,
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
onDiminished: () -> Unit, onDiminished: () -> Unit,
@ -226,6 +231,7 @@ fun CharacterDetailContent(
.fillMaxWidth(), .fillMaxWidth(),
header = header, header = header,
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
onLevelUp = onLevelUp,
onAlteration = onAlteration, onAlteration = onAlteration,
onDiminished = onDiminished, onDiminished = onDiminished,
onHp = onHp, onHp = onHp,

View file

@ -74,6 +74,7 @@ class CharacterDetailFactory(
portrait = alteredCharacterSheet.portrait, portrait = alteredCharacterSheet.portrait,
diminished = alteredCharacterSheet.diminished, diminished = alteredCharacterSheet.diminished,
alteration = settings.isAdmin ?: false, alteration = settings.isAdmin ?: false,
levelUp = alteredCharacterSheet.shouldLevelUp,
name = alteredCharacterSheet.name, name = alteredCharacterSheet.name,
level = alteredCharacterSheet.level, level = alteredCharacterSheet.level,
hp = "${maxHp - alteredCharacterSheet.damage}", hp = "${maxHp - alteredCharacterSheet.damage}",

View file

@ -34,24 +34,25 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
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.TooltipLayout
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio
import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction
import com.pixelized.desktop.lwa.ui.theme.lwa import com.pixelized.desktop.lwa.ui.theme.lwa
import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.Res
import lwacharactersheet.composeapp.generated.resources.character_sheet__level 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_close_24dp
import lwacharactersheet.composeapp.generated.resources.ic_cognition_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_24dp
import lwacharactersheet.composeapp.generated.resources.ic_heart_plus_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_shield_24dp
import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp
import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp
import lwacharactersheet.composeapp.generated.resources.ic_water_drop_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.painterResource
import org.jetbrains.compose.resources.stringResource import org.jetbrains.compose.resources.stringResource
@ -61,6 +62,7 @@ data class CharacterDetailHeaderUio(
val portrait: String?, val portrait: String?,
val diminished: Int, val diminished: Int,
val alteration: Boolean, val alteration: Boolean,
val levelUp: Boolean,
val name: String, val name: String,
val level: Int, val level: Int,
val hp: String, val hp: String,
@ -93,6 +95,7 @@ fun CharacterDetailHeader(
iconSize: Dp = MaterialTheme.lwa.size.sheet.subCategory, iconSize: Dp = MaterialTheme.lwa.size.sheet.subCategory,
header: State<CharacterDetailHeaderUio?>, header: State<CharacterDetailHeaderUio?>,
onDismissRequest: () -> Unit, onDismissRequest: () -> Unit,
onLevelUp: () -> Unit,
onAlteration: () -> Unit, onAlteration: () -> Unit,
onDiminished: () -> Unit, onDiminished: () -> Unit,
onHp: () -> 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 { Box {
IconButton( IconButton(
onClick = onDiminished, onClick = onDiminished,

View file

@ -10,6 +10,7 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController 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.GameMasterDestination
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterItemEditPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterItemEditPage
@ -38,6 +39,8 @@ fun GameMasterNavHost() {
composableGameMasterMainPage() composableGameMasterMainPage()
composableGameMasterAlterationEditPage() composableGameMasterAlterationEditPage()
composableGameMasterItemEditPage() composableGameMasterItemEditPage()
composableLevelUp()
} }
} }
} }

View file

@ -28,6 +28,7 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.pixelized.desktop.lwa.BuildKonfig 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.GMActionDestination
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage

View file

@ -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.character.diminished.CharacterSheetDiminishedDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio 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.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.CharacterDetailPanel
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
@ -66,6 +68,7 @@ fun GMCharacterPage(
alterationViewModel: CharacterSheetAlterationDialogViewModel = koinViewModel(), alterationViewModel: CharacterSheetAlterationDialogViewModel = koinViewModel(),
) { ) {
val windows = LocalWindowController.current val windows = LocalWindowController.current
val screens = LocalScreenController.current
val blurController = LocalBlurController.current val blurController = LocalBlurController.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
@ -114,6 +117,9 @@ fun GMCharacterPage(
characterDiminishedViewModel = dismissedViewModel, characterDiminishedViewModel = dismissedViewModel,
characteristicDialogViewModel = characteristicDialogViewModel, characteristicDialogViewModel = characteristicDialogViewModel,
alterationViewModel = alterationViewModel, alterationViewModel = alterationViewModel,
onLevelUp = {
screens.navigateToLevelScreen(characterSheetId = it)
},
) )
CharacterSheetCharacteristicDialog( CharacterSheetCharacteristicDialog(