Add quality of life (icons, formula instead of plain Ints)

This commit is contained in:
Thomas Andres Gomez 2024-11-29 15:12:42 +01:00
parent 8884d047a6
commit f99a938e64
16 changed files with 235 additions and 145 deletions

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1024"
android:viewportHeight="1024">

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:pathData="M0 0h24v24H0z" />
<path
android:fillColor="#000000"
android:pathData="M14 2H6c-1.1 0-1.99 0.9 -1.99 2L4 20c0 1.1 0.89 2 1.99 2H18c1.1 0 2-0.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z" />
</vector>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M0 0h24v24H0z" />
<path
android:fillColor="#000000"
android:pathData="M20 6h-8l-2-2H4c-1.1 0-1.99 0.9 -1.99 2L2 18c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2V8c0-1.1-0.9-2-2-2zm0 12H4V8h16v10z" />
</vector>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:width="24dp"
android:height="24dp"
android:viewportWidth="512"
android:viewportHeight="512">

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
<path
android:fillColor="#000000"
android:pathData="M21.96,9.73l-1.43-5C20.41,4.3,20.02,4,19.57,4H4.43C3.98,4,3.59,4.3,3.47,4.73l-1.43,5C1.86,10.36,2.34,11,3,11h2.2L4,20 h2l0.67-5h10.67L18,20h2l-1.2-9H21C21.66,11,22.14,10.36,21.96,9.73z M6.93,13l0.27-2h9.6l0.27,2H6.93z" />
</vector>

View file

