Skip to content

Commit 38b3667

Browse files
authored
Merge pull request #241 from fmasa/trapping-note
Custom note for Trappins from Compendium
2 parents da5aaf6 + 47428b6 commit 38b3667

File tree

12 files changed

+115
-28
lines changed

12 files changed

+115
-28
lines changed

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/CharacterTrappingDetailScreen.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package cz.frantisekmasa.wfrp_master.common.character.trappings
22

3+
import androidx.compose.foundation.layout.Box
34
import androidx.compose.foundation.layout.ColumnScope
5+
import androidx.compose.foundation.layout.fillMaxWidth
46
import androidx.compose.foundation.layout.padding
57
import androidx.compose.material.Scaffold
68
import androidx.compose.material.Text
@@ -37,6 +39,7 @@ import cz.frantisekmasa.wfrp_master.common.core.ui.navigation.LocalNavigationTra
3739
import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.Spacing
3840
import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.rememberScreenModel
3941
import cz.frantisekmasa.wfrp_master.common.core.ui.scaffolding.IconAction
42+
import cz.frantisekmasa.wfrp_master.common.core.ui.text.MarkdownTextValue
4043
import dev.icerock.moko.resources.compose.stringResource
4144

4245
class CharacterTrappingDetailScreen(
@@ -139,6 +142,18 @@ private fun TrappingDetail(
139142
}
140143
)
141144
}
145+
146+
if (trapping.note.isNotBlank()) {
147+
Box(
148+
Modifier
149+
.fillMaxWidth()
150+
.padding(horizontal = Spacing.bodyPadding)
151+
.padding(top = Spacing.bodyPadding),
152+
contentAlignment = Alignment.Center,
153+
) {
154+
MarkdownTextValue(stringResource(Str.trappings_note), trapping.note)
155+
}
156+
}
142157
}
143158

