Change the UI of the spell level chooser botton sheet, cleanup some code related to icons.

This commit is contained in:
Andres Gomez, Thomas (ITDV RL) 2024-06-13 11:45:41 +02:00
parent 251e2a972f
commit e0fde383c8
48 changed files with 170 additions and 186 deletions

View file

@ -3,6 +3,7 @@ package com.pixelized.rplexicon.data.model
import android.net.Uri import android.net.Uri
import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.data.model.roll.Throw
import com.pixelized.rplexicon.script.Script import com.pixelized.rplexicon.script.Script
import com.pixelized.rplexicon.utilitary.extentions.string.attackIcon
data class Attack( data class Attack(
val title: String, val title: String,
@ -11,8 +12,10 @@ data class Attack(
val hit: Throw?, val hit: Throw?,
val damage: Throw?, val damage: Throw?,
val script: Script?, val script: Script?,
val icon: Uri?, private val iconUri: Uri?,
) { ) {
val icon: Uri? get() = this.iconUri ?: title.attackIcon()
enum class Type(val key: String) { enum class Type(val key: String) {
PHYSICAL_MELEE_ATTACK("Mêlée"), PHYSICAL_MELEE_ATTACK("Mêlée"),
PHYSICAL_RANGE_ATTACK("Distance"); PHYSICAL_RANGE_ATTACK("Distance");

View file

@ -2,10 +2,13 @@ package com.pixelized.rplexicon.data.model
import android.net.Uri import android.net.Uri
import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.data.model.roll.Throw
import com.pixelized.rplexicon.utilitary.extentions.string.objectIcon
data class ObjectAction( data class ObjectAction(
val prefix: String?, val prefix: String?,
val icon: Uri?,
val name: String, val name: String,
val effect: Throw?, val effect: Throw?,
) private val iconUri: Uri?,
) {
val icon: Uri? get() = iconUri ?: "${prefix ?: ""}${name}".objectIcon()
}

View file

@ -3,6 +3,7 @@ package com.pixelized.rplexicon.data.model
import android.net.Uri import android.net.Uri
import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.data.model.roll.Throw
import com.pixelized.rplexicon.script.Script import com.pixelized.rplexicon.script.Script
import com.pixelized.rplexicon.utilitary.extentions.string.skillIcon
data class Skill( data class Skill(
val name: String, val name: String,
@ -12,5 +13,7 @@ data class Skill(
val effect: Throw?, val effect: Throw?,
val passive: Boolean, val passive: Boolean,
val script: Script?, val script: Script?,
val icon: Uri?, private val iconUri: Uri?,
) ) {
val icon: Uri? get() = iconUri ?: name.skillIcon()
}

View file

@ -1,9 +1,9 @@
package com.pixelized.rplexicon.data.model package com.pixelized.rplexicon.data.model
import android.net.Uri import android.net.Uri
import com.pixelized.rplexicon.utilitary.extentions.string.spellIcon
data class Spell( data class Spell(
val icon: Uri?,
val name: String, val name: String,
val school: School, val school: School,
val level: Int, val level: Int,
@ -12,7 +12,10 @@ data class Spell(
val requirement: String, val requirement: String,
val duration: String, val duration: String,
val ritual: Boolean, val ritual: Boolean,
private val iconUri: Uri?,
) { ) {
val icon: Uri? get() = iconUri ?: name.spellIcon()
enum class School(val key: String) { enum class School(val key: String) {
ABJURATION("Abjuration"), ABJURATION("Abjuration"),
DIVINATION("Divination"), DIVINATION("Divination"),

View file

@ -5,15 +5,18 @@ import com.pixelized.rplexicon.data.model.Property
import com.pixelized.rplexicon.data.model.roll.Dice import com.pixelized.rplexicon.data.model.roll.Dice
import com.pixelized.rplexicon.data.model.roll.Flat import com.pixelized.rplexicon.data.model.roll.Flat
import com.pixelized.rplexicon.script.Script import com.pixelized.rplexicon.script.Script
import com.pixelized.rplexicon.utilitary.extentions.string.alterationIcon
data class Alteration( data class Alteration(
val name: String, val name: String,
val source: String, val source: String,
val target: String, val target: String,
val script: Script?, val script: Script?,
val icon: Uri?,
val status: Map<Property, Status>, val status: Map<Property, Status>,
private val iconUri: Uri?,
) { ) {
val icon: Uri? get() = iconUri ?: name.alterationIcon()
data class Status( data class Status(
val name: String, val name: String,
val advantage: Boolean = false, val advantage: Boolean = false,

View file

@ -31,7 +31,7 @@ class AttackParser @Inject constructor(
val title = row.parse(column = NAME) val title = row.parse(column = NAME)
if (characterSheet != null && title != null) { if (characterSheet != null && title != null) {
val attack = Attack( val attack = Attack(
icon = row.parseUri(column = ICON), iconUri = row.parseUri(column = ICON),
title = title, title = title,
type = parseType(value = row.parse(column = TYPE)), type = parseType(value = row.parse(column = TYPE)),
range = row.parse(column = RANGE), range = row.parse(column = RANGE),

View file

@ -24,7 +24,7 @@ class ObjectActionParser @Inject constructor(
objects.getOrPut(character) { mutableListOf() }.add( objects.getOrPut(character) { mutableListOf() }.add(
ObjectAction( ObjectAction(
prefix = row.parse(column = PREFIX), prefix = row.parse(column = PREFIX),
icon = row.parseUri(column = ICON), iconUri = row.parseUri(column = ICON),
name = name, name = name,
effect = throwParser.parse(value = row.parse(column = EFFECT)), effect = throwParser.parse(value = row.parse(column = EFFECT)),
) )

View file

@ -28,13 +28,13 @@ class SkillParser @Inject constructor(
val name = row.parse(column = NAME) val name = row.parse(column = NAME)
if (characterSheet != null && name != null) { if (characterSheet != null && name != null) {
val skill = Skill( val skill = Skill(
icon = row.parseUri(column = ICON),
name = name, name = name,
amount = row.parseInt(column = AMOUNT), amount = row.parseInt(column = AMOUNT),
rest = row.parse(column = REST), rest = row.parse(column = REST),
cost = row.parse(column = COST), cost = row.parse(column = COST),
effect = throwParser.parse(row.parse(column = EFFECT)), effect = throwParser.parse(row.parse(column = EFFECT)),
passive = row.parseBool(column = PASSIVE) ?: false, passive = row.parseBool(column = PASSIVE) ?: false,
iconUri = row.parseUri(column = ICON),
script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) }, script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) },
) )
skills.getOrPut(characterSheet.name) { mutableListOf() }.add(skill) skills.getOrPut(characterSheet.name) { mutableListOf() }.add(skill)

View file

@ -35,7 +35,7 @@ class AlterationParser @Inject constructor(
val target = row.parse(column = TARGET) val target = row.parse(column = TARGET)
if (name != null && source != null && target != null) { if (name != null && source != null && target != null) {
val alteration = Alteration( val alteration = Alteration(
icon = row.parseUri(column = ICON), iconUri = row.parseUri(column = ICON),
name = name, name = name,
source = source, source = source,
target = target, target = target,

View file

@ -37,7 +37,6 @@ class SpellBookParser @Inject constructor() {
&& duration != null && duration != null
) { ) {
val spell = Spell( val spell = Spell(
icon = icon,
name = name, name = name,
level = level, level = level,
school = school, school = school,
@ -46,6 +45,7 @@ class SpellBookParser @Inject constructor() {
requirement = requirement, requirement = requirement,
duration = duration, duration = duration,
ritual = row.parseBool(column = RITUAL) ?: false, ritual = row.parseBool(column = RITUAL) ?: false,
iconUri = icon,
) )
spells.add(spell) spells.add(spell)
} }

View file

@ -1,91 +0,0 @@
package com.pixelized.rplexicon.ui.composable
import androidx.compose.animation.core.animateIntAsState
import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.unit.Velocity
private val List<Measurable>.grid: Measurable get() = first { it.layoutId == GRID_ID }
private val List<Measurable>.header: Measurable get() = first { it.layoutId == HEADER_ID }
private const val GRID_ID = "GRID_ID"
private const val HEADER_ID = "HEADER_ID"
@Composable
fun CollapsingHeader(
modifier: Modifier = Modifier,
header: @Composable () -> Unit,
content: @Composable () -> Unit
) {
val headerHeight = rememberSaveable { mutableStateOf(0) }
val headerScroll = rememberSaveable { mutableStateOf(0) }
val animatedHeaderScroll = animateIntAsState(
targetValue = headerScroll.value,
label = "HeaderSnapAnimation",
)
val nestedScrollConnection = remember {
object : NestedScrollConnection {
override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
val scroll = (headerScroll.value + available.y.toInt()).coerceIn(
minimumValue = -headerHeight.value,
maximumValue = 0,
)
return if (headerScroll.value != scroll) {
headerScroll.value = scroll
available
} else {
Offset.Zero
}
}
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
headerScroll.value = if (headerScroll.value < -headerHeight.value / 2) {
-headerHeight.value
} else {
0
}
return super.onPostFling(consumed, available)
}
}
}
Layout(
modifier = modifier.nestedScroll(nestedScrollConnection),
content = {
Box(
modifier = Modifier.layoutId(HEADER_ID),
content = { header() },
)
Box(
modifier = Modifier.layoutId(GRID_ID),
content = { content() },
)
},
measurePolicy = { measurables, constraints ->
val headerPlaceable = measurables.header.measure(constraints)
val gridPlaceable = measurables.grid.measure(constraints)
if (headerHeight.value == 0) {
headerHeight.value = headerPlaceable.height
}
layout(constraints.maxWidth, constraints.maxHeight) {
headerPlaceable.place(0, animatedHeaderScroll.value)
gridPlaceable.place(0, headerPlaceable.height + animatedHeaderScroll.value)
}
}
)
}

View file

@ -32,7 +32,6 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder

View file

@ -24,7 +24,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder

View file

@ -25,7 +25,6 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.NumberPicker
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.ui.composable package com.pixelized.rplexicon.ui.composable.edit
import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Configuration.UI_MODE_NIGHT_YES

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.ui.composable package com.pixelized.rplexicon.ui.composable.images
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.ui.composable package com.pixelized.rplexicon.ui.composable.images
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background

View file

@ -1,4 +1,4 @@
package com.pixelized.rplexicon.ui.composable package com.pixelized.rplexicon.ui.composable.images
import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Configuration.UI_MODE_NIGHT_YES
@ -6,10 +6,10 @@ import android.net.Uri
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue

View file

@ -58,6 +58,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.LocalRollOverlay
import com.pixelized.rplexicon.NO_WINDOW_INSETS import com.pixelized.rplexicon.NO_WINDOW_INSETS
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.Handle
import com.pixelized.rplexicon.ui.composable.KeepOnScreen import com.pixelized.rplexicon.ui.composable.KeepOnScreen
import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.Loader
import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog

View file

@ -35,7 +35,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
@Stable @Stable

View file

@ -30,7 +30,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.net.toUri import androidx.core.net.toUri
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.data.model.Attack import com.pixelized.rplexicon.data.model.Attack
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton
import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme

View file

@ -38,8 +38,8 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.uri import com.pixelized.rplexicon.utilitary.extentions.uri

View file

@ -31,7 +31,7 @@ import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.data.model.roll.Dice import com.pixelized.rplexicon.data.model.roll.Dice
import com.pixelized.rplexicon.data.model.roll.Flat import com.pixelized.rplexicon.data.model.roll.Flat
import com.pixelized.rplexicon.data.model.roll.Throw import com.pixelized.rplexicon.data.model.roll.Throw
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
@Stable @Stable

View file

@ -30,7 +30,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.screens.character.composable.common.CounterButton import com.pixelized.rplexicon.ui.screens.character.composable.common.CounterButton
import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton
import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue

View file

@ -35,7 +35,7 @@ import androidx.compose.ui.unit.dp
import androidx.core.net.toUri import androidx.core.net.toUri
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.data.model.Spell import com.pixelized.rplexicon.data.model.Spell
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton import com.pixelized.rplexicon.ui.screens.character.composable.common.DiceButton
import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme

View file

@ -2,7 +2,15 @@ package com.pixelized.rplexicon.ui.screens.character.composable.chooser
import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.net.Uri
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.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
@ -12,49 +20,97 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.composable.Handle
import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelItem import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelItem
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelUio import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellLevelUio
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellLevelChooserState import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellLevelChooserState
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon
@Stable @Stable
data class SpellChooserUio( data class SpellChooserUio(
val name: String, val name: String,
val original: String?,
val icon: Uri?,
val spells: List<SpellLevelUio>, val spells: List<SpellLevelUio>,
) )
@Composable @Composable
fun SpellLevelChooser( fun SpellLevelChooser(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
paddingValues: PaddingValues = PaddingValues(all = 16.dp),
spells: State<SpellChooserUio?>, spells: State<SpellChooserUio?>,
onLevel: (spell: String, level: Int) -> Unit, onLevel: (spell: String, level: Int) -> Unit,
) { ) {
LazyColumn( val layoutDirection = LocalLayoutDirection.current
modifier = modifier, Box {
) { spells.value?.icon?.let { uri ->
item { BackgroundImage(
Text(
modifier = Modifier modifier = Modifier
.padding(top = 16.dp) .size(size = 144.dp)
.padding(horizontal = 16.dp), .align(alignment = Alignment.TopEnd),
style = MaterialTheme.typography.titleLarge, model = uri,
text = spells.value?.name ?: ""
) )
} }
itemsIndexed( Column(
items = spells.value?.spells ?: emptyList(), modifier = Modifier
) { index, item -> .padding(
SpellLevelItem( top = paddingValues.calculateTopPadding(),
spell = item, bottom = paddingValues.calculateBottomPadding()
onSpellCast = onLevel,
)
if (index < (spells.value?.spells?.lastIndex ?: 0)) {
HorizontalDivider(
modifier = Modifier.padding(horizontal = 16.dp),
) )
.then(other = modifier),
verticalArrangement = Arrangement.spacedBy(space = 16.dp),
) {
Handle(
modifier = Modifier.align(alignment = Alignment.CenterHorizontally)
)
LazyColumn {
item {
Column(
modifier = Modifier.padding(
start = paddingValues.calculateStartPadding(layoutDirection),
end = paddingValues.calculateEndPadding(layoutDirection)
)
) {
Text(
style = MaterialTheme.typography.titleMedium,
text = annotateWithDropCap(
text = spells.value?.name ?: "",
style = MaterialTheme.lexicon.typography.dropCap.titleMedium,
)
)
spells.value?.original?.let { original ->
Text(
style = MaterialTheme.typography.labelSmall,
fontWeight = FontWeight.Light,
fontStyle = FontStyle.Italic,
text = original,
)
}
}
}
itemsIndexed(
items = spells.value?.spells ?: emptyList(),
) { index, item ->
SpellLevelItem(
spell = item,
onSpellCast = onLevel,
)
if (index < (spells.value?.spells?.lastIndex ?: 0)) {
HorizontalDivider(
modifier = Modifier.padding(horizontal = 16.dp),
)
}
}
} }
} }
} }

View file

@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon

View file

@ -30,7 +30,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon

View file

@ -36,7 +36,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.annotateWithDropCap
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon

View file

@ -13,7 +13,9 @@ import com.pixelized.rplexicon.ui.screens.character.composable.chooser.SpellChoo
fun rememberSpellLevelChooserState() = remember { fun rememberSpellLevelChooserState() = remember {
mutableStateOf( mutableStateOf(
SpellChooserUio( SpellChooserUio(
name = "Cure wounds", name = "Soin",
original = "Cure wounds",
icon = null,
spells = listOf( spells = listOf(
SpellLevelUio( SpellLevelUio(
spell = "", spell = "",

View file

@ -75,7 +75,7 @@ class AttackUioFactory @Inject constructor() {
return AttackUio( return AttackUio(
id = attack, id = attack,
icon = attack.icon ?: attack.title.attackIcon(), icon = attack.icon,
name = attack.title, name = attack.title,
type = when (attack.type) { type = when (attack.type) {
Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee

View file

@ -45,7 +45,7 @@ class SkillFactoryUioFactory @Inject constructor(
val modifier = effectModifier + effectFlat val modifier = effectModifier + effectFlat
SkillItemUio( SkillItemUio(
icon = skill.icon ?: skill.name.skillIcon(), icon = skill.icon,
label = skill.name, label = skill.name,
translate = description?.original, translate = description?.original,
rest = skill.rest, rest = skill.rest,

View file

@ -96,7 +96,7 @@ class SpellUioFactory @Inject constructor(
} }
} }
return SpellUio( return SpellUio(
icon = assignedSpell.spell.icon ?: assignedSpell.spell.name.spellIcon(), icon = assignedSpell.spell.icon,
school = assignedSpell.spell.school, school = assignedSpell.spell.school,
name = assignedSpell.spell.name, name = assignedSpell.spell.name,
translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original, translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original,

View file

@ -82,7 +82,7 @@ fun ActionPage(
} }
}, },
onObject = { onObject = {
objectsViewModel.showObjectDetailDialog(item = it.name) objectsViewModel.showObjectDetailDialog(name = it.name)
}, },
onUseObject = { onUseObject = {
objectsViewModel.onUse(it.name)?.let { throws -> objectsViewModel.onUse(it.name)?.let { throws ->

View file

@ -11,7 +11,6 @@ import com.pixelized.rplexicon.data.repository.character.ObjectActionRepository
import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument
import com.pixelized.rplexicon.ui.screens.character.composable.actions.ObjectItemUio import com.pixelized.rplexicon.ui.screens.character.composable.actions.ObjectItemUio
import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.SkillDialogDetailUio import com.pixelized.rplexicon.ui.screens.character.composable.dialogs.SkillDialogDetailUio
import com.pixelized.rplexicon.utilitary.extentions.string.objectIcon
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -38,7 +37,7 @@ class ObjectsViewModel @Inject constructor(
val data = objects[character]?.map { val data = objects[character]?.map {
ObjectItemUio( ObjectItemUio(
prefix = it.prefix, prefix = it.prefix,
icon = it.icon ?: "${it.prefix ?: ""}${it.name}".objectIcon(), icon = it.icon,
name = it.name, name = it.name,
original = descriptionRepository.getDescription(name = it.name)?.original, original = descriptionRepository.getDescription(name = it.name)?.original,
effect = it.effect, effect = it.effect,
@ -62,12 +61,12 @@ class ObjectsViewModel @Inject constructor(
} }
} }
fun showObjectDetailDialog(item: String) { fun showObjectDetailDialog(name: String) {
val description = descriptionRepository.getDescription(name = item) val description = descriptionRepository.getDescription(name = name)
val item = objectsRepository.find(character = character, item = item) val item = objectsRepository.find(character = character, item = name)
if (item != null && description != null) { if (item != null && description != null) {
_objectDetailDialog.value = SkillDialogDetailUio( _objectDetailDialog.value = SkillDialogDetailUio(
icon = item.icon ?: item.name.objectIcon(), icon = item.icon,
name = item.name, name = item.name,
original = description.original, original = description.original,
description = description.description description = description.description

View file

@ -87,7 +87,7 @@ class SkillsViewModel @Inject constructor(
val skill = skillRepository.find(character = character, skill = item) val skill = skillRepository.find(character = character, skill = item)
if (skill != null && description != null) { if (skill != null && description != null) {
_skillDetailDialog.value = SkillDialogDetailUio( _skillDetailDialog.value = SkillDialogDetailUio(
icon = skill.icon ?: skill.name.skillIcon(), icon = skill.icon,
name = skill.name, name = skill.name,
original = description.original, original = description.original,
description = description.description description = description.description

View file

@ -111,11 +111,16 @@ class SpellsViewModel @Inject constructor(
character = characterName, character = characterName,
spell = name, spell = name,
) )
val description = descriptionRepository.getDescription(
name = assignedSpell?.spell?.name,
)
if (assignedSpell != null && character != null && characterFire != null) { if (assignedSpell != null && character != null && characterFire != null) {
val icon = assignedSpell.effect?.dice?.icon ?: R.drawable.ic_d20_24 val icon = assignedSpell.effect?.dice?.icon ?: R.drawable.ic_d20_24
val base = assignedSpell.effect?.toString(character = character, level = 1) ?: "" val base = assignedSpell.effect?.toString(character = character, level = 1) ?: ""
_preparedSpellLevel.value = SpellChooserUio( _preparedSpellLevel.value = SpellChooserUio(
name = name, name = name,
original = description?.original,
icon = assignedSpell.spell.icon,
spells = List( spells = List(
size = max(0, character.highestSpellLevel() + 1 - assignedSpell.spell.level) size = max(0, character.highestSpellLevel() + 1 - assignedSpell.spell.level)
) { index -> ) { index ->
@ -188,7 +193,7 @@ class SpellsViewModel @Inject constructor(
val spell = spellRepository.findSpell(name = item) val spell = spellRepository.findSpell(name = item)
if (spell != null && description != null) { if (spell != null && description != null) {
_spellDetailDialog.value = SpellDialogDetailUio( _spellDetailDialog.value = SpellDialogDetailUio(
icon = spell.icon ?: spell.name.spellIcon(), icon = spell.icon,
name = spell.name, name = spell.name,
translated = description.original, translated = description.original,
level = "${spell.level}", level = "${spell.level}",

View file

@ -117,7 +117,7 @@ class AlterationViewModel @Inject constructor(
name = alteration.name, name = alteration.name,
) )
_alterationDetailDialog.value = AlterationDialogDetailUio( _alterationDetailDialog.value = AlterationDialogDetailUio(
icon = alteration.icon ?: alteration.name.alterationIcon(), icon = alteration.icon,
name = id, name = id,
original = description?.original, original = description?.original,
source = alteration.source, source = alteration.source,

View file

@ -159,7 +159,7 @@ class ProficiencyViewModel @Inject constructor(
val skill = skillRepository.find(character = character, skill = item) val skill = skillRepository.find(character = character, skill = item)
if (skill != null && description != null) { if (skill != null && description != null) {
_skillDetailDialog.value = SkillDialogDetailUio( _skillDetailDialog.value = SkillDialogDetailUio(
icon = skill.icon ?: skill.name.skillIcon(), icon = skill.icon,
name = skill.name, name = skill.name,
original = description.original, original = description.original,
description = description.description description = description.description

View file

@ -49,7 +49,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexicon import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexicon

View file

@ -51,10 +51,10 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme

View file

@ -31,7 +31,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.lexicon

View file

@ -76,11 +76,11 @@ import androidx.compose.ui.unit.min
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.LocalSnack import com.pixelized.rplexicon.LocalSnack
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme

View file

@ -53,10 +53,10 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.images.AsyncImage
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail

View file

@ -192,7 +192,7 @@ class RollOverlayViewModel @Inject constructor(
) )
if (alteration != null) { if (alteration != null) {
_alterationDetailDialog.value = AlterationDialogDetailUio( _alterationDetailDialog.value = AlterationDialogDetailUio(
icon = alteration.icon ?: alteration.name.alterationIcon(), icon = alteration.icon,
name = id, name = id,
original = description?.original, original = description?.original,
source = alteration.source, source = alteration.source,

View file

@ -24,13 +24,13 @@ class AlterationFactory @Inject constructor(
actives: Map<String, Boolean>, actives: Map<String, Boolean>,
description: Map<String, Description>, description: Map<String, Description>,
): List<AlterationItemUio> { ): List<AlterationItemUio> {
return alterations.map { return alterations.map { alteration ->
AlterationItemUio( AlterationItemUio(
icon = it.icon ?: it.name.alterationIcon(), icon = alteration.icon,
label = it.name, label = alteration.name,
source = it.source, source = alteration.source,
subLabel = description[it.name]?.original, subLabel = description[alteration.name]?.original,
checked = actives[it.name] ?: false, checked = actives[alteration.name] ?: false,
override = false, override = false,
) )
} }
@ -145,14 +145,14 @@ class AlterationFactory @Inject constructor(
return alterationRepository return alterationRepository
.getAssignedAlterations(character = diceThrow.character, *properties.toTypedArray()) .getAssignedAlterations(character = diceThrow.character, *properties.toTypedArray())
.firstOrNull() .firstOrNull()
?.map { alt -> ?.map { alteration ->
AlterationItemUio( AlterationItemUio(
icon = alt.icon, icon = alteration.icon,
label = alt.name, label = alteration.name,
subLabel = description[alt.name]?.original, subLabel = description[alteration.name]?.original,
source = alt.source, source = alteration.source,
checked = override[alt.name] ?: checked[alt.name] ?: false, checked = override[alteration.name] ?: checked[alteration.name] ?: false,
override = override[alt.name]?.let { it != checked[alt.name] } ?: false, override = override[alteration.name]?.let { it != checked[alteration.name] } ?: false,
) )
} ?: emptyList() } ?: emptyList()
} }

View file

@ -43,7 +43,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.BackgroundImage import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.composable.error.HandleFetchError
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme

View file

@ -72,7 +72,7 @@ class StatisticViewModel @Inject constructor(
if (alteration != null) { if (alteration != null) {
_alterationDetailDialog.value = AlterationDialogDetailUio( _alterationDetailDialog.value = AlterationDialogDetailUio(
icon = alteration.icon ?: alteration.name.alterationIcon(), icon = alteration.icon,
name = name, name = name,
original = description?.original, original = description?.original,
source = alteration.source, source = alteration.source,