@ -14,45 +14,31 @@ class SkillValueComputationUseCase(
skill: CharacterSheet.Skill,
diminished: Int,
): Int {
val baseSum = arithmeticParser.parse(skill.base).sumOf { instruction ->
when (instruction) {
is Instruction.Dice -> 0
is Instruction.Flat -> {
instruction.value
}
is Instruction.Word -> {
when (instruction.type) {
Instruction.Word.Type.BDC -> 0
Instruction.Word.Type.BDD -> 0
Instruction.Word.Type.STR -> sheet.strength
Instruction.Word.Type.DEX -> sheet.dexterity
Instruction.Word.Type.CON -> sheet.constitution
Instruction.Word.Type.HEI -> sheet.height
Instruction.Word.Type.INT -> sheet.intelligence
Instruction.Word.Type.POW -> sheet.power
Instruction.Word.Type.CHA -> sheet.charisma
}
}
} * instruction.sign
val base: Int = arithmeticParser.parse(skill.base).compute(sheet = sheet).let {
when (skill.occupation) {
true -> max(MIN_OCCUPATION_VALUE, it)
else -> it
}
}
val bonus = skill.bonus?.let(arithmeticParser::parse)?.compute(sheet = sheet) ?: 0
val level = skill.level?.let(arithmeticParser::parse)?.compute(sheet = sheet) ?: 0
val base = if (skill.occupation) {
max(MIN_OCCUPATION_VALUE, baseSum)
} else {
baseSum
}
return max(base + (skill.bonus ?: 0) + (skill.level ?: 0) - diminished, 0)
return max(base + bonus + level - diminished, 0)
}
fun computeRoll(
sheet: CharacterSheet,
roll: String,
): Int { // TODO Roll detail instead of an simple Int.
): Int {
return arithmeticParser.parse(value = roll).compute(sheet = sheet)
}
// TODO return RollDetail instance instead of an simple Int.
private fun List<Instruction>.compute(
sheet: CharacterSheet,
): Int {
print("Roll ->")
return arithmeticParser.parse(roll).sumOf { instruction ->
return sumOf { instruction ->
print(" ($instruction):")
val value = when (instruction) {
is Instruction.Dice -> rollUseCase.roll(dice = instruction)
@ -99,7 +85,9 @@ class SkillValueComputationUseCase(
}
(value * instruction.sign).also { print("$it") }
}.also { println() }
}.also {
println()
}
}
companion object {

View file

@ -36,8 +36,8 @@ data class CharacterSheet(
val label: String,
val description: String?,
val base: String,
val bonus: Int?,
val level: Int?,
val bonus: String?,
val level: String?,
val occupation: Boolean,
val used: Boolean,
)
@ -66,4 +66,19 @@ data class CharacterSheet(
const val SLEIGHT_OF_HAND_ID = "SLEIGHT_OF_HAND"
const val AID_ID = "AID"
}
object CharacteristicId {
const val STR = "STR"
const val DEX = "DEX"
const val CON = "CON"
const val HEI = "HEI"
const val INT = "INT"
const val POW = "POW"
const val CHA = "CHA"
const val MOV = "MOV"
const val HP = "HP"
const val PP = "PP"
const val DMG = "DMG"
const val ARMOR = "ARMOR"
}
}

View file

@ -38,8 +38,8 @@ data class CharacterSheetJsonV1(
val label: String,
val description: String?,
val base: String,
val bonus: Int?,
val level: Int?,
val bonus: String?,
val level: String?,
val occupation: Boolean,
val used: Boolean,
)

View file

@ -4,6 +4,7 @@ import com.pixelized.desktop.lwa.business.SkillValueComputationUseCase
import com.pixelized.desktop.lwa.composable.tooltip.TooltipUio
import com.pixelized.desktop.lwa.repository.characterSheet.SkillDescriptionFactory
import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet
import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet.CharacteristicId
import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic
import com.pixelized.desktop.lwa.screen.characterSheet.detail.CharacterSheetPageUio.Node
import lwacharactersheet.composeapp.generated.resources.Res
@ -37,21 +38,19 @@ class CharacterSheetFactory(
private val skillUseCase: SkillValueComputationUseCase,
private val skillDescriptionFactory: SkillDescriptionFactory,
) {
companion object {
const val HP = "HP"
const val PP = "PP"
}
suspend fun convertToUio(
sheet: CharacterSheet,
sheet: CharacterSheet?,
diminished: Int,
): CharacterSheetPageUio {
): CharacterSheetPageUio? {
if (sheet == null) return null
return CharacterSheetPageUio(
id = sheet.id,
name = sheet.name,
characteristics = listOf(
Characteristic(
id = "STR",
id = CharacteristicId.STR,
label = getString(Res.string.character_sheet__characteristics__str),
value = "${sheet.strength}",
tooltips = TooltipUio(
@ -61,7 +60,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "DEX",
id = CharacteristicId.DEX,
label = getString(Res.string.character_sheet__characteristics__dex),
value = "${sheet.dexterity}",
tooltips = TooltipUio(
@ -71,7 +70,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "CON",
id = CharacteristicId.CON,
label = getString(Res.string.character_sheet__characteristics__con),
value = "${sheet.constitution}",
tooltips = TooltipUio(
@ -81,7 +80,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "HEI",
id = CharacteristicId.HEI,
label = getString(Res.string.character_sheet__characteristics__hei),
value = "${sheet.height}",
tooltips = TooltipUio(
@ -91,7 +90,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "INT",
id = CharacteristicId.INT,
label = getString(Res.string.character_sheet__characteristics__int),
value = "${sheet.intelligence}",
tooltips = TooltipUio(
@ -101,7 +100,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "POW",
id = CharacteristicId.POW,
label = getString(Res.string.character_sheet__characteristics__pow),
value = "${sheet.power}",
tooltips = TooltipUio(
@ -111,7 +110,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "CHA",
id = CharacteristicId.CHA,
label = getString(Res.string.character_sheet__characteristics__cha),
value = "${sheet.charisma}",
tooltips = TooltipUio(
@ -123,7 +122,7 @@ class CharacterSheetFactory(
),
subCharacteristics = listOf(
Characteristic(
id = "MOV",
id = CharacteristicId.MOV,
label = getString(Res.string.character_sheet__sub_characteristics__movement),
value = "${sheet.movement}",
tooltips = TooltipUio(
@ -133,7 +132,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = HP,
id = CharacteristicId.HP,
label = getString(Res.string.character_sheet__sub_characteristics__hit_point),
value = "${sheet.currentHp}/${sheet.maxHp}",
tooltips = TooltipUio(
@ -143,7 +142,7 @@ class CharacterSheetFactory(
editable = true,
),
Characteristic(
id = PP,
id = CharacteristicId.PP,
label = getString(Res.string.character_sheet__sub_characteristics__power_point),
value = "${sheet.currentPp}/${sheet.maxPp}",
tooltips = TooltipUio(
@ -153,7 +152,7 @@ class CharacterSheetFactory(
editable = true,
),
Characteristic(
id = "DMG",
id = CharacteristicId.DMG,
label = getString(Res.string.character_sheet__sub_characteristics__damage_bonus),
value = sheet.damageBonus,
tooltips = TooltipUio(
@ -163,7 +162,7 @@ class CharacterSheetFactory(
editable = false,
),
Characteristic(
id = "ARMOR",
id = CharacteristicId.ARMOR,
label = getString(Res.string.character_sheet__sub_characteristics__armor),
value = "${sheet.armor}",
tooltips = TooltipUio(

View file

@ -77,8 +77,8 @@ import lwacharactersheet.composeapp.generated.resources.character_sheet__skills_
import lwacharactersheet.composeapp.generated.resources.character_sheet__skills__special_title
import lwacharactersheet.composeapp.generated.resources.character_sheet__sub_characteristics__title
import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__edit__title
import lwacharactersheet.composeapp.generated.resources.ic_d20_32dp
import lwacharactersheet.composeapp.generated.resources.ic_skull_32dp
import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp
import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp
import org.jetbrains.compose.resources.getString
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
@ -295,7 +295,7 @@ fun CharacterSheetPageContent(
) {
Icon(
modifier = Modifier.size(size = 24.dp),
painter = painterResource(Res.drawable.ic_skull_32dp),
painter = painterResource(Res.drawable.ic_skull_24dp),
tint = MaterialTheme.colors.primary,
contentDescription = null,
)
@ -657,7 +657,7 @@ private fun Roll(
)
Icon(
modifier = Modifier.size(size = 24.dp),
painter = painterResource(Res.drawable.ic_d20_32dp),
painter = painterResource(Res.drawable.ic_d20_24dp),
tint = MaterialTheme.colors.primary,
contentDescription = null,
)

View file

@ -1,8 +1,8 @@
package com.pixelized.desktop.lwa.screen.characterSheet.detail
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
@ -11,14 +11,12 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.pixelized.desktop.lwa.navigation.screen.destination.CharacterSheetDestination
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
import com.pixelized.desktop.lwa.repository.characterSheet.model.CharacterSheet
import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialogUio
import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.DiminishedStatDialogUio
import com.pixelized.desktop.lwa.screen.characterSheet.detail.dialog.StatChangeDialogUio
import com.pixelized.desktop.lwa.utils.extention.collectAsState
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.runBlocking
import lwacharactersheet.composeapp.generated.resources.Res
import lwacharactersheet.composeapp.generated.resources.character_sheet__diminished__label
import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__sub_characteristics__hit_point
@ -49,33 +47,26 @@ class CharacterSheetViewModel(
private val _diminishedDialog = mutableStateOf<DiminishedStatDialogUio?>(null)
val diminishedDialog: State<DiminishedStatDialogUio?> get() = _diminishedDialog
private val diminishedValueFlow = repository.characterDiminishedFlow(id = argument.id)
val diminishedValue: State<Int?>
@Composable
@Stable
get() = repository
.characterDiminishedFlow(id = argument.id)
.collectAsState { it -> it.takeIf { it > 0 } }
get() = diminishedValueFlow.collectAsState { it ->
it.takeIf { it > 0 }
}
private val sheetFlow = combine(
repository.characterSheetFlow(id = argument.id),
repository.characterDiminishedFlow(id = argument.id),
transform = { sheet, diminished ->
factory.convertToUio(sheet = sheet, diminished = diminished)
},
)
val sheet: State<CharacterSheetPageUio?>
@Composable
@Stable
get() = combine(
repository.characterSheetFlow(id = argument.id),
repository.characterDiminishedFlow(id = argument.id),
transform = { sheet, diminished -> sheet to diminished },
).stateIn(
scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = run {
val sheet = repository.characterSheetFlow(id = argument.id).value
val diminished = repository.characterDiminishedFlow(id = argument.id).value
sheet to diminished
}
).collectAsState { (sheet, diminished) ->
sheet?.let { model ->
runBlocking { factory.convertToUio(sheet = model, diminished = diminished) }
}
}
get() = sheetFlow.collectAsState(
initial = null,
context = viewModelScope.coroutineContext,
)
fun deleteCharacter(id: String) {
repository.delete(id = id)
@ -120,14 +111,14 @@ class CharacterSheetViewModel(
suspend fun showSubCharacteristicDialog(id: String) {
repository.characterSheetFlow(id = argument.id).value?.let { sheet ->
_statChangeDialog.value = when (id) {
CharacterSheetFactory.HP -> {
CharacterSheet.CharacteristicId.HP -> {
val value = mutableStateOf(
"${sheet.currentHp}".let {
TextFieldValue(text = it, selection = TextRange(it.length))
}
)
StatChangeDialogUio(
id = CharacterSheetFactory.HP,
id = CharacterSheet.CharacteristicId.HP,
label = getString(resource = Res.string.character_sheet_edit__sub_characteristics__hit_point),
value = { value.value },
onValueChange = { value.value = it },
@ -135,14 +126,14 @@ class CharacterSheetViewModel(
)
}
CharacterSheetFactory.PP -> {
CharacterSheet.CharacteristicId.PP -> {
val value = mutableStateOf(
"${sheet.currentPp}".let {
TextFieldValue(text = it, selection = TextRange(it.length))
}
)
StatChangeDialogUio(
id = CharacterSheetFactory.PP,
id = CharacterSheet.CharacteristicId.PP,
label = getString(resource = Res.string.character_sheet_edit__sub_characteristics__power_point),
value = { value.value },
onValueChange = { value.value = it },
@ -165,8 +156,20 @@ class CharacterSheetViewModel(
) {
val sheet = repository.characterSheetFlow(id = argument.id).value
val updated = when (characteristicId) {
CharacterSheetFactory.HP -> sheet?.copy(currentHp = max(0, min(sheet.maxHp, value)))
CharacterSheetFactory.PP -> sheet?.copy(currentPp = max(0, min(sheet.maxPp, value)))
CharacterSheet.CharacteristicId.HP -> sheet?.copy(
currentHp = max(
0,
min(sheet.maxHp, value)
)
)
CharacterSheet.CharacteristicId.PP -> sheet?.copy(
currentPp = max(
0,
min(sheet.maxPp, value)
)
)
else -> null
}
updated?.let {

View file

@ -125,8 +125,8 @@ class CharacterSheetEditFactory(
label = editedSkill.label,
description = skillDescriptionFactory.baseSkillDescription(editedSkill.id),
base = "${editedSkill.base.value}",
bonus = editedSkill.bonus.value.value.toIntOrNull(),
level = editedSkill.level.value.value.toIntOrNull(),
bonus = editedSkill.bonus.value.value.takeIf { it.isNotBlank() },
level = editedSkill.level.value.value.takeIf { it.isNotBlank() },
occupation = editedSkill.option.checked.value,
used = currentSkill?.used ?: false,
)
@ -140,8 +140,8 @@ class CharacterSheetEditFactory(
label = editedSkill.label.value.value,
description = editedSkill.description.value.value,
base = editedSkill.base.value.value,
bonus = editedSkill.bonus.value.value.toIntOrNull(),
level = editedSkill.level.value.value.toIntOrNull(),
bonus = editedSkill.bonus.value.value.takeIf { it.isNotBlank() },
level = editedSkill.level.value.value.takeIf { it.isNotBlank() },
occupation = editedSkill.options.occupation,
used = currentSkill?.used ?: false,
)
@ -155,8 +155,8 @@ class CharacterSheetEditFactory(
label = editedSkill.label.value.value,
description = editedSkill.description.value.value,
base = editedSkill.base.value.value,
bonus = editedSkill.bonus.value.value.toIntOrNull(),
level = editedSkill.level.value.value.toIntOrNull(),
bonus = editedSkill.bonus.value.value.takeIf { it.isNotBlank() },
level = editedSkill.level.value.value.takeIf { it.isNotBlank() },
occupation = editedSkill.options.occupation,
used = currentSkill?.used ?: false,
)
@ -423,8 +423,8 @@ class CharacterSheetEditFactory(
descriptionValue = skill.description ?: "",
labelValue = skill.label,
baseValue = skill.base,
bonusValue = skill.bonus?.toString() ?: "",
levelValue = skill.level?.toString() ?: "",
bonusValue = skill.bonus ?: "",
levelValue = skill.level ?: "",
options = run {
val current = sheet.specialSkills.firstOrNull { it.id == skill.id }
listOf(
@ -441,12 +441,14 @@ class CharacterSheetEditFactory(
descriptionValue = skill.description ?: "",
labelValue = skill.label,
baseValue = skill.base,
bonusValue = skill.bonus?.toString() ?: "",
levelValue = skill.level?.toString() ?: "",
bonusValue = skill.bonus ?: "",
levelValue = skill.level ?: "",
options = run {
val current = sheet.magicSkills.firstOrNull { it.id == skill.id }
listOf(
skillFieldFactory.occupationOption(checked = current?.occupation ?: false),
skillFieldFactory.occupationOption(
checked = current?.occupation ?: false
),
skillFieldFactory.deleteOption { onDeleteSkill(skill.id) },
)
},
@ -483,11 +485,11 @@ class CharacterSheetEditFactory(
base = base,
bonus = skillFieldFactory.createWrapper(
label = mutableStateOf(getString(Res.string.character_sheet_edit__skills__bonus_label)),
value = skill?.bonus?.toString() ?: "",
value = skill?.bonus ?: "",
),
level = skillFieldFactory.createWrapper(
label = mutableStateOf(getString(Res.string.character_sheet_edit__skills__level_label)),
value = skill?.level?.toString() ?: "",
value = skill?.level ?: "",
),
option = skillFieldFactory.occupationOption(skill?.occupation ?: false),
)

View file

@ -3,11 +3,15 @@ package com.pixelized.desktop.lwa.screen.main
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Icon
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextButton
@ -28,11 +32,16 @@ import com.pixelized.desktop.lwa.navigation.window.destination.CharacterSheetWin
import kotlinx.coroutines.runBlocking
import lwacharactersheet.composeapp.generated.resources.Res
import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__create__title
import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp
import lwacharactersheet.composeapp.generated.resources.ic_file_24dp
import lwacharactersheet.composeapp.generated.resources.ic_folder_24dp
import lwacharactersheet.composeapp.generated.resources.ic_table_24dp
import lwacharactersheet.composeapp.generated.resources.main_page__create_action
import lwacharactersheet.composeapp.generated.resources.main_page__network_action
import lwacharactersheet.composeapp.generated.resources.main_page__open_save_directory
import lwacharactersheet.composeapp.generated.resources.main_page__roll_history_action
import org.jetbrains.compose.resources.getString
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
@ -103,65 +112,100 @@ fun MainPageContent(
) {
Column(
modifier = modifier,
verticalArrangement = Arrangement.spacedBy(16.dp),
verticalArrangement = Arrangement.spacedBy(4.dp),
) {
Column {
characters.value.forEach { sheet ->
TextButton(
onClick = { onCharacter(sheet) },
) {
Text(
modifier = Modifier.fillMaxWidth(),
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
maxLines = 1,
text = sheet.name,
)
}
characters.value.forEach { sheet ->
TextButton(
onClick = { onCharacter(sheet) },
) {
Text(
modifier = Modifier.fillMaxWidth(),
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
maxLines = 1,
text = sheet.name,
)
}
}
Spacer(modifier = Modifier.height(height = 24.dp))
TextButton(
onClick = onCreateCharacter,
) {
Text(
Row(
modifier = Modifier.fillMaxWidth(),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
text = stringResource(Res.string.main_page__create_action),
)
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(Res.drawable.ic_file_24dp),
contentDescription = null,
)
Text(
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
text = stringResource(Res.string.main_page__create_action),
)
}
}
TextButton(
onClick = onOpenSaveDirectory,
) {
Text(
Row(
modifier = Modifier.fillMaxWidth(),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
text = stringResource(Res.string.main_page__open_save_directory),
)
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(Res.drawable.ic_folder_24dp),
contentDescription = null,
)
Text(
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
text = stringResource(Res.string.main_page__open_save_directory),
)
}
}
Column {
TextButton(
onClick = onRollHistory,
TextButton(
onClick = onRollHistory,
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(Res.drawable.ic_d20_24dp),
contentDescription = null,
)
Text(
modifier = Modifier.fillMaxWidth(),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
text = stringResource(Res.string.main_page__roll_history_action),
)
}
TextButton(
onClick = onNetwork,
}
TextButton(
onClick = onNetwork,
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(Res.drawable.ic_table_24dp),
contentDescription = null,
)
Text(
modifier = Modifier.fillMaxWidth(),
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
maxLines = 1,

View file

@ -48,7 +48,7 @@ import com.pixelized.desktop.lwa.screen.roll.DifficultyUio.Difficulty
import com.pixelized.desktop.lwa.utils.DisableInteractionSource
import kotlinx.coroutines.launch
import lwacharactersheet.composeapp.generated.resources.Res
import lwacharactersheet.composeapp.generated.resources.ic_d20_32dp
import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp
import lwacharactersheet.composeapp.generated.resources.roll_page__dc__label
import lwacharactersheet.composeapp.generated.resources.roll_page__dc_easy__label
import lwacharactersheet.composeapp.generated.resources.roll_page__dc_hard__label
@ -145,7 +145,7 @@ fun RollPage(
this.rotationZ = viewModel.rollRotation.value
},
tint = MaterialTheme.colors.primary,
painter = painterResource(Res.drawable.ic_d20_32dp),
painter = painterResource(Res.drawable.ic_d20_24dp),
contentDescription = null,
)
AnimatedContent(

View file

@ -34,9 +34,10 @@ class RollUseCaseTest {
}
private fun build1D100ResultSet(count: Int = ROLL_COUNT): List<Int> {
val useCase = RollUseCase()
val result = MutableList(100) { 0 }
repeat(count) {
val roll = RollUseCase.rollD100()
val roll = useCase.rollD100()
result[roll - 1] += 1
}
return result

View file

@ -1,12 +1,12 @@
package com.pixelized.desktop.lwa.business
import com.pixelized.desktop.lwa.business.SkillNormalizerUseCase.normalize
import org.junit.Test
class SkillNormalizerUseCaseText {
@Test
fun testNormalization() {
val useCase = SkillNormalizerUseCase()
val samples = listOf(
0 to 0,
1 to 0,
@ -21,7 +21,7 @@ class SkillNormalizerUseCaseText {
10 to 10,
)
samples.forEach { (value, expected) ->
assert(normalize(value) == expected) {
assert(useCase.normalize(value) == expected) {
"$value should be normalized to $expected"
}
}