diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index d634db1..6494843 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -187,6 +187,8 @@ Filtrer l'inventaire Ajouter un objet Utiliser + Équiper + Déséquiper Ajouter à la bourse Retirer de la bourse Filtrer les objets @@ -194,7 +196,7 @@ Ajouter à l'inventaire Quantité Modifier - Jetter + Jeter Equiper Utiliser Cet objet n'a pas de description. diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/inventory/InventoryDialogFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/inventory/InventoryDialogFactory.kt index a4856cf..e889858 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/inventory/InventoryDialogFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/inventory/InventoryDialogFactory.kt @@ -77,6 +77,6 @@ class InventoryDialogFactory { ) companion object { - private const val ADDABLE_TAG_ID = "META:ADDABLE" + const val ADDABLE_TAG_ID = "META:ADDABLE" } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialog.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialog.kt index fb369bd..ed6ee36 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialog.kt @@ -44,11 +44,12 @@ import com.pixelized.desktop.lwa.ui.theme.color.component.LwaTextFieldColors import com.pixelized.desktop.lwa.ui.theme.lwa import com.pixelized.desktop.lwa.utils.rememberSaturationFilter import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.character__inventory__equip__action import lwacharactersheet.composeapp.generated.resources.character__inventory__inventory__dialog__action import lwacharactersheet.composeapp.generated.resources.character__inventory__inventory__dialog__consume_action import lwacharactersheet.composeapp.generated.resources.character__inventory__inventory__dialog__count_action -import lwacharactersheet.composeapp.generated.resources.character__inventory__inventory__dialog__equip_action import lwacharactersheet.composeapp.generated.resources.character__inventory__inventory__dialog__throw_action +import lwacharactersheet.composeapp.generated.resources.character__inventory__unequip__action import lwacharactersheet.composeapp.generated.resources.ic_close_24dp import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource @@ -66,6 +67,7 @@ data class ItemDetailDialogUio( // options val countable: LwaTextFieldUio?, val consumable: Boolean, + val equipped: Boolean, val equipable: Boolean, ) @@ -213,9 +215,18 @@ fun ItemDetailDialog( TextButton( onClick = { onEquip(state) }, ) { - Text( - text = stringResource(Res.string.character__inventory__inventory__dialog__equip_action), - ) + AnimatedContent( + targetState = state.equipped, + ) { + Text( + text = stringResource( + when (it) { + true -> Res.string.character__inventory__unequip__action + else -> Res.string.character__inventory__equip__action + } + ) + ) + } } } if (state.consumable) { diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogFactory.kt index efde7eb..65f0499 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogFactory.kt @@ -11,13 +11,14 @@ import java.text.DecimalFormat class ItemDetailDialogFactory { - private val floatChecker = Regex("""^\d*[.,]?\d*${'$'}""") + private val floatChecker = Regex("""^\d*,?\d*${'$'}""") private val format = DecimalFormat("#.##") suspend fun convertToDialogUio( characterSheetId: String?, items: Map, count: Float, + equipped: Boolean, inventoryId: String?, itemId: String?, ): ItemDetailDialogUio? { @@ -38,6 +39,7 @@ class ItemDetailDialogFactory { ?.let { createFieldFlow(value = format.format(count)) } ?.createTextField(label = getString(Res.string.character__inventory__inventory__dialog__count)), consumable = item.options.consumable, + equipped = equipped, equipable = item.options.equipable, ) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogViewModel.kt index a9fae35..e0ea22b 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/composable/character/item/ItemDetailDialogViewModel.kt @@ -52,6 +52,7 @@ class ItemDetailDialogViewModel( characterSheetId = ids?.characterSheetId, items = items, count = selectedInventoryItem?.count ?: 0f, + equipped = selectedInventoryItem?.equipped ?: false, inventoryId = ids?.inventoryId, itemId = ids?.itemId, ) @@ -83,7 +84,7 @@ class ItemDetailDialogViewModel( suspend fun onAddInventoryItem( characterSheetId: String, itemId: String, - ) : Boolean { + ): Boolean { try { // create the inventory item on the server, get the newly create id from that. val inventoryId = inventoryRepository.createInventoryItem( @@ -143,7 +144,7 @@ class ItemDetailDialogViewModel( suspend fun equipInventoryItem( characterSheetId: String, inventoryId: String?, - ) : Boolean { + ): Boolean { if (inventoryId == null) return false try { inventoryRepository.equipInventoryItem( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailPanelViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailPanelViewModel.kt index f1eb5b8..38abd46 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailPanelViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/CharacterDetailPanelViewModel.kt @@ -34,6 +34,13 @@ class CharacterDetailPanelViewModel( ) : ViewModel() { private val characterSheetPanelFlow = MutableStateFlow(null) + private val addItemAction = characterInventoryFactory + .addItemActionFlow() + .stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = false, + ) val detail: StateFlow = characterSheetPanelFlow .map { characterSheetPanel -> @@ -55,6 +62,7 @@ class CharacterDetailPanelViewModel( inventory = characterInventoryFactory.convertToCharacterInventoryUioFlow( characterSheetId = characterSheetId, scope = viewModelScope, + addItemAction = addItemAction, initialValue = ::emptyInventory, ), ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventory.kt index c2bc1e1..1a2320d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventory.kt @@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.calculateEndPadding +import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -24,9 +26,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.pixelized.desktop.lwa.LocalBlurController @@ -46,7 +52,7 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item import com.pixelized.desktop.lwa.ui.theme.color.component.LwaButtonColors import com.pixelized.desktop.lwa.ui.theme.color.component.LwaTextFieldColors import com.pixelized.desktop.lwa.ui.theme.lwa -import com.pixelized.desktop.lwa.utils.extention.plus +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.character__inventory__add_to_inventory__action @@ -58,6 +64,7 @@ import org.koin.compose.viewmodel.koinViewModel @Stable data class CharacterDetailInventoryUio( val characterSheetId: String, + val addItemAction: StateFlow, val filter: LwaTextFieldUio, val purse: PurseUio, val items: List, @@ -125,6 +132,14 @@ fun CharacterDetailInventory( inventoryId = it.inventoryId, ) } + }, + onEquip = { + scope.launch { + itemDetailDialogViewModel.equipInventoryItem( + characterSheetId = it.characterSheetId, + inventoryId = it.inventoryId, + ) + } } ) } @@ -248,14 +263,16 @@ private fun CharacterDetailInventoryContent( onPurse: (String) -> Unit, onItem: (InventoryItemUio) -> Unit, onConsume: (InventoryItemUio) -> Unit, + onEquip: (InventoryItemUio) -> Unit, onAddItem: (String) -> Unit, ) { + val addItemAction = inventory.addItemAction.collectAsState() Box( modifier = modifier, ) { LazyColumn( modifier = Modifier.matchParentSize(), - contentPadding = paddings + PaddingValues(bottom = 56.dp), + contentPadding = paddings.plus(addItemAction, PaddingValues(bottom = 56.dp)), verticalArrangement = Arrangement.spacedBy(space = spacing), ) { item( @@ -309,31 +326,61 @@ private fun CharacterDetailInventoryContent( item = it, onClick = { onItem(it) }, onConsume = { onConsume(it) }, + onEquip = { onEquip(it) }, ) } } - - Row( + AnimatedVisibility( modifier = Modifier .align(alignment = Alignment.BottomEnd) .padding(paddingValues = paddings), - horizontalArrangement = Arrangement.SpaceBetween, + visible = addItemAction.value, + enter = fadeIn(), + exit = fadeOut(), ) { - Button( - colors = LwaButtonColors(), - elevation = ButtonDefaults.elevation(4.dp), - shape = CircleShape, - onClick = { onAddItem(inventory.characterSheetId) }, + Row( + horizontalArrangement = Arrangement.SpaceBetween, ) { - Text( - modifier = Modifier.padding(end = 4.dp), - text = stringResource(Res.string.character__inventory__add_to_inventory__action), - ) - Icon( - imageVector = Icons.Default.Add, - contentDescription = null, - ) + Button( + colors = LwaButtonColors(), + elevation = ButtonDefaults.elevation(4.dp), + shape = CircleShape, + onClick = { onAddItem(inventory.characterSheetId) }, + ) { + Text( + modifier = Modifier.padding(end = 4.dp), + text = stringResource(Res.string.character__inventory__add_to_inventory__action), + ) + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + ) + } } } } +} + +@Stable +@Composable +fun PaddingValues.plus( + state: State, + other: PaddingValues, +): PaddingValues { + val direction = LocalLayoutDirection.current + val sum by remember(this, other, direction, state) { + derivedStateOf { + if (state.value) { + PaddingValues( + start = calculateStartPadding(direction) + other.calculateStartPadding(direction), + top = calculateTopPadding() + other.calculateTopPadding(), + end = calculateEndPadding(direction) + other.calculateEndPadding(direction), + bottom = calculateBottomPadding() + other.calculateBottomPadding(), + ) + } else { + this + } + } + } + return sum } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventoryFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventoryFactory.kt index 52c0663..6193a2d 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventoryFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/CharacterDetailInventoryFactory.kt @@ -2,6 +2,8 @@ package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory import com.pixelized.desktop.lwa.repository.inventory.InventoryRepository import com.pixelized.desktop.lwa.repository.item.ItemRepository +import com.pixelized.desktop.lwa.repository.tag.TagRepository +import com.pixelized.desktop.lwa.ui.composable.character.inventory.InventoryDialogFactory import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item.InventoryItemUio import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item.PurseUio @@ -9,6 +11,7 @@ import com.pixelized.desktop.lwa.utils.extention.unAccent import com.pixelized.shared.lwa.model.inventory.Inventory import com.pixelized.shared.lwa.model.item.Item import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -24,11 +27,19 @@ class CharacterDetailInventoryFactory( private val inventoryRepository: InventoryRepository, private val itemRepository: ItemRepository, ) { + fun addItemActionFlow(): Flow { + return itemRepository.itemFlow().map { entry -> + entry.values.any { item -> + item.tags.any { id -> id == ADDABLE_TAG_ID } + } + } + } suspend fun convertToCharacterInventoryUioFlow( characterSheetId: String, scope: CoroutineScope, started: SharingStarted = SharingStarted.Eagerly, + addItemAction: StateFlow, initialValue: () -> CharacterDetailInventoryUio?, ): StateFlow { val filterFlow = MutableStateFlow("") @@ -48,8 +59,9 @@ class CharacterDetailInventoryFactory( convertToCharacterInventoryUio( characterSheetId = characterSheetId, filter = filterField, - purse = inventory?.purse, - inventory = inventory?.items, + addItemAction = addItemAction, + purse = inventory.purse, + inventory = inventory.items, items = items.filterValues { it.metadata.label.unAccent().contains(filter, true) }, ) }.stateIn( @@ -62,6 +74,7 @@ class CharacterDetailInventoryFactory( private suspend fun convertToCharacterInventoryUio( characterSheetId: String?, filter: LwaTextFieldUio, + addItemAction: StateFlow, purse: Inventory.Purse?, inventory: List?, items: Map, @@ -76,6 +89,7 @@ class CharacterDetailInventoryFactory( copper = purse?.copper ?: 0, ), filter = filter, + addItemAction = addItemAction, items = inventory ?.mapNotNull { val item = items[it.itemId] ?: return@mapNotNull null @@ -87,6 +101,7 @@ class CharacterDetailInventoryFactory( count = it.count, equipped = it.equipped, consumable = item.options.consumable, + equipable = item.options.equipable, tooltips = takeIf { item.metadata.description.isNotEmpty() }?.let { InventoryItemUio.Tooltips( label = item.metadata.label, @@ -100,4 +115,8 @@ class CharacterDetailInventoryFactory( ?: emptyList() ) } + + companion object { + private const val ADDABLE_TAG_ID = InventoryDialogFactory.ADDABLE_TAG_ID + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt index e9c54d2..6835074 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryItem.kt @@ -1,8 +1,11 @@ package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.SizeTransform import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.togetherWith import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -12,6 +15,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding @@ -23,12 +27,14 @@ import androidx.compose.material.TextButton import androidx.compose.material.minimumInteractiveComponentSize import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.FilterQuality import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp @@ -40,6 +46,8 @@ import com.pixelized.desktop.lwa.ui.theme.lwa import com.pixelized.desktop.lwa.utils.extention.ribbon import com.pixelized.desktop.lwa.utils.rememberSaturationFilter import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.character__inventory__equip__action +import lwacharactersheet.composeapp.generated.resources.character__inventory__unequip__action import lwacharactersheet.composeapp.generated.resources.character__inventory__use__action import org.jetbrains.compose.resources.stringResource @@ -52,6 +60,7 @@ data class InventoryItemUio( val count: Float, val equipped: Boolean, val consumable: Boolean, + val equipable: Boolean, val tooltips: Tooltips?, ) { @Stable @@ -68,7 +77,10 @@ object GMCharacterPreviewDefault { val paddings = PaddingValues(horizontal = 16.dp) @Stable - val spacing: Dp = 4.dp + val toolTipPaddings = PaddingValues(all = 16.dp) + + @Stable + val spacing: Dp = 8.dp } @OptIn(ExperimentalFoundationApi::class) @@ -76,11 +88,20 @@ object GMCharacterPreviewDefault { fun InventoryItem( modifier: Modifier = Modifier, padding: PaddingValues = GMCharacterPreviewDefault.paddings, + toolTipPaddings: PaddingValues = GMCharacterPreviewDefault.toolTipPaddings, spacing: Dp = GMCharacterPreviewDefault.spacing, item: InventoryItemUio, onClick: () -> Unit, onConsume: () -> Unit, + onEquip: () -> Unit, ) { + val layoutDirection = LocalLayoutDirection.current + val toolTop = remember(toolTipPaddings) { toolTipPaddings.calculateTopPadding() } + val toolEnd = remember(toolTipPaddings, layoutDirection) { + toolTipPaddings.calculateEndPadding(layoutDirection) + } + val end = remember(padding, layoutDirection) { padding.calculateEndPadding(layoutDirection) } + TooltipLayout2( modifier = modifier, delayMillis = 500, @@ -89,14 +110,14 @@ fun InventoryItem( DecoratedBox { Surface { Box( - modifier = Modifier.padding(all = 16.dp) + modifier = Modifier.padding(paddingValues = toolTipPaddings) ) { takeIf { tooltips.image?.isNotEmpty() == true }?.let { DesaturatedAsyncImage( modifier = Modifier - .size(96.dp) + .size(size = 96.dp) .align(alignment = Alignment.TopEnd) - .offset(x = 8.dp, y = (-8).dp), + .offset(x = toolEnd, y = -toolTop), colorFilter = rememberSaturationFilter(), model = tooltips.image, contentScale = ContentScale.Crop, @@ -107,7 +128,7 @@ fun InventoryItem( } Column( modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(space = 8.dp) + verticalArrangement = Arrangement.spacedBy(space = spacing) ) { Text( style = MaterialTheme.typography.body2, @@ -144,10 +165,11 @@ fun InventoryItem( verticalAlignment = Alignment.CenterVertically, ) { Row( + modifier = Modifier.weight(weight = 1f), horizontalArrangement = Arrangement.spacedBy(space = spacing), ) { Text( - modifier = Modifier.alignByBaseline(), + modifier = Modifier.alignByBaseline().weight(weight = 1f, fill = false), style = MaterialTheme.lwa.typography.base.body1, fontWeight = FontWeight.Bold, overflow = TextOverflow.Ellipsis, @@ -157,7 +179,11 @@ fun InventoryItem( AnimatedContent( modifier = Modifier.alignByBaseline(), targetState = item.count, - transitionSpec = { fadeIn() togetherWith fadeOut() }, + transitionSpec = { + val enter = fadeIn() + slideInHorizontally { 16 } + val exit = fadeOut() + slideOutHorizontally { -16 } + enter togetherWith exit using SizeTransform(clip = false) + }, ) { when (it) { 0f, 1f -> Unit @@ -170,11 +196,34 @@ fun InventoryItem( } } } - if (item.consumable) { - TextButton( - onClick = onConsume, - ) { - Text(text = stringResource(Res.string.character__inventory__use__action)) + Row( + modifier = Modifier.offset(x = end - spacing), + horizontalArrangement = Arrangement.spacedBy(space = spacing), + ) { + if (item.consumable) { + TextButton( + onClick = onConsume, + ) { + Text(text = stringResource(Res.string.character__inventory__use__action)) + } + } + if (item.equipable) { + TextButton( + onClick = onEquip, + ) { + AnimatedContent( + targetState = item.equipped, + ) { + Text( + text = stringResource( + when (it) { + true -> Res.string.character__inventory__unequip__action + else -> Res.string.character__inventory__equip__action + } + ) + ) + } + } } } }