Change the UI of the spell level chooser botton sheet, cleanup some code related to icons.
This commit is contained in:
parent
251e2a972f
commit
e0fde383c8
48 changed files with 170 additions and 186 deletions
|
|
@ -3,6 +3,7 @@ package com.pixelized.rplexicon.data.model
|
|||
import android.net.Uri
|
||||
import com.pixelized.rplexicon.data.model.roll.Throw
|
||||
import com.pixelized.rplexicon.script.Script
|
||||
import com.pixelized.rplexicon.utilitary.extentions.string.attackIcon
|
||||
|
||||
data class Attack(
|
||||
val title: String,
|
||||
|
|
@ -11,8 +12,10 @@ data class Attack(
|
|||
val hit: Throw?,
|
||||
val damage: Throw?,
|
||||
val script: Script?,
|
||||
val icon: Uri?,
|
||||
private val iconUri: Uri?,
|
||||
) {
|
||||
val icon: Uri? get() = this.iconUri ?: title.attackIcon()
|
||||
|
||||
enum class Type(val key: String) {
|
||||
PHYSICAL_MELEE_ATTACK("Mêlée"),
|
||||
PHYSICAL_RANGE_ATTACK("Distance");
|
||||
|
|
|
|||
|
|
@ -2,10 +2,13 @@ package com.pixelized.rplexicon.data.model
|
|||
|
||||
import android.net.Uri
|
||||
import com.pixelized.rplexicon.data.model.roll.Throw
|
||||
import com.pixelized.rplexicon.utilitary.extentions.string.objectIcon
|
||||
|
||||
data class ObjectAction(
|
||||
val prefix: String?,
|
||||
val icon: Uri?,
|
||||
val name: String,
|
||||
val effect: Throw?,
|
||||
)
|
||||
private val iconUri: Uri?,
|
||||
) {
|
||||
val icon: Uri? get() = iconUri ?: "${prefix ?: ""}${name}".objectIcon()
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@ package com.pixelized.rplexicon.data.model
|
|||
import android.net.Uri
|
||||
import com.pixelized.rplexicon.data.model.roll.Throw
|
||||
import com.pixelized.rplexicon.script.Script
|
||||
import com.pixelized.rplexicon.utilitary.extentions.string.skillIcon
|
||||
|
||||
data class Skill(
|
||||
val name: String,
|
||||
|
|
@ -12,5 +13,7 @@ data class Skill(
|
|||
val effect: Throw?,
|
||||
val passive: Boolean,
|
||||
val script: Script?,
|
||||
val icon: Uri?,
|
||||
)
|
||||
private val iconUri: Uri?,
|
||||
) {
|
||||
val icon: Uri? get() = iconUri ?: name.skillIcon()
|
||||
}
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
package com.pixelized.rplexicon.data.model
|
||||
|
||||
import android.net.Uri
|
||||
import com.pixelized.rplexicon.utilitary.extentions.string.spellIcon
|
||||
|
||||
data class Spell(
|
||||
val icon: Uri?,
|
||||
val name: String,
|
||||
val school: School,
|
||||
val level: Int,
|
||||
|
|
@ -12,7 +12,10 @@ data class Spell(
|
|||
val requirement: String,
|
||||
val duration: String,
|
||||
val ritual: Boolean,
|
||||
private val iconUri: Uri?,
|
||||
) {
|
||||
val icon: Uri? get() = iconUri ?: name.spellIcon()
|
||||
|
||||
enum class School(val key: String) {
|
||||
ABJURATION("Abjuration"),
|
||||
DIVINATION("Divination"),
|
||||
|
|
|
|||
|
|
@ -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.Flat
|
||||
import com.pixelized.rplexicon.script.Script
|
||||
import com.pixelized.rplexicon.utilitary.extentions.string.alterationIcon
|
||||
|
||||
data class Alteration(
|
||||
val name: String,
|
||||
val source: String,
|
||||
val target: String,
|
||||
val script: Script?,
|
||||
val icon: Uri?,
|
||||
val status: Map<Property, Status>,
|
||||
private val iconUri: Uri?,
|
||||
) {
|
||||
val icon: Uri? get() = iconUri ?: name.alterationIcon()
|
||||
|
||||
data class Status(
|
||||
val name: String,
|
||||
val advantage: Boolean = false,
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ class AttackParser @Inject constructor(
|
|||
val title = row.parse(column = NAME)
|
||||
if (characterSheet != null && title != null) {
|
||||
val attack = Attack(
|
||||
icon = row.parseUri(column = ICON),
|
||||
iconUri = row.parseUri(column = ICON),
|
||||
title = title,
|
||||
type = parseType(value = row.parse(column = TYPE)),
|
||||
range = row.parse(column = RANGE),
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class ObjectActionParser @Inject constructor(
|
|||
objects.getOrPut(character) { mutableListOf() }.add(
|
||||
ObjectAction(
|
||||
prefix = row.parse(column = PREFIX),
|
||||
icon = row.parseUri(column = ICON),
|
||||
iconUri = row.parseUri(column = ICON),
|
||||
name = name,
|
||||
effect = throwParser.parse(value = row.parse(column = EFFECT)),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -28,13 +28,13 @@ class SkillParser @Inject constructor(
|
|||
val name = row.parse(column = NAME)
|
||||
if (characterSheet != null && name != null) {
|
||||
val skill = Skill(
|
||||
icon = row.parseUri(column = ICON),
|
||||
name = name,
|
||||
amount = row.parseInt(column = AMOUNT),
|
||||
rest = row.parse(column = REST),
|
||||
cost = row.parse(column = COST),
|
||||
effect = throwParser.parse(row.parse(column = EFFECT)),
|
||||
passive = row.parseBool(column = PASSIVE) ?: false,
|
||||
iconUri = row.parseUri(column = ICON),
|
||||
script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) },
|
||||
)
|
||||
skills.getOrPut(characterSheet.name) { mutableListOf() }.add(skill)
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class AlterationParser @Inject constructor(
|
|||
val target = row.parse(column = TARGET)
|
||||
if (name != null && source != null && target != null) {
|
||||
val alteration = Alteration(
|
||||
icon = row.parseUri(column = ICON),
|
||||
iconUri = row.parseUri(column = ICON),
|
||||
name = name,
|
||||
source = source,
|
||||
target = target,
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ class SpellBookParser @Inject constructor() {
|
|||
&& duration != null
|
||||
) {
|
||||
val spell = Spell(
|
||||
icon = icon,
|
||||
name = name,
|
||||
level = level,
|
||||
school = school,
|
||||
|
|
@ -46,6 +45,7 @@ class SpellBookParser @Inject constructor() {
|
|||
requirement = requirement,
|
||||
duration = duration,
|
||||
ritual = row.parseBool(column = RITUAL) ?: false,
|
||||
iconUri = icon,
|
||||
)
|
||||
spells.add(spell)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -32,7 +32,6 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
import com.pixelized.rplexicon.R
|
||||
import com.pixelized.rplexicon.ui.composable.NumberPicker
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
import com.pixelized.rplexicon.utilitary.extentions.lexicon
|
||||
import com.pixelized.rplexicon.utilitary.extentions.modifier.ddBorder
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ import androidx.compose.ui.res.stringResource
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Dialog
|
||||
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.modifier.ddBorder
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
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.modifier.ddBorder
|
||||
|
||||
|
|
|
|||
|
|
@ -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_YES
|
||||
|
|
@ -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.ui.Alignment
|
||||
|
|
@ -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.background
|
||||
|
|
@ -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_YES
|
||||
|
|
@ -6,10 +6,10 @@ import android.net.Uri
|
|||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material.IconButton
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Close
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.runtime.getValue
|
||||
|
|
@ -58,6 +58,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
|
|||
import com.pixelized.rplexicon.LocalRollOverlay
|
||||
import com.pixelized.rplexicon.NO_WINDOW_INSETS
|
||||
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.Loader
|
||||
import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
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
|
||||
|
||||
@Stable
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.core.net.toUri
|
||||
import com.pixelized.rplexicon.R
|
||||
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.FlatValue
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.unit.LayoutDirection
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.pixelized.rplexicon.R
|
||||
import com.pixelized.rplexicon.ui.composable.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient
|
||||
import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
import com.pixelized.rplexicon.utilitary.extentions.uri
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import com.pixelized.rplexicon.R
|
|||
import com.pixelized.rplexicon.data.model.roll.Dice
|
||||
import com.pixelized.rplexicon.data.model.roll.Flat
|
||||
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
|
||||
|
||||
@Stable
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
|
|||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||
import androidx.compose.ui.unit.dp
|
||||
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.DiceButton
|
||||
import com.pixelized.rplexicon.ui.screens.character.composable.common.FlatValue
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.core.net.toUri
|
||||
import com.pixelized.rplexicon.R
|
||||
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.FlatValue
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
|
|
|
|||
|
|
@ -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_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.size
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.itemsIndexed
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
|
|
@ -12,49 +20,97 @@ import androidx.compose.material3.Text
|
|||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.Stable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.ui.Alignment
|
||||
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.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.SpellLevelUio
|
||||
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellLevelChooserState
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
import com.pixelized.rplexicon.utilitary.annotateWithDropCap
|
||||
import com.pixelized.rplexicon.utilitary.extentions.lexicon
|
||||
|
||||
@Stable
|
||||
data class SpellChooserUio(
|
||||
val name: String,
|
||||
val original: String?,
|
||||
val icon: Uri?,
|
||||
val spells: List<SpellLevelUio>,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun SpellLevelChooser(
|
||||
modifier: Modifier = Modifier,
|
||||
paddingValues: PaddingValues = PaddingValues(all = 16.dp),
|
||||
spells: State<SpellChooserUio?>,
|
||||
onLevel: (spell: String, level: Int) -> Unit,
|
||||
) {
|
||||
LazyColumn(
|
||||
modifier = modifier,
|
||||
) {
|
||||
item {
|
||||
Text(
|
||||
val layoutDirection = LocalLayoutDirection.current
|
||||
Box {
|
||||
spells.value?.icon?.let { uri ->
|
||||
BackgroundImage(
|
||||
modifier = Modifier
|
||||
.padding(top = 16.dp)
|
||||
.padding(horizontal = 16.dp),
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
text = spells.value?.name ?: ""
|
||||
.size(size = 144.dp)
|
||||
.align(alignment = Alignment.TopEnd),
|
||||
model = uri,
|
||||
)
|
||||
}
|
||||
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),
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.padding(
|
||||
top = paddingValues.calculateTopPadding(),
|
||||
bottom = paddingValues.calculateBottomPadding()
|
||||
)
|
||||
.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),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
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.utilitary.annotateWithDropCap
|
||||
import com.pixelized.rplexicon.utilitary.extentions.lexicon
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Dialog
|
||||
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.utilitary.annotateWithDropCap
|
||||
import com.pixelized.rplexicon.utilitary.extentions.lexicon
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.compose.ui.window.Dialog
|
||||
import androidx.compose.ui.window.DialogProperties
|
||||
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.utilitary.annotateWithDropCap
|
||||
import com.pixelized.rplexicon.utilitary.extentions.lexicon
|
||||
|
|
|
|||
|
|
@ -13,7 +13,9 @@ import com.pixelized.rplexicon.ui.screens.character.composable.chooser.SpellChoo
|
|||
fun rememberSpellLevelChooserState() = remember {
|
||||
mutableStateOf(
|
||||
SpellChooserUio(
|
||||
name = "Cure wounds",
|
||||
name = "Soin",
|
||||
original = "Cure wounds",
|
||||
icon = null,
|
||||
spells = listOf(
|
||||
SpellLevelUio(
|
||||
spell = "",
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ class AttackUioFactory @Inject constructor() {
|
|||
|
||||
return AttackUio(
|
||||
id = attack,
|
||||
icon = attack.icon ?: attack.title.attackIcon(),
|
||||
icon = attack.icon,
|
||||
name = attack.title,
|
||||
type = when (attack.type) {
|
||||
Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class SkillFactoryUioFactory @Inject constructor(
|
|||
val modifier = effectModifier + effectFlat
|
||||
|
||||
SkillItemUio(
|
||||
icon = skill.icon ?: skill.name.skillIcon(),
|
||||
icon = skill.icon,
|
||||
label = skill.name,
|
||||
translate = description?.original,
|
||||
rest = skill.rest,
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ class SpellUioFactory @Inject constructor(
|
|||
}
|
||||
}
|
||||
return SpellUio(
|
||||
icon = assignedSpell.spell.icon ?: assignedSpell.spell.name.spellIcon(),
|
||||
icon = assignedSpell.spell.icon,
|
||||
school = assignedSpell.spell.school,
|
||||
name = assignedSpell.spell.name,
|
||||
translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original,
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ fun ActionPage(
|
|||
}
|
||||
},
|
||||
onObject = {
|
||||
objectsViewModel.showObjectDetailDialog(item = it.name)
|
||||
objectsViewModel.showObjectDetailDialog(name = it.name)
|
||||
},
|
||||
onUseObject = {
|
||||
objectsViewModel.onUse(it.name)?.let { throws ->
|
||||
|
|
|
|||
|
|
@ -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.screens.character.composable.actions.ObjectItemUio
|
||||
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 kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
|
|
@ -38,7 +37,7 @@ class ObjectsViewModel @Inject constructor(
|
|||
val data = objects[character]?.map {
|
||||
ObjectItemUio(
|
||||
prefix = it.prefix,
|
||||
icon = it.icon ?: "${it.prefix ?: ""}${it.name}".objectIcon(),
|
||||
icon = it.icon,
|
||||
name = it.name,
|
||||
original = descriptionRepository.getDescription(name = it.name)?.original,
|
||||
effect = it.effect,
|
||||
|
|
@ -62,12 +61,12 @@ class ObjectsViewModel @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
fun showObjectDetailDialog(item: String) {
|
||||
val description = descriptionRepository.getDescription(name = item)
|
||||
val item = objectsRepository.find(character = character, item = item)
|
||||
fun showObjectDetailDialog(name: String) {
|
||||
val description = descriptionRepository.getDescription(name = name)
|
||||
val item = objectsRepository.find(character = character, item = name)
|
||||
if (item != null && description != null) {
|
||||
_objectDetailDialog.value = SkillDialogDetailUio(
|
||||
icon = item.icon ?: item.name.objectIcon(),
|
||||
icon = item.icon,
|
||||
name = item.name,
|
||||
original = description.original,
|
||||
description = description.description
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ class SkillsViewModel @Inject constructor(
|
|||
val skill = skillRepository.find(character = character, skill = item)
|
||||
if (skill != null && description != null) {
|
||||
_skillDetailDialog.value = SkillDialogDetailUio(
|
||||
icon = skill.icon ?: skill.name.skillIcon(),
|
||||
icon = skill.icon,
|
||||
name = skill.name,
|
||||
original = description.original,
|
||||
description = description.description
|
||||
|
|
|
|||
|
|
@ -111,11 +111,16 @@ class SpellsViewModel @Inject constructor(
|
|||
character = characterName,
|
||||
spell = name,
|
||||
)
|
||||
val description = descriptionRepository.getDescription(
|
||||
name = assignedSpell?.spell?.name,
|
||||
)
|
||||
if (assignedSpell != null && character != null && characterFire != null) {
|
||||
val icon = assignedSpell.effect?.dice?.icon ?: R.drawable.ic_d20_24
|
||||
val base = assignedSpell.effect?.toString(character = character, level = 1) ?: ""
|
||||
_preparedSpellLevel.value = SpellChooserUio(
|
||||
name = name,
|
||||
original = description?.original,
|
||||
icon = assignedSpell.spell.icon,
|
||||
spells = List(
|
||||
size = max(0, character.highestSpellLevel() + 1 - assignedSpell.spell.level)
|
||||
) { index ->
|
||||
|
|
@ -188,7 +193,7 @@ class SpellsViewModel @Inject constructor(
|
|||
val spell = spellRepository.findSpell(name = item)
|
||||
if (spell != null && description != null) {
|
||||
_spellDetailDialog.value = SpellDialogDetailUio(
|
||||
icon = spell.icon ?: spell.name.spellIcon(),
|
||||
icon = spell.icon,
|
||||
name = spell.name,
|
||||
translated = description.original,
|
||||
level = "${spell.level}",
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ class AlterationViewModel @Inject constructor(
|
|||
name = alteration.name,
|
||||
)
|
||||
_alterationDetailDialog.value = AlterationDialogDetailUio(
|
||||
icon = alteration.icon ?: alteration.name.alterationIcon(),
|
||||
icon = alteration.icon,
|
||||
name = id,
|
||||
original = description?.original,
|
||||
source = alteration.source,
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ class ProficiencyViewModel @Inject constructor(
|
|||
val skill = skillRepository.find(character = character, skill = item)
|
||||
if (skill != null && description != null) {
|
||||
_skillDetailDialog.value = SkillDialogDetailUio(
|
||||
icon = skill.icon ?: skill.name.skillIcon(),
|
||||
icon = skill.icon,
|
||||
name = skill.name,
|
||||
original = description.original,
|
||||
description = description.description
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ import androidx.compose.ui.unit.Dp
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
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.screens.navigateToCharacterSheet
|
||||
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexicon
|
||||
|
|
|
|||
|
|
@ -51,10 +51,10 @@ import androidx.compose.ui.unit.Dp
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import com.pixelized.rplexicon.R
|
||||
import com.pixelized.rplexicon.ui.composable.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.composable.images.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
|
||||
import com.pixelized.rplexicon.ui.navigation.screens.navigateToCharacterSheet
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import androidx.compose.ui.layout.ContentScale
|
|||
import androidx.compose.ui.layout.onSizeChanged
|
||||
import androidx.compose.ui.unit.IntSize
|
||||
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.utilitary.extentions.lexicon
|
||||
|
||||
|
|
|
|||
|
|
@ -76,11 +76,11 @@ import androidx.compose.ui.unit.min
|
|||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import com.pixelized.rplexicon.LocalSnack
|
||||
import com.pixelized.rplexicon.R
|
||||
import com.pixelized.rplexicon.ui.composable.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.composable.rememberBackgroundGradient
|
||||
import com.pixelized.rplexicon.ui.composable.images.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.composable.images.rememberBackgroundGradient
|
||||
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
|
||||
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
|
|
|
|||
|
|
@ -53,10 +53,10 @@ import androidx.compose.ui.unit.Dp
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import com.pixelized.rplexicon.R
|
||||
import com.pixelized.rplexicon.ui.composable.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.composable.images.AsyncImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.BackgroundImage
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageHandler
|
||||
import com.pixelized.rplexicon.ui.composable.images.FullScreenImageViewModel
|
||||
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
|
||||
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail
|
||||
import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ class RollOverlayViewModel @Inject constructor(
|
|||
)
|
||||
if (alteration != null) {
|
||||
_alterationDetailDialog.value = AlterationDialogDetailUio(
|
||||
icon = alteration.icon ?: alteration.name.alterationIcon(),
|
||||
icon = alteration.icon,
|
||||
name = id,
|
||||
original = description?.original,
|
||||
source = alteration.source,
|
||||
|
|
|
|||
|
|
@ -24,13 +24,13 @@ class AlterationFactory @Inject constructor(
|
|||
actives: Map<String, Boolean>,
|
||||
description: Map<String, Description>,
|
||||
): List<AlterationItemUio> {
|
||||
return alterations.map {
|
||||
return alterations.map { alteration ->
|
||||
AlterationItemUio(
|
||||
icon = it.icon ?: it.name.alterationIcon(),
|
||||
label = it.name,
|
||||
source = it.source,
|
||||
subLabel = description[it.name]?.original,
|
||||
checked = actives[it.name] ?: false,
|
||||
icon = alteration.icon,
|
||||
label = alteration.name,
|
||||
source = alteration.source,
|
||||
subLabel = description[alteration.name]?.original,
|
||||
checked = actives[alteration.name] ?: false,
|
||||
override = false,
|
||||
)
|
||||
}
|
||||
|
|
@ -145,14 +145,14 @@ class AlterationFactory @Inject constructor(
|
|||
return alterationRepository
|
||||
.getAssignedAlterations(character = diceThrow.character, *properties.toTypedArray())
|
||||
.firstOrNull()
|
||||
?.map { alt ->
|
||||
?.map { alteration ->
|
||||
AlterationItemUio(
|
||||
icon = alt.icon,
|
||||
label = alt.name,
|
||||
subLabel = description[alt.name]?.original,
|
||||
source = alt.source,
|
||||
checked = override[alt.name] ?: checked[alt.name] ?: false,
|
||||
override = override[alt.name]?.let { it != checked[alt.name] } ?: false,
|
||||
icon = alteration.icon,
|
||||
label = alteration.name,
|
||||
subLabel = description[alteration.name]?.original,
|
||||
source = alteration.source,
|
||||
checked = override[alteration.name] ?: checked[alteration.name] ?: false,
|
||||
override = override[alteration.name]?.let { it != checked[alteration.name] } ?: false,
|
||||
)
|
||||
} ?: emptyList()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
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.navigation.LocalScreenNavHost
|
||||
import com.pixelized.rplexicon.ui.theme.LexiconTheme
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ class StatisticViewModel @Inject constructor(
|
|||
|
||||
if (alteration != null) {
|
||||
_alterationDetailDialog.value = AlterationDialogDetailUio(
|
||||
icon = alteration.icon ?: alteration.name.alterationIcon(),
|
||||
icon = alteration.icon,
|
||||
name = name,
|
||||
original = description?.original,
|
||||
source = alteration.source,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue