From 05a6b496cb5d7a5fc69ae53a8595d9c338170913 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Thu, 8 May 2025 14:38:24 +0200 Subject: [PATCH] Add the icon to the alteration edit page. --- .../composeResources/values/strings.xml | 1 + .../player/ribbon/CharacterRibbonFactory.kt | 4 ++- .../common/CharacterRibbonAlteration.kt | 34 +++++++++++++------ .../edit/GMAlterationEditFactory.kt | 22 ++++++++---- .../alteration/edit/GMAlterationEditPage.kt | 11 ++++++ .../edit/GMAlterationEditViewModel.kt | 3 +- .../lwa/ui/screen/levelup/LevelUpFactory.kt | 6 ++-- .../shared/lwa/model/alteration/Alteration.kt | 1 + .../model/alteration/AlterationJsonFactory.kt | 2 ++ .../lwa/model/alteration/AlterationJsonV1.kt | 1 + 10 files changed, 63 insertions(+), 22 deletions(-) diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index 2027681..f9e12cf 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -305,6 +305,7 @@ Identifiant de l'altération Nom Description + Icône Tags Identifiant du champ Expression diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonFactory.kt index 556be2a..569e95b 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbonFactory.kt @@ -9,6 +9,8 @@ import com.pixelized.shared.lwa.model.alteration.Alteration import com.pixelized.shared.lwa.model.alteration.FieldAlteration import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet +private const val DEFAULT_ICON = "https://bg3.wiki/w/images/a/af/Arcana_Icon.png" + class CharacterRibbonFactory( private val alteredCharacterSheetFactory: AlteredCharacterSheetFactory, ) { @@ -29,7 +31,7 @@ class CharacterRibbonFactory( val status = alterations.map { alteration -> CharacterRibbonAlterationUio( - icon = "https://bg3.wiki/w/images/2/2d/Map_Tutorial_Map_Icon.png", + icon = alteration.metadata.icon ?: DEFAULT_ICON, tooltips = BasicTooltipUio( title = alteration.metadata.name, description = alteration.metadata.description, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/common/CharacterRibbonAlteration.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/common/CharacterRibbonAlteration.kt index b6c6f71..838967d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/common/CharacterRibbonAlteration.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/common/CharacterRibbonAlteration.kt @@ -1,5 +1,10 @@ package com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.common +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.togetherWith import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.TooltipPlacement import androidx.compose.foundation.layout.Arrangement @@ -46,6 +51,7 @@ fun CharacterRibbonAlteration( ) { Row( modifier = Modifier + .animateContentSize() .size(size = size) .then(other = modifier), horizontalArrangement = Arrangement.spacedBy(space = 4.dp), @@ -55,6 +61,7 @@ fun CharacterRibbonAlteration( ) { status.forEach { columns -> Column( + modifier = Modifier.animateContentSize(), verticalArrangement = Arrangement.spacedBy(space = 2.dp), ) { columns.forEach { @@ -63,26 +70,31 @@ fun CharacterRibbonAlteration( tooltip = it.tooltips, tooltipPlacement = remember(currentDirection) { TooltipPlacement.ComponentRect( - anchor = when(direction) { + anchor = when (direction) { LayoutDirection.Ltr -> Alignment.TopStart LayoutDirection.Rtl -> Alignment.TopEnd }, - alignment = when(direction) { + alignment = when (direction) { LayoutDirection.Ltr -> Alignment.BottomEnd LayoutDirection.Rtl -> Alignment.BottomStart }, ) }, content = { - AsyncImage( - modifier = Modifier.size(24.dp), - model = ImageRequest.Builder(context = PlatformContext.INSTANCE) - .data(data = it.icon) - .size(size = 48) - .build(), - filterQuality = FilterQuality.High, - contentDescription = null, - ) + AnimatedContent( + targetState = it.icon, + transitionSpec = { fadeIn() togetherWith fadeOut() }, + ) { icon -> + AsyncImage( + modifier = Modifier.size(24.dp), + model = ImageRequest.Builder(context = PlatformContext.INSTANCE) + .data(data = icon) + .size(size = 48) + .build(), + filterQuality = FilterQuality.High, + contentDescription = null, + ) + } } ) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditFactory.kt index dea8aac..853330a 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditFactory.kt @@ -11,6 +11,7 @@ import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_description import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_field_expression import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_field_id +import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_icon import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_id import lwacharactersheet.composeapp.generated.resources.game_master__alteration__edit_label import org.jetbrains.compose.resources.getString @@ -36,6 +37,10 @@ class GMAlterationEditFactory( label = getString(Res.string.game_master__alteration__edit_description), value = alteration?.metadata?.description ?: "", ) + val iconFlow = createLwaTextFieldFlow( + label = getString(Res.string.game_master__alteration__edit_icon), + value = alteration?.metadata?.icon ?: "", + ) val tagFlow = MutableStateFlow( tagFactory.convertToGMTagItemUio( tags = tags, @@ -48,6 +53,7 @@ class GMAlterationEditFactory( idFlow = idFlow, labelFlow = labelFlow, descriptionFlow = descriptionFlow, + iconFlow = iconFlow, tagFlow = tagFlow, fieldsFlow = fieldsFlow, ) @@ -61,6 +67,7 @@ class GMAlterationEditFactory( id = form.idFlow.createLwaTextField(enable = originId == null), label = form.labelFlow.createLwaTextField(), description = form.descriptionFlow.createLwaTextField(), + icon = form.iconFlow.createLwaTextField(), tags = form.tagFlow, fields = form.fieldsFlow, ) @@ -84,21 +91,22 @@ class GMAlterationEditFactory( ) } - suspend fun createAlteration( - form: GMAlterationEditPageUio?, + fun createAlteration( + form: GMAlterationEditViewModel.GMAlterationEditForm?, ): Alteration? { if (form == null) return null return Alteration( - id = form.id.valueFlow.value, + id = form.idFlow.valueFlow.value, metadata = Alteration.MetaData( - name = form.label.valueFlow.value, - description = form.description.valueFlow.value, + name = form.labelFlow.valueFlow.value, + description = form.descriptionFlow.valueFlow.value, + icon = form.iconFlow.valueFlow.value.takeIf { it.isNotBlank() }, ), - tags = form.tags.value + tags = form.tagFlow.value .filter { it.highlight } .map { it.id }, - fields = form.fields.value.mapNotNull { field -> + fields = form.fieldsFlow.value.mapNotNull { field -> expressionParser.parse(input = field.expression.valueFlow.value)?.let { Alteration.Field( fieldId = field.id.valueFlow.value, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditPage.kt index 239744c..de39042 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditPage.kt @@ -85,6 +85,7 @@ data class GMAlterationEditPageUio( val id: LwaTextFieldUio, val label: LwaTextFieldUio, val description: LwaTextFieldUio, + val icon: LwaTextFieldUio, val tags: MutableStateFlow>, val fields: MutableStateFlow>, ) { @@ -265,6 +266,16 @@ private fun GMAlterationEditContent( singleLine = false, ) } + item(key = "Icon") { + LwaTextField( + modifier = Modifier + .animateItem() + .fillMaxWidth() + .padding(paddingValues = horizontalPadding), + field = it.icon, + singleLine = false, + ) + } item(key = "Tags") { LazyRow( modifier = Modifier.draggable( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditViewModel.kt index 0fd3cb3..d919946 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/alteration/edit/GMAlterationEditViewModel.kt @@ -55,7 +55,7 @@ class GMAlterationEditViewModel( } suspend fun save(): Boolean { - val edited = factory.createAlteration(form = form.value) ?: return false + val edited = factory.createAlteration(form = _form.value) ?: return false try { alterationRepository.updateAlteration( @@ -108,6 +108,7 @@ class GMAlterationEditViewModel( val idFlow: LwaTextFieldFlow, val labelFlow: LwaTextFieldFlow, val descriptionFlow: LwaTextFieldFlow, + val iconFlow: LwaTextFieldFlow, val tagFlow: MutableStateFlow>, val fieldsFlow: MutableStateFlow>, ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/levelup/LevelUpFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/levelup/LevelUpFactory.kt index 1eeec3b..3633696 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/levelup/LevelUpFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/levelup/LevelUpFactory.kt @@ -61,7 +61,8 @@ class LevelUpFactory( alterationId = CharacterSheet.CharacteristicId.LVL, metadata = Alteration.MetaData( name = "LevelUp-${CharacterSheet.CharacteristicId.LVL}", - description = "Fake alteration for a levelUp simulation. Alter the ${CharacterSheet.CharacteristicId.LVL} stat." + description = "Fake alteration for a levelUp simulation. Alter the ${CharacterSheet.CharacteristicId.LVL} stat.", + icon = null, ), expression = Expression.Flat(1), ) @@ -78,7 +79,8 @@ class LevelUpFactory( alterationId = it, metadata = Alteration.MetaData( name = "LevelUp-$it", - description = "Fake alteration for a levelUp simulation. Alter the $it stat." + description = "Fake alteration for a levelUp simulation. Alter the $it stat.", + icon = null, ), expression = Expression.Flat(1), ) diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/Alteration.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/Alteration.kt index 7235553..59418ba 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/Alteration.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/Alteration.kt @@ -9,6 +9,7 @@ data class Alteration( val fields: List, ) { data class MetaData( + val icon: String?, val name: String, val description: String, ) diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonFactory.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonFactory.kt index 0533b48..e01079b 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonFactory.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonFactory.kt @@ -32,6 +32,7 @@ class AlterationJsonFactory( return Alteration.MetaData( name = json.name, description = json.description, + icon = json.icon, ) } @@ -61,6 +62,7 @@ class AlterationJsonFactory( return AlterationJsonV1.AlterationMetadataJsonV1( name = data.name, description = data.description, + icon = data.icon, ) } diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonV1.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonV1.kt index eb3f5bf..c4ab060 100644 --- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonV1.kt +++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/alteration/AlterationJsonV1.kt @@ -20,5 +20,6 @@ data class AlterationJsonV1( data class AlterationMetadataJsonV1( val name: String, val description: String, + val icon: String?, ) }