Skip to content

Commit 774f2a9

Browse files
committed
Merge branch 'feat/social-class-ui' into 'master'
Social status See merge request fmasa/wfrp-master!213
2 parents 2686287 + 81288e3 commit 774f2a9

File tree

11 files changed

+131
-109
lines changed

11 files changed

+131
-109
lines changed

app/core/src/main/java/cz/frantisekmasa/wfrp_master/core/domain/character/Character.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package cz.frantisekmasa.wfrp_master.core.domain.character
33
import cz.frantisekmasa.wfrp_master.core.domain.Ambitions
44
import cz.frantisekmasa.wfrp_master.core.domain.Money
55
import cz.frantisekmasa.wfrp_master.core.domain.Stats
6-
import java.lang.IllegalArgumentException
76

87
data class Character(
98
private var name: String,
109
val userId: String?,
1110
private var career: String,
1211
private var socialClass: String,
12+
private var status: SocialStatus = SocialStatus(SocialStatus.Tier.BRASS, 0),
1313
private var psychology: String,
1414
private var motivation: String,
1515
private var race: Race,
@@ -52,6 +52,7 @@ data class Character(
5252
name: String,
5353
career: String,
5454
socialClass: String,
55+
status: SocialStatus,
5556
race: Race,
5657
characteristicsBase: Stats,
5758
characteristicsAdvances: Stats,
@@ -73,6 +74,7 @@ data class Character(
7374
this.name = name
7475
this.career = career
7576
this.socialClass = socialClass
77+
this.status = status
7678
this.race = race
7779
this.characteristicsBase = characteristicsBase
7880
this.characteristicsAdvances = characteristicsAdvances
@@ -110,8 +112,7 @@ data class Character(
110112

111113
fun getConditions() = conditions
112114

113-
/** TODO: Implement social status in character */
114-
fun getStatus() = SocialStatus(SocialStatus.Tier.GOLD, 1)
115+
fun getStatus() = status
115116

116117
fun updatePoints(newPoints: Points) {
117118
require(

app/core/src/main/java/cz/frantisekmasa/wfrp_master/core/ui/forms/InputLabel.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@ import androidx.compose.material.MaterialTheme
55
import androidx.compose.material.Text
66
import androidx.compose.runtime.Composable
77
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.unit.Dp
89
import androidx.compose.ui.unit.dp
910

1011
@Composable
11-
fun InputLabel(label: String) {
12+
fun InputLabel(label: String, bottomPadding: Dp = 4.dp) {
1213
Text(
1314
label,
1415
style = MaterialTheme.typography.body2,
1516
maxLines = 1,
16-
modifier = Modifier.padding(bottom = 4.dp),
17+
modifier = Modifier.padding(bottom = bottomPadding),
1718
)
1819
}
20+
21+
@Composable
22+
fun SelectBoxLabel(label: String) {
23+
InputLabel(label, bottomPadding = 2.dp)
24+
}

app/core/src/main/java/cz/frantisekmasa/wfrp_master/core/ui/forms/SelectBox.kt

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cz.frantisekmasa.wfrp_master.core.ui.forms
33
import androidx.compose.foundation.BorderStroke
44
import androidx.compose.foundation.clickable
55
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Box
67
import androidx.compose.foundation.layout.Column
78
import androidx.compose.foundation.layout.Row
89
import androidx.compose.foundation.layout.RowScope
@@ -31,19 +32,22 @@ import cz.frantisekmasa.wfrp_master.core.ui.primitives.Spacing
3132

3233
@Composable
3334
inline fun <reified T : NamedEnum> SelectBox(
34-
label: String? = null,
3535
value: T,
3636
noinline onValueChange: (T) -> Unit,
3737
items: Array<T>,
38+
modifier: Modifier = Modifier,
39+
label: String? = null,
3840
) {
3941
val context = LocalContext.current
4042

41-
SelectBox(
42-
label = label,
43-
value = value,
44-
onValueChange = onValueChange,
45-
items = remember(context, items) { items.map { it to context.getString(it.nameRes) } }
46-
)
43+
Box(modifier) {
44+
SelectBox(
45+
label = label,
46+
value = value,
47+
onValueChange = onValueChange,
48+
items = remember(context, items) { items.map { it to context.getString(it.nameRes) } }
49+
)
50+
}
4751
}
4852

4953
@Composable
@@ -92,13 +96,7 @@ fun SelectBoxToggle(
9296
content: @Composable RowScope.() -> Unit,
9397
) {
9498
Column {
95-
label?.let {
96-
Text(
97-
label,
98-
style = MaterialTheme.typography.body2,
99-
modifier = Modifier.padding(bottom = 2.dp)
100-
)
101-
}
99+
label?.let { SelectBoxLabel(it) }
102100

103101
Surface(
104102
shape = RoundedCornerShape(Spacing.tiny),

app/core/src/main/res/drawable/ic_social_status.xml

Lines changed: 0 additions & 4 deletions
This file was deleted.

app/core/src/test/java/cz/frantisekmasa/wfrp_master/core/domain/character/CharacterTest.kt

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,36 @@ import org.junit.Assert.assertEquals
66
import org.junit.Assert.assertSame
77
import org.junit.Assert.fail
88
import org.junit.Test
9-
import java.lang.IllegalArgumentException
109

1110
class CharacterTest {
1211
private fun character() = Character(
13-
"Bilbo",
14-
"123",
15-
"Writer",
16-
"Noble",
17-
"Does not like orcs",
18-
"Food",
19-
Race.HALFLING,
20-
Stats(20, 40, 2, 4, 80, 5, 5, 4, 0, 10),
21-
Stats(20, 40, 2, 4, 80, 5, 5, 4, 0, 10),
22-
Points(0, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0)
12+
name = "Bilbo",
13+
userId = "123",
14+
career = "Writer",
15+
socialClass = "Noble",
16+
status = SocialStatus(SocialStatus.Tier.GOLD, 2),
17+
psychology = "Does not like orcs",
18+
motivation = "Food",
19+
race = Race.HALFLING,
20+
characteristicsBase = Stats(20, 40, 2, 4, 80, 5, 5, 4, 0, 10),
21+
characteristicsAdvances = Stats(20, 40, 2, 4, 80, 5, 5, 4, 0, 10),
22+
points = Points(0, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0)
2323
)
2424

2525
private fun characterWithHardy() = character().apply {
2626
update(
27-
getName(),
28-
getCareer(),
29-
getSocialClass(),
30-
Race.DWARF,
31-
getCharacteristicsBase(),
32-
getCharacteristicsAdvances(),
33-
getPoints().maxWounds,
34-
getPsychology(),
35-
getMotivation(),
36-
getNote(),
37-
true
27+
name = getName(),
28+
career = getCareer(),
29+
socialClass = getSocialClass(),
30+
race = Race.DWARF,
31+
status = SocialStatus(SocialStatus.Tier.BRASS, 2),
32+
characteristicsBase = getCharacteristicsBase(),
33+
characteristicsAdvances = getCharacteristicsAdvances(),
34+
maxWounds = getPoints().maxWounds,
35+
psychology = getPsychology(),
36+
motivation = getMotivation(),
37+
note = getNote(),
38+
hardyTalent = true,
3839
)
3940
}
4041

app/src/main/java/cz/muni/fi/rpg/ui/character/CharacterStatsScreen.kt

Lines changed: 28 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,15 @@ import androidx.compose.foundation.layout.Arrangement
66
import androidx.compose.foundation.layout.Box
77
import androidx.compose.foundation.layout.BoxScope
88
import androidx.compose.foundation.layout.Column
9-
import androidx.compose.foundation.layout.ColumnScope
10-
import androidx.compose.foundation.layout.IntrinsicSize
119
import androidx.compose.foundation.layout.Row
1210
import androidx.compose.foundation.layout.RowScope
13-
import androidx.compose.foundation.layout.fillMaxHeight
1411
import androidx.compose.foundation.layout.fillMaxWidth
15-
import androidx.compose.foundation.layout.height
1612
import androidx.compose.foundation.layout.padding
17-
import androidx.compose.foundation.layout.width
1813
import androidx.compose.foundation.rememberScrollState
1914
import androidx.compose.foundation.verticalScroll
2015
import androidx.compose.material.Button
21-
import androidx.compose.material.Card
2216
import androidx.compose.material.ContentAlpha
2317
import androidx.compose.material.ExtendedFloatingActionButton
24-
import androidx.compose.material.Icon
2518
import androidx.compose.material.LocalContentAlpha
2619
import androidx.compose.material.MaterialTheme
2720
import androidx.compose.material.Scaffold
@@ -38,7 +31,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
3831
import androidx.compose.runtime.setValue
3932
import androidx.compose.ui.Alignment
4033
import androidx.compose.ui.Modifier
41-
import androidx.compose.ui.res.painterResource
4234
import androidx.compose.ui.res.stringResource
4335
import androidx.compose.ui.text.font.FontWeight
4436
import androidx.compose.ui.unit.dp
@@ -49,7 +41,6 @@ import cz.frantisekmasa.wfrp_master.core.domain.Stats
4941
import cz.frantisekmasa.wfrp_master.core.domain.character.Character
5042
import cz.frantisekmasa.wfrp_master.core.domain.character.Points
5143
import cz.frantisekmasa.wfrp_master.core.domain.character.Points.PointPool
52-
import cz.frantisekmasa.wfrp_master.core.domain.character.SocialStatus
5344
import cz.frantisekmasa.wfrp_master.core.domain.identifiers.CharacterId
5445
import cz.frantisekmasa.wfrp_master.core.domain.party.Party
5546
import cz.frantisekmasa.wfrp_master.core.media.rememberSoundPlayer
@@ -156,31 +147,23 @@ internal fun CharacterCharacteristicsScreen(
156147

157148
CharacteristicsCard(character.getCharacteristics())
158149

159-
Row(
160-
Modifier
161-
.fillMaxWidth()
162-
.padding(top = Spacing.small)
163-
.padding(horizontal = Spacing.responsiveBodyPadding())
164-
.height(IntrinsicSize.Min),
165-
horizontalArrangement = Arrangement.spacedBy(Spacing.gutterSize()),
166-
) {
167-
ExperiencePointsCard(
168-
points = points,
169-
save = viewModel::updatePoints,
170-
modifier = Modifier.weight(1f),
171-
)
172-
173-
CareerCard(character, Modifier.weight(1f))
150+
CardRow(Modifier.padding(top = Spacing.small)) {
151+
Box(Modifier.weight(1f), contentAlignment = Alignment.TopCenter) {
152+
CareerSection(character)
153+
}
174154

175-
SocialStatusCard(
176-
character.getStatus(),
177-
Modifier
178-
.weight(1f)
179-
.fillMaxHeight()
180-
)
155+
Box(Modifier.weight(1f), contentAlignment = Alignment.TopCenter) {
156+
ExperiencePointsSection(
157+
points = points,
158+
save = viewModel::updatePoints,
159+
)
160+
}
181161
}
182162

183-
Container(Modifier.padding(top = Spacing.tiny)) {
163+
Container(
164+
Modifier.padding(top = Spacing.tiny),
165+
horizontalArrangement = Arrangement.spacedBy(Spacing.gutterSize()),
166+
) {
184167
val size = if (breakpoint > Breakpoint.XSmall) HalfWidth else FullWidth
185168

186169
column(size) {
@@ -388,17 +371,9 @@ private fun CharacteristicsCard(values: Stats) {
388371
}
389372

390373
@Composable
391-
private fun CardSection(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) {
392-
Card(modifier, elevation = 2.dp) {
393-
Column(Modifier.padding(Spacing.responsiveBodyPadding()), content = content)
394-
}
395-
}
396-
397-
@Composable
398-
private fun ExperiencePointsCard(
374+
private fun ExperiencePointsSection(
399375
points: Points,
400376
save: suspend (Points) -> Unit,
401-
modifier: Modifier,
402377
) {
403378
var experiencePointsDialogVisible by rememberSaveable { mutableStateOf(false) }
404379

@@ -410,7 +385,11 @@ private fun ExperiencePointsCard(
410385
)
411386
}
412387

413-
CardSection(modifier.clickable(onClick = { experiencePointsDialogVisible = true })) {
388+
Column(
389+
Modifier
390+
.clickable(onClick = { experiencePointsDialogVisible = true })
391+
.padding(horizontal = Spacing.large),
392+
) {
414393
Row(horizontalArrangement = Arrangement.spacedBy(Spacing.tiny)) {
415394
Text(points.experience.toString(), fontWeight = FontWeight.Bold)
416395
Text(stringResource(R.string.xp_points))
@@ -426,23 +405,16 @@ private fun ExperiencePointsCard(
426405
}
427406

428407
@Composable
429-
private fun CareerCard(character: Character, modifier: Modifier) {
430-
CardSection(modifier) {
431-
Text(character.getCareer(), fontWeight = FontWeight.Bold)
432-
Text(character.getSocialClass(), style = MaterialTheme.typography.caption)
433-
}
434-
}
408+
private fun CareerSection(character: Character) {
409+
val status = character.getStatus()
435410

436-
@Composable
437-
private fun SocialStatusCard(status: SocialStatus, modifier: Modifier) {
438-
CardSection(modifier) {
439-
Row(Modifier.fillMaxHeight(), verticalAlignment = Alignment.CenterVertically) {
440-
Icon(
441-
painterResource(R.drawable.ic_social_status),
442-
"Social status icon",
443-
Modifier.width(Spacing.extraLarge),
411+
Column {
412+
Text(character.getCareer(), fontWeight = FontWeight.Bold)
413+
CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
414+
Text(
415+
"${character.getSocialClass()} · ${stringResource(status.tier.nameRes)} ${status.standing}",
416+
style = MaterialTheme.typography.caption
444417
)
445-
Text(stringResource(status.tier.nameRes) + " ${status.standing}")
446418
}
447419
}
448420
}

app/src/main/java/cz/muni/fi/rpg/ui/character/edit/CharacterEditScreen.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.compose.ui.text.input.KeyboardType
2424
import androidx.compose.ui.text.style.TextAlign
2525
import androidx.compose.ui.unit.dp
2626
import cz.frantisekmasa.wfrp_master.core.domain.character.Character
27+
import cz.frantisekmasa.wfrp_master.core.domain.character.SocialStatus
2728
import cz.frantisekmasa.wfrp_master.core.ui.buttons.BackButton
2829
import cz.frantisekmasa.wfrp_master.core.ui.forms.CheckboxWithText
2930
import cz.frantisekmasa.wfrp_master.core.ui.forms.InputValue
@@ -208,6 +209,10 @@ private suspend fun updateCharacter(
208209
psychology = formData.basicInfo.psychology.value,
209210
motivation = formData.basicInfo.motivation.value,
210211
socialClass = formData.basicInfo.socialClass.value,
212+
status = SocialStatus(
213+
formData.basicInfo.socialTier.value,
214+
formData.basicInfo.socialStanding.value,
215+
),
211216
note = formData.basicInfo.note.value,
212217
characteristicsBase = characteristics.base,
213218
characteristicsAdvances = characteristics.advances,

0 commit comments

Comments
 (0)