Skip to content

Commit 310a112

Browse files
authored
Merge pull request #83 from fmasa/career-picker
Replace "Custom Career" checkbox by better select box
2 parents 7629a9e + 0d8fbb6 commit 310a112

File tree

7 files changed

+334
-140
lines changed

7 files changed

+334
-140
lines changed

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/characterCreation/CharacterBasicInfoForm.kt

Lines changed: 32 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package cz.frantisekmasa.wfrp_master.common.characterCreation
22

33
import androidx.compose.foundation.layout.Arrangement
44
import androidx.compose.foundation.layout.Column
5-
import androidx.compose.foundation.layout.Row
6-
import androidx.compose.foundation.layout.fillMaxWidth
75
import androidx.compose.foundation.layout.padding
86
import androidx.compose.runtime.Composable
97
import androidx.compose.runtime.MutableState
@@ -19,11 +17,11 @@ import cz.frantisekmasa.wfrp_master.common.core.domain.character.Race
1917
import cz.frantisekmasa.wfrp_master.common.core.domain.character.SocialStatus
2018
import cz.frantisekmasa.wfrp_master.common.core.domain.localizedName
2119
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.CareerSelectBox
22-
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.CheckboxWithText
2320
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.ChipList
2421
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.FormData
2522
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.InputValue
2623
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.Rules
24+
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.SelectedCareer
2725
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.SocialStatusInput
2826
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.TextInput
2927
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.inputValue
@@ -36,9 +34,7 @@ object CharacterBasicInfoForm {
3634
val name: InputValue,
3735
val publicName: InputValue,
3836
val socialClass: InputValue,
39-
val career: InputValue,
40-
val customCareer: MutableState<Boolean>,
41-
val compendiumCareer: MutableState<Character.CompendiumCareer?>,
37+
val career: MutableState<SelectedCareer?>,
4238
val race: MutableState<Race?>,
4339
val psychology: InputValue,
4440
val motivation: InputValue,
@@ -58,19 +54,28 @@ object CharacterBasicInfoForm {
5854
name = inputValue(character?.name ?: "", Rules.NotBlank()),
5955
publicName = inputValue(character?.publicName ?: ""),
6056
socialClass = inputValue(character?.socialClass ?: ""),
61-
career = inputValue(character?.career ?: ""),
57+
career = rememberSaveable {
58+
mutableStateOf(
59+
character?.let {
60+
val compendiumCareer = character.compendiumCareer
61+
compendiumCareer?.let {
62+
SelectedCareer.CompendiumCareer(
63+
compendiumCareer,
64+
character.status,
65+
)
66+
} ?: SelectedCareer.NonCompendiumCareer(
67+
character.career,
68+
character.socialClass,
69+
)
70+
}
71+
)
72+
},
6273
race = rememberSaveable {
6374
mutableStateOf(if (character == null) Race.HUMAN else character.race)
6475
},
6576
psychology = inputValue(character?.psychology ?: ""),
6677
motivation = inputValue(character?.motivation ?: ""),
6778
note = inputValue(character?.note ?: ""),
68-
customCareer = rememberSaveable {
69-
mutableStateOf(character != null && character.career != "")
70-
},
71-
compendiumCareer = rememberSaveable {
72-
mutableStateOf(character?.compendiumCareer)
73-
},
7479
status = rememberSaveable {
7580
mutableStateOf(
7681
character?.status
@@ -81,8 +86,7 @@ object CharacterBasicInfoForm {
8186
)
8287
}
8388

84-
override fun isValid(): Boolean =
85-
name.value.isNotBlank() && (customCareer.value || compendiumCareer.value != null)
89+
override fun isValid(): Boolean = name.value.isNotBlank()
8690
}
8791
}
8892

@@ -118,43 +122,21 @@ fun CharacterBasicInfoForm(
118122
onValueChange = { data.race.value = it },
119123
)
120124

121-
CheckboxWithText(
122-
strings.labelCustomCareer,
123-
checked = data.customCareer.value,
124-
onCheckedChange = { data.customCareer.value = !data.customCareer.value },
125+
CareerSelectBox(
126+
careers = data.careers,
127+
value = data.career.value,
128+
onValueChange = {
129+
if (it is SelectedCareer.CompendiumCareer && data.career.value != it) {
130+
data.status.value = it.socialStatus
131+
}
132+
data.career.value = it
133+
},
125134
)
126135

127-
if (data.customCareer.value) {
128-
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {
129-
TextInput(
130-
modifier = Modifier.weight(1f),
131-
label = strings.labelClass,
132-
value = data.socialClass,
133-
maxLength = Character.SOCIAL_CLASS_MAX_LENGTH,
134-
validate = validate,
135-
)
136-
137-
TextInput(
138-
modifier = Modifier.weight(1f),
139-
label = strings.labelCareer,
140-
value = data.career,
141-
maxLength = Character.CAREER_MAX_LENGTH,
142-
validate = validate,
143-
)
144-
}
145-
146-
SocialStatusInput(
147-
value = data.status.value,
148-
onValueChange = { data.status.value = it },
149-
)
150-
} else {
151-
CareerSelectBox(
152-
careers = data.careers,
153-
value = data.compendiumCareer.value,
154-
onValueChange = { data.compendiumCareer.value = it },
155-
validate = validate,
156-
)
157-
}
136+
SocialStatusInput(
137+
value = data.status.value,
138+
onValueChange = { data.status.value = it },
139+
)
158140

159141
TextInput(
160142
label = strings.labelPsychology,

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/characterCreation/CharacterCreationScreenModel.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import cz.frantisekmasa.wfrp_master.common.core.domain.compendium.Compendium
1111
import cz.frantisekmasa.wfrp_master.common.core.domain.identifiers.CharacterId
1212
import cz.frantisekmasa.wfrp_master.common.core.domain.party.PartyId
1313
import cz.frantisekmasa.wfrp_master.common.core.logging.Reporter
14-
import cz.frantisekmasa.wfrp_master.common.core.shared.IO
14+
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.SelectedCareer
1515
import io.github.aakira.napier.Napier
1616
import kotlinx.coroutines.Dispatchers
1717
import kotlinx.coroutines.flow.first
@@ -41,11 +41,7 @@ class CharacterCreationScreenModel(
4141
Napier.d("Creating character")
4242

4343
val characteristics = characteristicsData.toValue()
44-
val customCareer = info.customCareer.value
45-
val careerLevel = info.careers
46-
.asSequence()
47-
.flatMap { it.levels }
48-
.firstOrNull { it.id == info.compendiumCareer.value?.levelId }
44+
val career = info.career.value
4945

5046
characters.save(
5147
characterId.partyId,
@@ -55,17 +51,17 @@ class CharacterCreationScreenModel(
5551
name = info.name.value,
5652
publicName = info.publicName.value.takeIf { it.isNotBlank() },
5753
userId = userId?.toString(),
58-
career = if (customCareer) info.career.value else "",
59-
socialClass = if (customCareer) info.socialClass.value else "",
60-
status = careerLevel?.status ?: info.status.value,
54+
career = if (career is SelectedCareer.NonCompendiumCareer) career.careerName else "",
55+
socialClass = if (career is SelectedCareer.NonCompendiumCareer) career.socialClass else "",
56+
status = info.status.value,
6157
race = info.race.value,
6258
characteristicsBase = characteristics.base,
6359
characteristicsAdvances = characteristics.advances,
6460
points = points.toValue(),
6561
psychology = info.psychology.value,
6662
motivation = info.motivation.value,
6763
note = info.note.value,
68-
compendiumCareer = if (!customCareer) info.compendiumCareer.value else null,
64+
compendiumCareer = if (career is SelectedCareer.CompendiumCareer) career.value else null,
6965
).refreshWounds()
7066
)
7167

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/characterEdit/CareerSection.kt

Lines changed: 38 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,11 @@ import cz.frantisekmasa.wfrp_master.common.character.CharacterScreenModel
99
import cz.frantisekmasa.wfrp_master.common.compendium.domain.Career
1010
import cz.frantisekmasa.wfrp_master.common.core.domain.character.Character
1111
import cz.frantisekmasa.wfrp_master.common.core.domain.character.SocialStatus
12-
import cz.frantisekmasa.wfrp_master.common.core.shared.IO
1312
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.CareerSelectBox
14-
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.CheckboxWithText
1513
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.FormScreen
1614
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.HydratedFormData
17-
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.InputValue
15+
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.SelectedCareer
1816
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.SocialStatusInput
19-
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.TextInput
20-
import cz.frantisekmasa.wfrp_master.common.core.ui.forms.inputValue
2117
import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.FullScreenProgress
2218
import cz.frantisekmasa.wfrp_master.common.localization.LocalStrings
2319
import kotlinx.coroutines.Dispatchers
@@ -58,35 +54,17 @@ fun CareerSection(character: Character, screenModel: CharacterScreenModel) {
5854
return@FormScreen
5955
}
6056

61-
CheckboxWithText(
62-
strings.labelCustomCareer,
63-
checked = data.customCareer.value,
64-
onCheckedChange = { data.customCareer.value = !data.customCareer.value },
57+
CareerSelectBox(
58+
careers = careers,
59+
value = data.career.value,
60+
onValueChange = {
61+
if (it is SelectedCareer.CompendiumCareer && data.career.value != it) {
62+
data.status.value = it.socialStatus
63+
}
64+
data.career.value = it
65+
},
6566
)
6667

67-
if (data.customCareer.value) {
68-
TextInput(
69-
label = strings.labelClass,
70-
value = data.socialClass,
71-
maxLength = Character.SOCIAL_CLASS_MAX_LENGTH,
72-
validate = validate,
73-
)
74-
75-
TextInput(
76-
label = strings.labelCareer,
77-
value = data.careerName,
78-
maxLength = Character.CAREER_MAX_LENGTH,
79-
validate = validate,
80-
)
81-
} else {
82-
CareerSelectBox(
83-
careers = careers,
84-
value = data.compendiumCareer.value,
85-
onValueChange = { data.compendiumCareer.value = it },
86-
validate = validate,
87-
)
88-
}
89-
9068
SocialStatusInput(
9169
value = data.status.value,
9270
onValueChange = { data.status.value = it },
@@ -95,31 +73,43 @@ fun CareerSection(character: Character, screenModel: CharacterScreenModel) {
9573
}
9674

9775
data class CareerFormData(
98-
val careerName: InputValue,
99-
val socialClass: InputValue,
76+
val career: MutableState<SelectedCareer>,
10077
val status: MutableState<SocialStatus>,
101-
val compendiumCareer: MutableState<Character.CompendiumCareer?>,
102-
val customCareer: MutableState<Boolean>,
10378
) : HydratedFormData<CareerData> {
10479

105-
override fun isValid(): Boolean = careerName.isValid() &&
106-
(customCareer.value || compendiumCareer.value != null)
80+
override fun isValid(): Boolean = true
10781

108-
override fun toValue(): CareerData = CareerData(
109-
careerName = if (customCareer.value)careerName.value else "",
110-
socialClass = if (customCareer.value) socialClass.value else "",
111-
status = status.value,
112-
compendiumCareer = if (!customCareer.value) compendiumCareer.value else null
113-
)
82+
override fun toValue(): CareerData {
83+
return when (val career = career.value) {
84+
is SelectedCareer.CompendiumCareer -> CareerData(
85+
careerName = "",
86+
socialClass = "",
87+
status = status.value,
88+
compendiumCareer = career.value,
89+
)
90+
is SelectedCareer.NonCompendiumCareer -> CareerData(
91+
careerName = career.careerName,
92+
socialClass = career.socialClass,
93+
status = status.value,
94+
compendiumCareer = null,
95+
)
96+
}
97+
}
11498

11599
companion object {
116100
@Composable
117101
fun fromCharacter(character: Character) = CareerFormData(
118-
careerName = inputValue(character.career),
119-
socialClass = inputValue(character.socialClass),
102+
career = rememberSaveable(character.id) {
103+
mutableStateOf(
104+
character.compendiumCareer?.let {
105+
SelectedCareer.CompendiumCareer(it, character.status)
106+
} ?: SelectedCareer.NonCompendiumCareer(
107+
character.career,
108+
character.socialClass,
109+
)
110+
)
111+
},
120112
status = rememberSaveable(character.id) { mutableStateOf(character.status) },
121-
compendiumCareer = rememberSaveable(character.id) { mutableStateOf(character.compendiumCareer) },
122-
customCareer = rememberSaveable(character.id) { mutableStateOf(character.compendiumCareer == null) },
123113
)
124114
}
125115
}

common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/buttons/CloseButton.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ import androidx.compose.runtime.Composable
88
import cz.frantisekmasa.wfrp_master.common.localization.LocalStrings
99

1010
@Composable
11-
fun CloseButton(onClick: () -> Unit) {
11+
fun CloseButton(
12+
onClick: () -> Unit,
13+
contentDescription: String = LocalStrings.current.commonUi.labelCloseDialog,
14+
) {
1215
IconButton(onClick = onClick) {
1316
Icon(
1417
Icons.Rounded.Close,
15-
LocalStrings.current.commonUi.labelCloseDialog,
18+
contentDescription = contentDescription,
1619
)
1720
}
1821
}

0 commit comments

Comments
 (0)