Refactor a bit the header part of the character sheet.

This commit is contained in:
Thomas Andres Gomez 2023-10-30 12:25:17 +01:00
parent 854458903d
commit ae5493336b
6 changed files with 148 additions and 99 deletions

View file

@ -4,6 +4,7 @@ package com.pixelized.rplexicon.ui.screens.character
import android.content.res.Configuration import android.content.res.Configuration
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.annotation.StringRes
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
@ -42,6 +43,9 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.material3.minimumInteractiveComponentSize
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.derivedStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -57,14 +61,21 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex import androidx.compose.ui.zIndex
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.LocalRollOverlay
import com.pixelized.rplexicon.LocalSnack
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.Loader import com.pixelized.rplexicon.ui.composable.Loader
import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog
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.screens.character.CharacterHeader.Action
import com.pixelized.rplexicon.ui.screens.character.CharacterHeader.Alteration
import com.pixelized.rplexicon.ui.screens.character.CharacterHeader.Inventory
import com.pixelized.rplexicon.ui.screens.character.CharacterHeader.Proficiency
import com.pixelized.rplexicon.ui.screens.character.composable.character.CharacterSheetHeader
import com.pixelized.rplexicon.ui.screens.character.composable.character.CharacterSheetHeaderUio
import com.pixelized.rplexicon.ui.screens.character.composable.character.ProficiencyUio.ID.* import com.pixelized.rplexicon.ui.screens.character.composable.character.ProficiencyUio.ID.*
import com.pixelized.rplexicon.ui.screens.character.composable.character.StatUio.ID.* import com.pixelized.rplexicon.ui.screens.character.composable.character.StatUio.ID.*
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberCharacterHeaderStatePreview
import com.pixelized.rplexicon.ui.screens.character.pages.actions.ActionPage import com.pixelized.rplexicon.ui.screens.character.pages.actions.ActionPage
import com.pixelized.rplexicon.ui.screens.character.pages.actions.ActionPagePreview import com.pixelized.rplexicon.ui.screens.character.pages.actions.ActionPagePreview
import com.pixelized.rplexicon.ui.screens.character.pages.actions.AttacksViewModel import com.pixelized.rplexicon.ui.screens.character.pages.actions.AttacksViewModel
@ -87,6 +98,14 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme
import com.pixelized.rplexicon.utilitary.extentions.lexiconShadow import com.pixelized.rplexicon.utilitary.extentions.lexiconShadow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
enum class CharacterHeader(@StringRes val label: Int) {
Action(R.string.character_sheet_tab_actions),
Alteration(R.string.character_sheet_tab_alteration),
Inventory(R.string.character_sheet_tab_inventory),
Proficiency(R.string.character_sheet_tab_proficiency),
}
@OptIn( @OptIn(
ExperimentalMaterialApi::class, ExperimentalMaterialApi::class,
ExperimentalFoundationApi::class, ExperimentalFoundationApi::class,
@ -103,7 +122,6 @@ fun CharacterSheetScreen(
skillViewModel: SkillsViewModel = hiltViewModel(), skillViewModel: SkillsViewModel = hiltViewModel(),
alterationsViewModel: AlterationViewModel = hiltViewModel(), alterationsViewModel: AlterationViewModel = hiltViewModel(),
) { ) {
val snack = LocalSnack.current
val screen = LocalScreenNavHost.current val screen = LocalScreenNavHost.current
val overlay = LocalRollOverlay.current val overlay = LocalRollOverlay.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
@ -115,14 +133,9 @@ fun CharacterSheetScreen(
refreshing = false, refreshing = false,
onRefresh = { scope.launch { viewModel.update(force = true) } }, onRefresh = { scope.launch { viewModel.update(force = true) } },
) )
val pagerState = rememberPagerState { val tabs = rememberHeaderTabsState()
val haveSheet = proficiencyViewModel.sheet.value != null val pagerState = rememberPagerState { tabs.value.size }
val haveAction = attacksViewModel.attacks.value.isNotEmpty()
val haveSpell = spellsViewModel.spells.value.isNotEmpty()
val haveAlteration = alterationsViewModel.alterations.value.isNotEmpty()
val haveInventory = true
haveSheet.toInt() + (haveAction || haveSpell).toInt() + haveAlteration.toInt() + haveInventory.toInt()
}
Surface( Surface(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) { ) {
@ -132,18 +145,21 @@ fun CharacterSheetScreen(
sheetState = sheetState, sheetState = sheetState,
refreshState = refresh, refreshState = refresh,
name = viewModel.character, name = viewModel.character,
onRefresh = { tabs = tabs,
scope.launch { viewModel.update(force = true) } header = headerViewModel.header,
},
onFullRefresh = {
scope.launch { viewModel.update(force = true, full = true) }
},
onBack = { onBack = {
screen.popBackStack() screen.popBackStack()
}, },
onTab = { onTab = {
scope.launch { pagerState.animateScrollToPage(it) } scope.launch { pagerState.animateScrollToPage(it) }
}, },
onHitPoint = headerViewModel::toggleHitPointDialog,
onRefresh = {
scope.launch { viewModel.update(force = true) }
},
onFullRefresh = {
scope.launch { viewModel.update(force = true, full = true) }
},
loader = { loader = {
Loader( Loader(
modifier = Modifier.align(Alignment.TopCenter), modifier = Modifier.align(Alignment.TopCenter),
@ -159,7 +175,6 @@ fun CharacterSheetScreen(
actions = { actions = {
ActionPage( ActionPage(
sheetState = sheetState, sheetState = sheetState,
headerViewModel = headerViewModel,
attacksViewModel = attacksViewModel, attacksViewModel = attacksViewModel,
objectsViewModel = objectsViewModel, objectsViewModel = objectsViewModel,
spellsViewModel = spellsViewModel, spellsViewModel = spellsViewModel,
@ -189,6 +204,12 @@ fun CharacterSheetScreen(
}, },
) )
HandleHitPointEditDialog(
dialog = headerViewModel.hitPointDialog,
onDismissRequest = headerViewModel::toggleHitPointDialog,
onConfirm = headerViewModel::applyHitPointChange,
)
HandleFetchError( HandleFetchError(
errors = viewModel.error, errors = viewModel.error,
) )
@ -217,6 +238,9 @@ private fun CharacterSheetContent(
onRefresh: () -> Unit, onRefresh: () -> Unit,
onFullRefresh: () -> Unit, onFullRefresh: () -> Unit,
name: String, name: String,
tabs: State<List<CharacterHeader>>,
header: State<CharacterSheetHeaderUio?>,
onHitPoint: () -> Unit,
onBack: () -> Unit, onBack: () -> Unit,
onTab: (Int) -> Unit, onTab: (Int) -> Unit,
loader: @Composable BoxScope.() -> Unit, loader: @Composable BoxScope.() -> Unit,
@ -276,19 +300,28 @@ private fun CharacterSheetContent(
} }
}, },
content = { content = {
Box( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.navigationBarsPadding(), .navigationBarsPadding(),
) { ) {
Column { Column(
modifier = Modifier
.zIndex(1f)
.lexiconShadow(),
) {
CharacterSheetHeader(
modifier = Modifier.fillMaxWidth(),
header = header,
onHitPoint = onHitPoint,
)
PagerHeader( PagerHeader(
modifier = Modifier
.zIndex(1f)
.lexiconShadow(),
pagerState = pagerState, pagerState = pagerState,
tabs = tabs,
onTab = onTab, onTab = onTab,
) )
}
Box {
HorizontalPager( HorizontalPager(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -297,16 +330,16 @@ private fun CharacterSheetContent(
beyondBoundsPageCount = 0, beyondBoundsPageCount = 0,
verticalAlignment = Alignment.Top, verticalAlignment = Alignment.Top,
pageContent = { page -> pageContent = { page ->
when (page) { when (tabs.value[page]) {
0 -> inventory() Action -> actions()
1 -> proficiencies() Alteration -> alterations()
2 -> actions() Inventory -> inventory()
3 -> alterations() Proficiency -> proficiencies()
} }
} }
) )
loader()
} }
loader()
} }
} }
) )
@ -320,41 +353,78 @@ private fun CharacterSheetContent(
private fun PagerHeader( private fun PagerHeader(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
pagerState: PagerState, pagerState: PagerState,
tabs: List<String> = headers(), tabs: State<List<CharacterHeader>>,
onTab: (Int) -> Unit, onTab: (Int) -> Unit,
) { ) {
ScrollableTabRow( if (tabs.value.isNotEmpty()) {
modifier = modifier, ScrollableTabRow(
selectedTabIndex = pagerState.currentPage, modifier = modifier,
divider = { }, selectedTabIndex = pagerState.currentPage,
) { edgePadding = 16.dp,
tabs.forEachIndexed { index, tab -> divider = { },
Tab( ) {
selected = pagerState.currentPage == index, tabs.value.forEachIndexed { index, tab ->
selectedContentColor = MaterialTheme.colorScheme.onSurface, Tab(
unselectedContentColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f), selected = pagerState.currentPage == index,
onClick = { onTab(index) }, selectedContentColor = MaterialTheme.colorScheme.onSurface,
) { unselectedContentColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f),
Text( onClick = { onTab(index) },
modifier = Modifier.padding(all = 8.dp), ) {
style = MaterialTheme.typography.labelSmall, Text(
text = tab, modifier = Modifier.padding(all = 8.dp),
) style = MaterialTheme.typography.labelSmall,
text = stringResource(id = tab.label),
)
}
} }
} }
} }
} }
@Stable
@Composable @Composable
private fun headers(): List<String> { @Stable
val inventory = stringResource(id = R.string.character_sheet_tab_inventory) private fun rememberHeaderTabsState(
val proficiency = stringResource(id = R.string.character_sheet_tab_proficiency) proficiencyViewModel: ProficiencyViewModel = hiltViewModel(),
val actions = stringResource(id = R.string.character_sheet_tab_actions) attacksViewModel: AttacksViewModel = hiltViewModel(),
val alteration = stringResource(id = R.string.character_sheet_tab_alteration) inventoryViewModel: InventoryViewModel = hiltViewModel(),
return remember { spellsViewModel: SpellsViewModel = hiltViewModel(),
listOf(inventory, proficiency, actions, alteration) skillViewModel: SkillsViewModel = hiltViewModel(),
alterationsViewModel: AlterationViewModel = hiltViewModel(),
): State<List<CharacterHeader>> {
val headers = remember {
derivedStateOf {
mutableListOf<CharacterHeader>().apply {
addAll(
when {
proficiencyViewModel.sheet.value != null -> listOf(Proficiency)
else -> emptyList()
}
)
addAll(
when {
attacksViewModel.attacks.value.isNotEmpty() ||
spellsViewModel.spells.value.isNotEmpty() ||
skillViewModel.skills.value.isNotEmpty() -> listOf(Action)
else -> emptyList()
}
)
addAll(
when {
alterationsViewModel.alterations.value.isNotEmpty() -> listOf(Alteration)
else -> emptyList()
}
)
addAll(
when {
inventoryViewModel.inventory.value.isNotEmpty() -> listOf(Inventory)
else -> emptyList()
}
)
}
}
} }
return headers
} }
@OptIn(ExperimentalMaterialApi::class, ExperimentalFoundationApi::class) @OptIn(ExperimentalMaterialApi::class, ExperimentalFoundationApi::class)
@ -366,23 +436,20 @@ private fun CharacterScreenPreview(
) { ) {
LexiconTheme { LexiconTheme {
Surface { Surface {
val sheetState = rememberModalBottomSheetState(
initialValue = when (preview == 3) {
true -> ModalBottomSheetValue.Expanded
else -> ModalBottomSheetValue.Hidden
},
)
CharacterSheetContent( CharacterSheetContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
sheetState = sheetState, sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden),
pagerState = rememberPagerState(initialPage = preview) { 4 }, pagerState = rememberPagerState(initialPage = preview) { 4 },
refreshState = rememberPullRefreshState(refreshing = false, onRefresh = { }), refreshState = rememberPullRefreshState(refreshing = false, onRefresh = { }),
name = "Brulkhai", name = "Brulkhai",
header = rememberCharacterHeaderStatePreview(),
tabs = rememberHeaderPreview(),
onBack = { }, onBack = { },
onTab = { }, onTab = { },
onRefresh = { }, onRefresh = { },
onFullRefresh = { }, onFullRefresh = { },
loader = { }, loader = { },
onHitPoint = { },
proficiencies = { ProficiencyPreview() }, proficiencies = { ProficiencyPreview() },
actions = { ActionPagePreview() }, actions = { ActionPagePreview() },
alterations = { AlterationPagePreview() }, alterations = { AlterationPagePreview() },
@ -393,7 +460,18 @@ private fun CharacterScreenPreview(
} }
} }
private fun Boolean.toInt(): Int = if (this) 1 else 0 @Composable
@Stable
private fun rememberHeaderPreview(): State<List<CharacterHeader>> = remember {
mutableStateOf(
listOf(
Proficiency,
Action,
Alteration,
Inventory,
)
)
}
private class CharacterScreenPreviewProvider : PreviewParameterProvider<Int> { private class CharacterScreenPreviewProvider : PreviewParameterProvider<Int> {
override val values: Sequence<Int> = sequenceOf(0, 1, 2, 3) override val values: Sequence<Int> = sequenceOf(0, 1, 2, 3)

View file

@ -32,7 +32,7 @@ data class CharacterSheetHeaderUio(
@Composable @Composable
fun CharacterSheetHeader( fun CharacterSheetHeader(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
padding : PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 8.dp), padding : PaddingValues = PaddingValues(start = 16.dp, end = 16.dp, bottom = 4.dp),
header: State<CharacterSheetHeaderUio?>, header: State<CharacterSheetHeaderUio?>,
onHitPoint : () -> Unit, onHitPoint : () -> Unit,
) { ) {

View file

@ -36,8 +36,8 @@ data class LabelPointUio(
fun LabelPoint( fun LabelPoint(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
labelStyle: TextStyle = MaterialTheme.typography.labelSmall, labelStyle: TextStyle = MaterialTheme.typography.labelSmall,
valueStyle: TextStyle = MaterialTheme.typography.headlineMedium, valueStyle: TextStyle = MaterialTheme.typography.headlineSmall,
maxStyle: TextStyle = MaterialTheme.typography.titleMedium, maxStyle: TextStyle = MaterialTheme.typography.titleSmall,
label: LabelPointUio, label: LabelPointUio,
onClick: (() -> Unit)? = null, onClick: (() -> Unit)? = null,
) { ) {

View file

@ -4,9 +4,9 @@ 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 androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
@ -24,7 +24,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.LocalRollOverlay
import com.pixelized.rplexicon.R import com.pixelized.rplexicon.R
import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog
import com.pixelized.rplexicon.ui.composable.edit.HandleSkillEditDialog import com.pixelized.rplexicon.ui.composable.edit.HandleSkillEditDialog
import com.pixelized.rplexicon.ui.composable.edit.HandleSpellEditDialog import com.pixelized.rplexicon.ui.composable.edit.HandleSpellEditDialog
import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost
@ -41,10 +40,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellHead
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellHeaderUio import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellHeaderUio
import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio
import com.pixelized.rplexicon.ui.screens.character.composable.actions.rememberTokenListStatePreview import com.pixelized.rplexicon.ui.screens.character.composable.actions.rememberTokenListStatePreview
import com.pixelized.rplexicon.ui.screens.character.composable.character.CharacterSheetHeader
import com.pixelized.rplexicon.ui.screens.character.composable.character.CharacterSheetHeaderUio
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberAttackListStatePreview import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberAttackListStatePreview
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberCharacterHeaderStatePreview
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberObjectListStatePreview import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberObjectListStatePreview
import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellListStatePreview import com.pixelized.rplexicon.ui.screens.character.composable.preview.rememberSpellListStatePreview
import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme
@ -54,7 +50,6 @@ import kotlinx.coroutines.launch
@Composable @Composable
fun ActionPage( fun ActionPage(
sheetState: ModalBottomSheetState, sheetState: ModalBottomSheetState,
headerViewModel: HeaderViewModel = hiltViewModel(),
attacksViewModel: AttacksViewModel = hiltViewModel(), attacksViewModel: AttacksViewModel = hiltViewModel(),
objectsViewModel: ObjectsViewModel = hiltViewModel(), objectsViewModel: ObjectsViewModel = hiltViewModel(),
spellsViewModel: SpellsViewModel = hiltViewModel(), spellsViewModel: SpellsViewModel = hiltViewModel(),
@ -66,12 +61,10 @@ fun ActionPage(
ActionsPageContent( ActionsPageContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
header = headerViewModel.header,
attacks = attacksViewModel.attacks, attacks = attacksViewModel.attacks,
objects = objectsViewModel.objects, objects = objectsViewModel.objects,
tokens = skillViewModel.skills, tokens = skillViewModel.skills,
spells = spellsViewModel.spells, spells = spellsViewModel.spells,
onHitPoint = headerViewModel::toggleHitPointDialog,
onAttackHit = { id -> onAttackHit = { id ->
attacksViewModel.onHitRoll(id)?.let { attacksViewModel.onHitRoll(id)?.let {
overlay.prepareRoll(diceThrow = it) overlay.prepareRoll(diceThrow = it)
@ -84,7 +77,7 @@ fun ActionPage(
overlay.showOverlay() overlay.showOverlay()
} }
}, },
onObject = { onObject = { id ->
}, },
onUseObject = { id -> onUseObject = { id ->
@ -108,7 +101,7 @@ fun ActionPage(
}, },
onSpell = { spell -> onSpell = { spell ->
screen.navigateToSpellDetail( screen.navigateToSpellDetail(
character = headerViewModel.character, character = spellsViewModel.characterName,
spell = spell, spell = spell,
) )
}, },
@ -131,12 +124,6 @@ fun ActionPage(
}, },
) )
HandleHitPointEditDialog(
dialog = headerViewModel.hitPointDialog,
onDismissRequest = headerViewModel::toggleHitPointDialog,
onConfirm = headerViewModel::applyHitPointChange,
)
HandleSpellEditDialog( HandleSpellEditDialog(
dialog = spellsViewModel.spellEditDialog, dialog = spellsViewModel.spellEditDialog,
onDismissRequest = spellsViewModel::hideSpellEditDialog, onDismissRequest = spellsViewModel::hideSpellEditDialog,
@ -160,12 +147,10 @@ fun ActionPage(
fun ActionsPageContent( fun ActionsPageContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
lazyListState: LazyListState = rememberLazyListState(), lazyListState: LazyListState = rememberLazyListState(),
header: State<CharacterSheetHeaderUio?>,
attacks: State<List<AttackUio>>, attacks: State<List<AttackUio>>,
objects: State<List<ObjectItemUio>>, objects: State<List<ObjectItemUio>>,
tokens: State<List<SkillItemUio>>, tokens: State<List<SkillItemUio>>,
spells: State<List<Pair<SpellHeaderUio, List<SpellUio>>>>, spells: State<List<Pair<SpellHeaderUio, List<SpellUio>>>>,
onHitPoint: () -> Unit,
onAttackHit: (id: String) -> Unit, onAttackHit: (id: String) -> Unit,
onAttackDamage: (id: String) -> Unit, onAttackDamage: (id: String) -> Unit,
onObject: (id: String) -> Unit, onObject: (id: String) -> Unit,
@ -182,14 +167,9 @@ fun ActionsPageContent(
Column( Column(
modifier = modifier, modifier = modifier,
) { ) {
CharacterSheetHeader(
modifier = Modifier.fillMaxWidth(),
header = header,
onHitPoint = onHitPoint,
)
LazyColumn( LazyColumn(
state = lazyListState, state = lazyListState,
contentPadding = PaddingValues(vertical = 8.dp),
) { ) {
if (attacks.value.isNotEmpty()) { if (attacks.value.isNotEmpty()) {
stickyHeader { stickyHeader {
@ -262,9 +242,6 @@ fun ActionsPageContent(
onCast = onCast, onCast = onCast,
) )
} }
items(count = 1) {
Spacer(modifier = Modifier.height(height = 16.dp))
}
} }
} }
} }
@ -278,12 +255,10 @@ fun ActionPagePreview() {
Surface { Surface {
ActionsPageContent( ActionsPageContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
header = rememberCharacterHeaderStatePreview(),
attacks = rememberAttackListStatePreview(), attacks = rememberAttackListStatePreview(),
objects = rememberObjectListStatePreview(), objects = rememberObjectListStatePreview(),
tokens = rememberTokenListStatePreview(), tokens = rememberTokenListStatePreview(),
spells = rememberSpellListStatePreview(), spells = rememberSpellListStatePreview(),
onHitPoint = { },
onAttackHit = { }, onAttackHit = { },
onAttackDamage = { }, onAttackDamage = { },
onObject = { }, onObject = { },

View file

@ -44,10 +44,6 @@ class ObjectsViewModel @Inject constructor(
} }
} }
fun onObject(name: String) {
}
fun onUse(name: String): DiceThrow? { fun onUse(name: String): DiceThrow? {
val item = objectsRepository.find(character = character, item = name) val item = objectsRepository.find(character = character, item = name)
return item?.let { return item?.let {

View file

@ -45,9 +45,9 @@ class SpellsViewModel @Inject constructor(
spellFactory: SpellUioFactory, spellFactory: SpellUioFactory,
savedStateHandle: SavedStateHandle, savedStateHandle: SavedStateHandle,
) : AndroidViewModel(application) { ) : AndroidViewModel(application) {
private val characterName = savedStateHandle.characterSheetArgument.name
private var character: CharacterSheet? = null private var character: CharacterSheet? = null
private var characterFire: CharacterSheetFire? = null private var characterFire: CharacterSheetFire? = null
val characterName = savedStateHandle.characterSheetArgument.name
private val _editDialog = mutableStateOf<SpellEditDialogUio?>(null) private val _editDialog = mutableStateOf<SpellEditDialogUio?>(null)
val spellEditDialog: State<SpellEditDialogUio?> get() = _editDialog val spellEditDialog: State<SpellEditDialogUio?> get() = _editDialog