diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index b1cf9d7..c6004bd 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -184,6 +184,8 @@
Supprimer la feuille de personnage
Êtes-vous sûr de vouloir supprimer "%1$s" ?
+ Ajouter un objet
+ Filtrer l'inventaire
Ajouter à la bourse
Retirer de la bourse
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 c865368..cdd94f3 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
@@ -1,29 +1,26 @@
package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory
-import androidx.compose.animation.AnimatedContent
-import androidx.compose.animation.AnimatedContentTransitionScope
-import androidx.compose.animation.ContentTransform
-import androidx.compose.animation.SizeTransform
+import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
-import androidx.compose.animation.slideInVertically
-import androidx.compose.animation.slideOutVertically
-import androidx.compose.animation.togetherWith
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
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.fillMaxWidth
import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
@@ -31,45 +28,57 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
-import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.pixelized.desktop.lwa.LocalBlurController
import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialog
import com.pixelized.desktop.lwa.ui.composable.character.purse.PurseDialogViewModel
import com.pixelized.desktop.lwa.ui.composable.error.ErrorSnackHandler
+import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField
+import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item.InventoryItem
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.InventoryPurse
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item.PurseUio
+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.launch
import lwacharactersheet.composeapp.generated.resources.Res
-import lwacharactersheet.composeapp.generated.resources.ic_copper_32px
-import lwacharactersheet.composeapp.generated.resources.ic_gold_32px
-import lwacharactersheet.composeapp.generated.resources.ic_silver_32px
+import lwacharactersheet.composeapp.generated.resources.character__inventory__add_to_inventory__action
+import lwacharactersheet.composeapp.generated.resources.ic_cancel_24dp
import org.jetbrains.compose.resources.painterResource
+import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@Stable
data class CharacterDetailInventoryUio(
val characterSheetId: String,
+ val filter: LwaTextFieldUio,
val purse: PurseUio,
val items: List,
-) {
- @Stable
- data class PurseUio(
- val gold: Int,
- val silver: Int,
- val copper: Int,
- )
-}
+)
+@Stable
object CharacterDetailInventoryDefault {
- val padding = PaddingValues(horizontal = 16.dp, vertical = 8.dp)
+ @Stable
+ val padding = PaddingValues(
+ start = 16.dp,
+ end = 16.dp,
+ top = 8.dp,
+ bottom = 8.dp,
+ )
+
+ @Stable
+ val spacing: Dp = 8.dp
}
@Composable
fun CharacterDetailInventory(
modifier: Modifier = Modifier,
paddings: PaddingValues = CharacterDetailInventoryDefault.padding,
+ spacing: Dp = CharacterDetailInventoryDefault.spacing,
purseViewModel: PurseDialogViewModel = koinViewModel(),
inventory: State,
) {
@@ -82,6 +91,7 @@ fun CharacterDetailInventory(
else -> CharacterDetailInventoryContent(
modifier = modifier,
paddings = paddings,
+ spacing = spacing,
inventory = unWrap,
onPurse = {
blur.show()
@@ -118,119 +128,95 @@ fun CharacterDetailInventory(
private fun CharacterDetailInventoryContent(
modifier: Modifier = Modifier,
paddings: PaddingValues,
+ spacing: Dp,
inventory: CharacterDetailInventoryUio,
onPurse: (String) -> Unit,
) {
- Column(
+ Box(
modifier = modifier,
) {
LazyColumn(
- modifier = Modifier.weight(1f),
- contentPadding = paddings,
+ modifier = Modifier.matchParentSize(),
+ contentPadding = paddings + PaddingValues(bottom = 56.dp),
+ verticalArrangement = Arrangement.spacedBy(space = spacing),
) {
+ item(
+ key = "purse",
+ ) {
+ Row(
+ modifier = Modifier
+ .animateItem()
+ .fillMaxWidth(),
+ verticalAlignment = Alignment.Bottom,
+ horizontalArrangement = Arrangement.spacedBy(space = spacing),
+ ) {
+ InventoryPurse(
+ modifier = Modifier.weight(weight = 1f),
+ purse = inventory.purse,
+ onPurse = { onPurse(inventory.characterSheetId) },
+ )
+ LwaTextField(
+ modifier = Modifier.weight(weight = 1f),
+ colors = LwaTextFieldColors(
+ backgroundColor = MaterialTheme.lwa.colorScheme.elevated.base2dp,
+ ),
+ field = inventory.filter,
+ trailingIcon = {
+ val value = inventory.filter.valueFlow.collectAsState()
+ AnimatedVisibility(
+ visible = value.value.isNotBlank(),
+ enter = fadeIn(),
+ exit = fadeOut(),
+ ) {
+ IconButton(
+ onClick = { inventory.filter.onValueChange.invoke("") },
+ ) {
+ Icon(
+ painter = painterResource(Res.drawable.ic_cancel_24dp),
+ tint = MaterialTheme.lwa.colorScheme.base.primary,
+ contentDescription = null,
+ )
+ }
+ }
+ }
+ )
+ }
+ }
items(
items = inventory.items,
key = { it.inventoryId },
) {
InventoryItem(
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier
+ .animateItem()
+ .fillMaxWidth(),
item = it,
onClick = { },
)
}
}
- Purse(
- modifier = Modifier.fillMaxWidth(),
- paddings = paddings,
- purse = inventory.purse,
- onPurse = { onPurse(inventory.characterSheetId) },
- )
- }
-}
-
-@Composable
-private fun Purse(
- modifier: Modifier = Modifier,
- paddings: PaddingValues,
- purse: CharacterDetailInventoryUio.PurseUio,
- onPurse: () -> Unit,
-) {
- Row(
- modifier = Modifier
- .background(color = MaterialTheme.lwa.colorScheme.elevated.base2dp)
- .then(other = modifier),
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.End,
- ) {
Row(
modifier = Modifier
- .clickable { onPurse() }
+ .align(alignment = Alignment.BottomEnd)
.padding(paddingValues = paddings),
- horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
+ horizontalArrangement = Arrangement.SpaceBetween,
) {
- Row(verticalAlignment = Alignment.Bottom) {
- Image(
- painter = painterResource(Res.drawable.ic_gold_32px),
- modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
+ Button(
+ colors = LwaButtonColors(),
+ elevation = ButtonDefaults.elevation(4.dp),
+ shape = CircleShape,
+ onClick = { },
+ ) {
+ Text(
+ modifier = Modifier.padding(end = 4.dp),
+ text = stringResource(Res.string.character__inventory__add_to_inventory__action),
+ )
+ Icon(
+ imageVector = Icons.Default.Add,
contentDescription = null,
)
- AnimatedContent(
- targetState = purse.gold,
- transitionSpec = coinTransitionSpec(),
- ) {
- Text(
- style = MaterialTheme.lwa.typography.base.body1,
- fontWeight = FontWeight.Bold,
- text = "$it",
- )
- }
- }
-
- Row(verticalAlignment = Alignment.Bottom) {
- Image(
- painter = painterResource(Res.drawable.ic_silver_32px),
- modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
- contentDescription = null,
- )
- AnimatedContent(
- targetState = purse.silver,
- transitionSpec = coinTransitionSpec(),
- ) {
- Text(
- style = MaterialTheme.lwa.typography.base.body1,
- fontWeight = FontWeight.Bold,
- text = "$it",
- )
- }
- }
-
- Row(verticalAlignment = Alignment.Bottom) {
- Image(
- painter = painterResource(Res.drawable.ic_copper_32px),
- modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
- contentDescription = null,
- )
- AnimatedContent(
- targetState = purse.copper,
- transitionSpec = coinTransitionSpec(),
- ) {
- Text(
- style = MaterialTheme.lwa.typography.base.body1,
- fontWeight = FontWeight.Bold,
- text = "$it",
- )
- }
}
}
-
}
-}
-
-@Composable
-@Stable
-private fun coinTransitionSpec(): AnimatedContentTransitionScope.() -> ContentTransform = {
- val enter = fadeIn() + slideInVertically { -16 }
- val exit = fadeOut() + slideOutVertically { 16 }
- enter togetherWith exit using SizeTransform(clip = false)
}
\ 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 8bfdc8b..ab830e2 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,35 +2,55 @@ 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.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
+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.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
+import lwacharactersheet.composeapp.generated.resources.Res
+import lwacharactersheet.composeapp.generated.resources.character__inventory__filter_inventory__label
+import org.jetbrains.compose.resources.getString
+import java.text.Collator
class CharacterDetailInventoryFactory(
private val inventoryRepository: InventoryRepository,
private val itemRepository: ItemRepository,
) {
- fun convertToCharacterInventoryUioFlow(
+ suspend fun convertToCharacterInventoryUioFlow(
characterSheetId: String,
scope: CoroutineScope,
started: SharingStarted = SharingStarted.Eagerly,
initialValue: () -> CharacterDetailInventoryUio?,
): StateFlow {
+ val filterFlow = MutableStateFlow("")
+ val filterField = LwaTextFieldUio(
+ enable = true,
+ isError = MutableStateFlow(false),
+ valueFlow = filterFlow,
+ label = getString(Res.string.character__inventory__filter_inventory__label),
+ placeHolder = null,
+ onValueChange = { filterFlow.value = it },
+ )
return combine(
inventoryRepository.inventoryFlow(characterSheetId = characterSheetId),
itemRepository.itemFlow,
- ) { inventory, items ->
+ filterFlow.map { it.unAccent() },
+ ) { inventory, items, filter ->
convertToCharacterInventoryUio(
characterSheetId = characterSheetId,
+ filter = filterField,
purse = inventory?.purse,
inventory = inventory?.items,
- items = items,
+ items = items.filterValues { it.metadata.name.unAccent().contains(filter, true) },
)
}.stateIn(
scope = scope,
@@ -41,6 +61,7 @@ class CharacterDetailInventoryFactory(
private suspend fun convertToCharacterInventoryUio(
characterSheetId: String?,
+ filter: LwaTextFieldUio,
purse: Inventory.Purse?,
inventory: List?,
items: Map,
@@ -49,19 +70,22 @@ class CharacterDetailInventoryFactory(
return CharacterDetailInventoryUio(
characterSheetId = characterSheetId,
- purse = CharacterDetailInventoryUio.PurseUio(
+ purse = PurseUio(
gold = purse?.gold ?: 0,
silver = purse?.silver ?: 0,
copper = purse?.copper ?: 0,
),
+ filter = filter,
items = inventory
?.mapNotNull {
val label = items[it.itemId]?.metadata?.name ?: return@mapNotNull null
InventoryItemUio(
inventoryId = it.inventoryId,
label = label,
+ equipped = it.equipped,
)
}
+ ?.sortedWith(compareBy(Collator.getInstance()) { it.label })
?: emptyList()
)
}
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 3ce21f0..6fb5656 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
@@ -12,13 +12,16 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import com.pixelized.desktop.lwa.ui.theme.lwa
+import com.pixelized.desktop.lwa.utils.extention.ribbon
@Stable
data class InventoryItemUio(
val inventoryId: String,
val label: String,
+ val equipped: Boolean,
)
@Stable
@@ -36,9 +39,15 @@ fun InventoryItem(
) {
Row(
modifier = Modifier
- .clip(shape = MaterialTheme.lwa.shapes.gameMaster)
+ .clip(shape = MaterialTheme.lwa.shapes.item)
.clickable(onClick = onClick)
.background(color = MaterialTheme.lwa.colorScheme.elevated.base2dp)
+ .ribbon(
+ color = when (item.equipped) {
+ true -> MaterialTheme.lwa.colorScheme.base.primary
+ else -> Color.Transparent
+ }
+ )
.minimumInteractiveComponentSize()
.padding(paddingValues = padding)
.then(other = modifier),
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryPurse.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryPurse.kt
new file mode 100644
index 0000000..b90470f
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/detail/inventory/item/InventoryPurse.kt
@@ -0,0 +1,130 @@
+package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.inventory.item
+
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.AnimatedContentTransitionScope
+import androidx.compose.animation.ContentTransform
+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.Image
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import com.pixelized.desktop.lwa.ui.theme.lwa
+import lwacharactersheet.composeapp.generated.resources.Res
+import lwacharactersheet.composeapp.generated.resources.ic_copper_32px
+import lwacharactersheet.composeapp.generated.resources.ic_gold_32px
+import lwacharactersheet.composeapp.generated.resources.ic_silver_32px
+import org.jetbrains.compose.resources.painterResource
+
+@Stable
+data class PurseUio(
+ val gold: Int,
+ val silver: Int,
+ val copper: Int,
+)
+
+@Stable
+object InventoryPurseDefault {
+ @Stable
+ val paddings = PaddingValues(horizontal = 0.dp, vertical = 4.dp)
+}
+
+@Composable
+fun InventoryPurse(
+ modifier: Modifier = Modifier,
+ paddings: PaddingValues = InventoryPurseDefault.paddings,
+ purse: PurseUio,
+ onPurse: () -> Unit,
+) {
+ Row(
+ modifier = modifier,
+ verticalAlignment = Alignment.CenterVertically,
+ horizontalArrangement = Arrangement.Start,
+ ) {
+ Row(
+ modifier = Modifier
+ .clip(shape = MaterialTheme.lwa.shapes.item)
+ .clickable { onPurse() }
+ .padding(paddingValues = paddings),
+ horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
+ ) {
+ Row(verticalAlignment = Alignment.Bottom) {
+ Image(
+ painter = painterResource(Res.drawable.ic_gold_32px),
+ modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
+ contentDescription = null,
+ )
+ AnimatedContent(
+ targetState = purse.gold,
+ transitionSpec = coinTransitionSpec(),
+ ) {
+ Text(
+ style = MaterialTheme.lwa.typography.base.body1,
+ fontWeight = FontWeight.Bold,
+ text = "$it",
+ )
+ }
+ }
+
+ Row(verticalAlignment = Alignment.Bottom) {
+ Image(
+ painter = painterResource(Res.drawable.ic_silver_32px),
+ modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
+ contentDescription = null,
+ )
+ AnimatedContent(
+ targetState = purse.silver,
+ transitionSpec = coinTransitionSpec(),
+ ) {
+ Text(
+ style = MaterialTheme.lwa.typography.base.body1,
+ fontWeight = FontWeight.Bold,
+ text = "$it",
+ )
+ }
+ }
+
+ Row(verticalAlignment = Alignment.Bottom) {
+ Image(
+ painter = painterResource(Res.drawable.ic_copper_32px),
+ modifier = Modifier.padding(bottom = 2.dp).size(size = 16.dp),
+ contentDescription = null,
+ )
+ AnimatedContent(
+ targetState = purse.copper,
+ transitionSpec = coinTransitionSpec(),
+ ) {
+ Text(
+ style = MaterialTheme.lwa.typography.base.body1,
+ fontWeight = FontWeight.Bold,
+ text = "$it",
+ )
+ }
+ }
+ }
+ }
+}
+
+@Composable
+@Stable
+private fun coinTransitionSpec(): AnimatedContentTransitionScope.() -> ContentTransform = {
+ val enter = fadeIn() + slideInHorizontally { -16 }
+ val exit = fadeOut() + slideOutHorizontally { 16 }
+ enter togetherWith exit using SizeTransform(clip = false)
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/ModifierEx+Ribbon.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/ModifierEx+Ribbon.kt
new file mode 100644
index 0000000..76d180d
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/ModifierEx+Ribbon.kt
@@ -0,0 +1,29 @@
+package com.pixelized.desktop.lwa.utils.extention
+
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.draw.drawWithContent
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+fun Modifier.ribbon(
+ width: Dp = 4.dp,
+ color: Color,
+): Modifier = composed {
+ val animatedColor = animateColorAsState(
+ targetValue = color,
+ )
+ return@composed drawWithContent {
+ drawContent()
+ drawRect(
+ color = animatedColor.value,
+ size = Size(
+ width = width.toPx(),
+ height = size.height,
+ )
+ )
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/PaddingValues+Add.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/PaddingValues+Add.kt
new file mode 100644
index 0000000..a33d1fa
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/PaddingValues+Add.kt
@@ -0,0 +1,23 @@
+package com.pixelized.desktop.lwa.utils.extention
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.calculateEndPadding
+import androidx.compose.foundation.layout.calculateStartPadding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalLayoutDirection
+
+@Stable
+@Composable
+operator fun PaddingValues.plus(other: PaddingValues): PaddingValues {
+ val direction = LocalLayoutDirection.current
+ return remember(this, other, direction) {
+ PaddingValues(
+ start = calculateStartPadding(direction) + other.calculateStartPadding(direction),
+ top = calculateTopPadding() + other.calculateTopPadding(),
+ end = calculateEndPadding(direction) + other.calculateEndPadding(direction),
+ bottom = calculateBottomPadding() + other.calculateBottomPadding(),
+ )
+ }
+}
\ No newline at end of file
diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/Inventory.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/Inventory.kt
index 3d08efe..1fbfb71 100644
--- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/Inventory.kt
+++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/Inventory.kt
@@ -15,6 +15,7 @@ data class Inventory(
val inventoryId: String,
val itemId: String,
val count: Int,
+ val equipped: Boolean,
)
companion object {
diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/InventoryJsonV1.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/InventoryJsonV1.kt
index 990a5b6..10fa214 100644
--- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/InventoryJsonV1.kt
+++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/InventoryJsonV1.kt
@@ -21,5 +21,6 @@ data class InventoryJsonV1(
val inventoryId: String,
val itemId: String,
val count: Int,
+ val equipped: Boolean?,
)
}
\ No newline at end of file
diff --git a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactoryV1.kt b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactoryV1.kt
index ced7139..0c36a0e 100644
--- a/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactoryV1.kt
+++ b/shared/src/commonMain/kotlin/com/pixelized/shared/lwa/model/inventory/factory/InventoryJsonFactoryV1.kt
@@ -18,6 +18,7 @@ class InventoryJsonFactoryV1 {
inventoryId = it.inventoryId,
itemId = it.itemId,
count = it.count,
+ equipped = it.equipped ?: false,
)
},
)
@@ -36,6 +37,7 @@ class InventoryJsonFactoryV1 {
inventoryId = it.inventoryId,
itemId = it.itemId,
count = it.count,
+ equipped = it.equipped,
)
},
)