144159
when (val type = trapping.trappingType) {
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,26 @@ import androidx.compose.runtime.Composable
44
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItem
55

66
@Composable
7-
fun EditQualitiesDetailDialog(
7+
fun EditPlayerDataDialog(
88
trapping: InventoryItem,
99
onSaveRequest: suspend (InventoryItem) -> Unit,
1010
onDismissRequest: () -> Unit,
1111
) {
1212
TrappingFromCompendiumForm(
1313
itemName = trapping.name,
14-
itemQualities = trapping.itemQualities,
15-
itemFlaws = trapping.itemFlaws,
16-
quantity = trapping.quantity,
17-
onSaveRequest = { qualities, flaws, quantity ->
14+
data = TrappingFromCompendiumPlayerData(
15+
itemQualities = trapping.itemQualities,
16+
itemFlaws = trapping.itemFlaws,
17+
quantity = trapping.quantity,
18+
note = trapping.note,
19+
),
20+
onSaveRequest = {
1821
onSaveRequest(
1922
trapping.update(
20-
itemQualities = qualities,
21-
itemFlaws = flaws,
22-
quantity = quantity,
23+
itemQualities = it.itemQualities,
24+
itemFlaws = it.itemFlaws,
25+
quantity = it.quantity,
26+
note = it.note,
2327
)
2428
)
2529
onDismissRequest()

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/EditTrappingDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ fun EditTrappingDialog(
1414
onDismissRequest = onDismissRequest,
1515
) {
1616
if (existingItem.compendiumId != null) {
17-
EditQualitiesDetailDialog(
17+
EditPlayerDataDialog(
1818
trapping = existingItem,
1919
onSaveRequest = onSaveRequest,
2020
onDismissRequest = onDismissRequest,

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/TrappingFromCompendiumForm.kt

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.ui.Modifier
2020
import androidx.compose.ui.text.input.KeyboardType
2121
import cz.frantisekmasa.wfrp_master.common.Str
2222
import cz.frantisekmasa.wfrp_master.common.core.domain.localizedName
23+
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItem
2324
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.ItemFlaw
2425
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.ItemQuality
2526
import cz.frantisekmasa.wfrp_master.common.core.ui.buttons.CloseButton
@@ -33,20 +34,18 @@ import cz.frantisekmasa.wfrp_master.common.core.ui.scaffolding.SaveAction
3334
import cz.frantisekmasa.wfrp_master.common.core.utils.launchLogged
3435
import dev.icerock.moko.resources.compose.stringResource
3536
import kotlinx.coroutines.Dispatchers
36-
import kotlin.math.max
3737

3838
@Composable
3939
fun TrappingFromCompendiumForm(
4040
itemName: String,
41-
itemQualities: Set<ItemQuality>,
42-
itemFlaws: Set<ItemFlaw>,
43-
quantity: Int,
44-
onSaveRequest: suspend (Set<ItemQuality>, Set<ItemFlaw>, quantity: Int) -> Unit,
41+
data: TrappingFromCompendiumPlayerData,
42+
onSaveRequest: suspend (TrappingFromCompendiumPlayerData) -> Unit,
4543
onDismissRequest: () -> Unit,
4644
) {
47-
val quantityField = inputValue(quantity.toString(), Rules.PositiveInteger())
48-
val qualityValues = rememberSaveable { mutableStateOf(itemQualities) }
49-
val flawValues = rememberSaveable { mutableStateOf(itemFlaws) }
45+
val quantityField = inputValue(data.quantity.toString(), Rules.PositiveInteger())
46+
val noteField = inputValue(data.note)
47+
val qualityValues = rememberSaveable { mutableStateOf(data.itemQualities) }
48+
val flawValues = rememberSaveable { mutableStateOf(data.itemFlaws) }
5049
var validate by remember { mutableStateOf(false) }
5150

5251
Scaffold(
@@ -68,9 +67,12 @@ fun TrappingFromCompendiumForm(
6867
saving = true
6968
coroutineScope.launchLogged(Dispatchers.IO) {
7069
onSaveRequest(
71-
qualityValues.value,
72-
flawValues.value,
73-
max(quantityField.toInt(), 1),
70+
TrappingFromCompendiumPlayerData(
71+
itemQualities = qualityValues.value,
72+
itemFlaws = flawValues.value,
73+
quantity = quantityField.toInt().coerceAtLeast(1),
74+
note = noteField.value,
75+
)
7476
)
7577
onDismissRequest()
7678
}
@@ -87,6 +89,16 @@ fun TrappingFromCompendiumForm(
8789
.padding(Spacing.bodyPadding),
8890
verticalArrangement = Arrangement.spacedBy(Spacing.small),
8991
) {
92+
93+
TextInput(
94+
label = stringResource(Str.trappings_label_note),
95+
value = noteField,
96+
validate = validate,
97+
multiLine = true,
98+
helperText = stringResource(Str.common_ui_markdown_supported_note),
99+
maxLength = InventoryItem.NOTE_MAX_LENGTH,
100+
)
101+
90102
InputLabel(stringResource(Str.trappings_label_item_qualities))
91103

92104
CheckboxList(
@@ -112,3 +124,10 @@ fun TrappingFromCompendiumForm(
112124
}
113125
}
114126
}
127+
128+
data class TrappingFromCompendiumPlayerData(
129+
val itemQualities: Set<ItemQuality>,
130+
val itemFlaws: Set<ItemFlaw>,
131+
val quantity: Int,
132+
val note: String,
133+
)

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/character/trappings/add/AddTrappingScreen.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import cz.frantisekmasa.wfrp_master.common.character.items.rememberAddItemUiStat
1010
import cz.frantisekmasa.wfrp_master.common.character.trappings.CharacterTrappingDetailScreen
1111
import cz.frantisekmasa.wfrp_master.common.character.trappings.NonCompendiumTrappingForm
1212
import cz.frantisekmasa.wfrp_master.common.character.trappings.TrappingFromCompendiumForm
13+
import cz.frantisekmasa.wfrp_master.common.character.trappings.TrappingFromCompendiumPlayerData
1314
import cz.frantisekmasa.wfrp_master.common.character.trappings.trappingIcon
1415
import cz.frantisekmasa.wfrp_master.common.core.domain.identifiers.CharacterId
1516
import cz.frantisekmasa.wfrp_master.common.core.domain.trappings.InventoryItem
@@ -58,15 +59,19 @@ class AddTrappingScreen(
5859
specification = { compendiumTrapping ->
5960
TrappingFromCompendiumForm(
6061
itemName = compendiumTrapping.name,
61-
itemQualities = emptySet(),
62-
itemFlaws = emptySet(),
63-
quantity = 1,
64-
onSaveRequest = { itemQualities, itemFlaws, quantity ->
62+
data = TrappingFromCompendiumPlayerData(
63+
itemQualities = emptySet(),
64+
itemFlaws = emptySet(),
65+
quantity = 1,
66+
note = "",
67+
),
68+
onSaveRequest = {
6569
val item = InventoryItem.fromCompendium(
6670
compendiumTrapping,
67-
itemQualities,
68-
itemFlaws,
69-
quantity,
71+
it.itemQualities,
72+
it.itemFlaws,
73+
it.quantity,
74+
it.note,
7075
)
7176

7277
addItemUiState.saveItem(

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/domain/trappings/InventoryItem.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.runtime.Stable
55
import com.benasher44.uuid.Uuid
66
import com.benasher44.uuid.uuid4
77
import cz.frantisekmasa.wfrp_master.common.compendium.domain.Trapping
8+
import cz.frantisekmasa.wfrp_master.common.core.common.requireMaxLength
89
import cz.frantisekmasa.wfrp_master.common.core.domain.character.CharacterItem
910
import cz.frantisekmasa.wfrp_master.common.core.utils.duplicateName
1011
import dev.icerock.moko.parcelize.Parcelize
@@ -21,6 +22,10 @@ data class InventoryItem(
2122
@Contextual override val id: InventoryItemId,
2223
val name: String,
2324
val description: String,
25+
/**
26+
* Used as custom player note for trappings where description is taken from compendium.
27+
*/
28+
val note: String = "",
2429
val quantity: Int,
2530
val encumbrance: Encumbrance = Encumbrance.Zero,
2631
@Contextual val containerId: InventoryItemId? = null,
@@ -32,6 +37,7 @@ data class InventoryItem(
3237

3338
init {
3439
require(quantity > 0) { "Quantity must be greater than 0" }
40+
note.requireMaxLength(NOTE_MAX_LENGTH, "note")
3541
}
3642

3743
@Stable
@@ -69,13 +75,15 @@ data class InventoryItem(
6975
itemQualities: Set<ItemQuality>,
7076
itemFlaws: Set<ItemFlaw>,
7177
quantity: Int,
78+
note: String,
7279
): InventoryItem = copy(
7380
encumbrance = encumbrance -
7481
encumbranceModifier(this.itemQualities, this.itemFlaws) +
7582
encumbranceModifier(this.itemQualities, this.itemFlaws),
7683
itemQualities = itemQualities,
7784
itemFlaws = itemFlaws,
7885
quantity = quantity,
86+
note = note,
7987
)
8088

8189
override fun unlinkFromCompendium() = copy(compendiumId = null)
@@ -102,12 +110,14 @@ data class InventoryItem(
102110
companion object {
103111
const val NAME_MAX_LENGTH = Trapping.NAME_MAX_LENGTH
104112
const val DESCRIPTION_MAX_LENGTH = Trapping.DESCRIPTION_MAX_LENGTH
113+
const val NOTE_MAX_LENGTH = 500
105114

106115
fun fromCompendium(
107116
compendiumItem: Trapping,
108117
itemQualities: Set<ItemQuality>,
109118
itemFlaws: Set<ItemFlaw>,
110119
quantity: Int,
120+
note: String,
111121
): InventoryItem {
112122
return InventoryItem(
113123
id = uuid4(),
@@ -117,6 +127,7 @@ data class InventoryItem(
117127
itemFlaws = itemFlaws,
118128
trappingType = TrappingType.fromCompendium(compendiumItem.trappingType),
119129
description = compendiumItem.description,
130+
note = note,
120131
quantity = quantity,
121132
containerId = null,
122133
compendiumId = compendiumItem.id,
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package cz.frantisekmasa.wfrp_master.common.core.ui.text
2+
3+
import androidx.compose.foundation.layout.Column
4+
import androidx.compose.material.Text
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.ui.text.font.FontWeight
7+
import com.halilibo.richtext.markdown.Markdown
8+
import com.halilibo.richtext.ui.RichText
9+
10+
@Composable
11+
fun MarkdownTextValue(label: String, value: String) {
12+
if (value.isBlank()) return
13+
14+
Column {
15+
Text(
16+
"$label:",
17+
fontWeight = FontWeight.Bold,
18+
)
19+
20+
RichText {
21+
Markdown(value)
22+
}
23+
}
24+
}

common/src/commonMain/resources/MR/base/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,8 @@
628628
<string name="trappings_label_item_qualities">Item Qualities</string>
629629
<string name="trappings_label_item_flaws">Item Flaws</string>
630630
<string name="trappings_label_name">Name</string>
631+
<string name="trappings_label_note">Note (optional)</string>
632+
<string name="trappings_note">Note</string>
631633
<string name="trappings_label_pack_size">Pack size</string>
632634
<string name="trappings_label_price">Price</string>
633635
<string name="trappings_label_qualities">Qualities</string>

common/src/commonMain/resources/MR/es/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@
386386
<string name="journal_messages_no_entries">Ninguna entrada</string>
387387
<string name="character_tab_conditions">Condiciones</string>
388388
<string name="compendium_messages_export_failed">La exportación del JSON ha fallado.</string>
389+
<string name="trappings_label_note">Nota (opcional)</string>
390+
<string name="trappings_note">Nota</string>
389391
<string name="trappings_label_item_flaws">Defectos de objeto</string>
390392
<string name="combat_hit_locations_left_arm">Brazo Izquierdo</string>
391393
<string name="races_ogre">Ogro</string>

common/src/commonMain/resources/MR/fr/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,8 @@
622622
<string name="trappings_flaws_unreliable">Peu fiable</string>
623623
<string name="trappings_flaws_ugly">Laid</string>
624624
<string name="trappings_qualities_practical">Pratique</string>
625+
<string name="trappings_label_note">Note (optionnel)</string>
626+
<string name="trappings_note">Note</string>
625627
<string name="trappings_label_qualities">Qualités</string>
626628
<string name="trappings_label_quantity">Quantité</string>
627629
<string name="trappings_flaws_shoddy">Bâclé</string>

0 commit comments

Comments
 (0)