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,
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)
}
)
},
)

View file

@ -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<CharacterDetailPanelUio>,
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> 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<CharacterDetailHeaderUio?>,
sheet: State<CharacterDetailSheetUio?>,
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,

View file

@ -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}",

View file

@ -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<CharacterDetailHeaderUio?>,
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,

View file

@ -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()
}
}
}

View file

@ -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

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.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(