Refactor a bit the header part of the character sheet.
This commit is contained in:
parent
854458903d
commit
ae5493336b
6 changed files with 148 additions and 99 deletions
|
|
@ -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(
|
||||||
PagerHeader(
|
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.zIndex(1f)
|
.zIndex(1f)
|
||||||
.lexiconShadow(),
|
.lexiconShadow(),
|
||||||
|
) {
|
||||||
|
CharacterSheetHeader(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
header = header,
|
||||||
|
onHitPoint = onHitPoint,
|
||||||
|
)
|
||||||
|
PagerHeader(
|
||||||
pagerState = pagerState,
|
pagerState = pagerState,
|
||||||
|
tabs = tabs,
|
||||||
onTab = onTab,
|
onTab = onTab,
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
Box {
|
||||||
HorizontalPager(
|
HorizontalPager(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
|
@ -297,18 +330,18 @@ 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,15 +353,17 @@ 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,
|
||||||
) {
|
) {
|
||||||
|
if (tabs.value.isNotEmpty()) {
|
||||||
ScrollableTabRow(
|
ScrollableTabRow(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
selectedTabIndex = pagerState.currentPage,
|
selectedTabIndex = pagerState.currentPage,
|
||||||
|
edgePadding = 16.dp,
|
||||||
divider = { },
|
divider = { },
|
||||||
) {
|
) {
|
||||||
tabs.forEachIndexed { index, tab ->
|
tabs.value.forEachIndexed { index, tab ->
|
||||||
Tab(
|
Tab(
|
||||||
selected = pagerState.currentPage == index,
|
selected = pagerState.currentPage == index,
|
||||||
selectedContentColor = MaterialTheme.colorScheme.onSurface,
|
selectedContentColor = MaterialTheme.colorScheme.onSurface,
|
||||||
|
|
@ -338,23 +373,58 @@ private fun PagerHeader(
|
||||||
Text(
|
Text(
|
||||||
modifier = Modifier.padding(all = 8.dp),
|
modifier = Modifier.padding(all = 8.dp),
|
||||||
style = MaterialTheme.typography.labelSmall,
|
style = MaterialTheme.typography.labelSmall,
|
||||||
text = tab,
|
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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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 = { },
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue