Add dynamic alteration inapp management.
This commit is contained in:
parent
2f4b30297c
commit
2f6d0b3819
34 changed files with 639 additions and 97 deletions
|
|
@ -15,10 +15,12 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
|
||||||
import com.pixelized.desktop.lwa.repository.settings.SettingsStore
|
import com.pixelized.desktop.lwa.repository.settings.SettingsStore
|
||||||
import com.pixelized.desktop.lwa.repository.tag.TagRepository
|
import com.pixelized.desktop.lwa.repository.tag.TagRepository
|
||||||
import com.pixelized.desktop.lwa.repository.tag.TagStore
|
import com.pixelized.desktop.lwa.repository.tag.TagStore
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogFactory
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogViewModel
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogFactory
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogFactory
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogFactory
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlayViewModel
|
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlayViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
|
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory
|
import com.pixelized.desktop.lwa.ui.screen.campaign.network.NetworkFactory
|
||||||
|
|
@ -128,6 +130,7 @@ val factoryDependencies
|
||||||
factoryOf(::CharacterDetailFactory)
|
factoryOf(::CharacterDetailFactory)
|
||||||
factoryOf(::CharacterSheetCharacteristicDialogFactory)
|
factoryOf(::CharacterSheetCharacteristicDialogFactory)
|
||||||
factoryOf(::CharacterSheetDiminishedDialogFactory)
|
factoryOf(::CharacterSheetDiminishedDialogFactory)
|
||||||
|
factoryOf(::CharacterSheetAlterationDialogFactory)
|
||||||
factoryOf(::TextMessageFactory)
|
factoryOf(::TextMessageFactory)
|
||||||
factoryOf(::LevelUpFactory)
|
factoryOf(::LevelUpFactory)
|
||||||
factoryOf(::GMTagFactory)
|
factoryOf(::GMTagFactory)
|
||||||
|
|
@ -148,8 +151,9 @@ val viewModelDependencies
|
||||||
viewModelOf(::PlayerRibbonViewModel)
|
viewModelOf(::PlayerRibbonViewModel)
|
||||||
viewModelOf(::NpcRibbonViewModel)
|
viewModelOf(::NpcRibbonViewModel)
|
||||||
viewModelOf(::CharacterDetailViewModel)
|
viewModelOf(::CharacterDetailViewModel)
|
||||||
viewModelOf(::CharacterSheetDiminishedViewModel)
|
viewModelOf(::CharacterSheetDiminishedDialogViewModel)
|
||||||
viewModelOf(::CharacterDetailCharacteristicDialogViewModel)
|
viewModelOf(::CharacterSheetCharacteristicDialogViewModel)
|
||||||
|
viewModelOf(::CharacterSheetAlterationDialogViewModel)
|
||||||
viewModelOf(::CampaignChatViewModel)
|
viewModelOf(::CampaignChatViewModel)
|
||||||
viewModelOf(::SettingsViewModel)
|
viewModelOf(::SettingsViewModel)
|
||||||
viewModelOf(::LevelUpViewModel)
|
viewModelOf(::LevelUpViewModel)
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ interface LwaClient {
|
||||||
|
|
||||||
suspend fun putCharacterAlteration(
|
suspend fun putCharacterAlteration(
|
||||||
characterSheetId: String,
|
characterSheetId: String,
|
||||||
alterationId: Int,
|
alterationId: String,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
): APIResponse<Unit>
|
): APIResponse<Unit>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ class LwaClientImpl(
|
||||||
@Throws
|
@Throws
|
||||||
override suspend fun putCharacterAlteration(
|
override suspend fun putCharacterAlteration(
|
||||||
characterSheetId: String,
|
characterSheetId: String,
|
||||||
alterationId: Int,
|
alterationId: String,
|
||||||
active: Boolean,
|
active: Boolean,
|
||||||
) = client
|
) = client
|
||||||
.put("$root/character/update/alteration?characterSheetId=$characterSheetId&alterationId=$alterationId&active=$active")
|
.put("$root/character/update/alteration?characterSheetId=$characterSheetId&alterationId=$alterationId&active=$active")
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import kotlinx.coroutines.flow.SharingStarted
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.stateIn
|
import kotlinx.coroutines.flow.stateIn
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
|
|
||||||
class CharacterSheetRepository(
|
class CharacterSheetRepository(
|
||||||
private val store: CharacterSheetStore,
|
private val store: CharacterSheetStore,
|
||||||
|
|
@ -64,6 +63,19 @@ class CharacterSheetRepository(
|
||||||
store.deleteCharacterSheet(characterSheetId = characterSheetId)
|
store.deleteCharacterSheet(characterSheetId = characterSheetId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Throws
|
||||||
|
suspend fun updateAlteration(
|
||||||
|
characterSheetId: String,
|
||||||
|
alterationId: String,
|
||||||
|
active: Boolean,
|
||||||
|
) {
|
||||||
|
store.putCharacterAlteration(
|
||||||
|
characterSheetId = characterSheetId,
|
||||||
|
alterationId = alterationId,
|
||||||
|
active = active,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun checkCharacterSheetIdValidity(
|
fun checkCharacterSheetIdValidity(
|
||||||
characterSheetId: String,
|
characterSheetId: String,
|
||||||
): Boolean {
|
): Boolean {
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,7 @@ class CharacterSheetStore(
|
||||||
) {
|
) {
|
||||||
val json = factory.convertToJson(sheet = sheet)
|
val json = factory.convertToJson(sheet = sheet)
|
||||||
val request = client.putCharacter(sheet = json)
|
val request = client.putCharacter(sheet = json)
|
||||||
if (request.success) {
|
if (request.success.not()) {
|
||||||
LwaClient.error(error = request)
|
LwaClient.error(error = request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -104,7 +104,23 @@ class CharacterSheetStore(
|
||||||
characterSheetId: String,
|
characterSheetId: String,
|
||||||
) {
|
) {
|
||||||
val request = client.deleteCharacterSheet(characterSheetId = characterSheetId)
|
val request = client.deleteCharacterSheet(characterSheetId = characterSheetId)
|
||||||
if (request.success) {
|
if (request.success.not()) {
|
||||||
|
LwaClient.error(error = request)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Throws
|
||||||
|
suspend fun putCharacterAlteration(
|
||||||
|
characterSheetId: String,
|
||||||
|
alterationId: String,
|
||||||
|
active: Boolean,
|
||||||
|
) {
|
||||||
|
val request = client.putCharacterAlteration(
|
||||||
|
characterSheetId = characterSheetId,
|
||||||
|
alterationId = alterationId,
|
||||||
|
active = active,
|
||||||
|
)
|
||||||
|
if (request.success.not()) {
|
||||||
LwaClient.error(error = request)
|
LwaClient.error(error = request)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,84 @@
|
||||||
|
package com.pixelized.desktop.lwa.ui.composable.character.alterteration
|
||||||
|
|
||||||
|
import androidx.compose.animation.animateColorAsState
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.IntrinsicSize
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.height
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.minimumInteractiveComponentSize
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.Stable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTag
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.theme.lwa
|
||||||
|
|
||||||
|
@Stable
|
||||||
|
data class AlterationToggleItemUio(
|
||||||
|
val id: String,
|
||||||
|
val label: String,
|
||||||
|
val tags: List<GMTagUio>,
|
||||||
|
val active: Boolean,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Stable
|
||||||
|
object AlterationToggleItemDefault {
|
||||||
|
val padding = PaddingValues(start = 8.dp)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AlterationToggleItem(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
alteration: AlterationToggleItemUio,
|
||||||
|
padding: PaddingValues = AlterationToggleItemDefault.padding,
|
||||||
|
onAlteration: () -> Unit,
|
||||||
|
onTag: (String) -> Unit,
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.clip(shape = MaterialTheme.lwa.shapes.gameMaster)
|
||||||
|
.clickable(onClick = onAlteration)
|
||||||
|
.background(color = MaterialTheme.lwa.colorScheme.elevated.base1dp)
|
||||||
|
.minimumInteractiveComponentSize()
|
||||||
|
.padding(paddingValues = padding)
|
||||||
|
.then(other = modifier),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
) {
|
||||||
|
val animatedColor = animateColorAsState(
|
||||||
|
targetValue = when (alteration.active) {
|
||||||
|
true -> MaterialTheme.lwa.colorScheme.base.secondary
|
||||||
|
else -> MaterialTheme.lwa.colorScheme.base.onSurface
|
||||||
|
}
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
style = MaterialTheme.lwa.typography.base.body1,
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
maxLines = 1,
|
||||||
|
color = animatedColor.value,
|
||||||
|
text = alteration.label,
|
||||||
|
)
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.weight(1f).height(intrinsicSize = IntrinsicSize.Min),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(space = 2.dp, alignment = Alignment.End)
|
||||||
|
) {
|
||||||
|
alteration.tags.forEach { tag ->
|
||||||
|
GMTag(
|
||||||
|
elevation = 4.dp,
|
||||||
|
tag = tag,
|
||||||
|
onTag = { onTag(tag.id) },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
package com.pixelized.desktop.lwa.ui.composable.character.alterteration
|
||||||
|
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.width
|
||||||
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.IconButton
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Surface
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.minimumInteractiveComponentSize
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.Stable
|
||||||
|
import androidx.compose.runtime.State
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.window.Dialog
|
||||||
|
import androidx.compose.ui.window.DialogProperties
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.GMFilterHeader
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.theme.lwa
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import lwacharactersheet.composeapp.generated.resources.Res
|
||||||
|
import lwacharactersheet.composeapp.generated.resources.ic_close_24dp
|
||||||
|
import org.jetbrains.compose.resources.painterResource
|
||||||
|
|
||||||
|
@Stable
|
||||||
|
data class CharacterSheetAlterationDialogUio(
|
||||||
|
val characterSheetId: String,
|
||||||
|
val characterName: String,
|
||||||
|
val filter: LwaTextFieldUio,
|
||||||
|
val tags: StateFlow<List<GMTagUio>>,
|
||||||
|
val alterations: List<AlterationToggleItemUio>,
|
||||||
|
)
|
||||||
|
|
||||||
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
|
@Composable
|
||||||
|
fun CharacterSheetAlterationDialog(
|
||||||
|
dialog: State<CharacterSheetAlterationDialogUio?>,
|
||||||
|
onConfirm: (CharacterSheetAlterationDialogUio) -> Unit,
|
||||||
|
onTag: (String) -> Unit,
|
||||||
|
onAlteration: (characterSheetId: String, alterationId: String, active: Boolean) -> Unit,
|
||||||
|
onDismissRequest: () -> Unit,
|
||||||
|
) {
|
||||||
|
dialog.value?.let {
|
||||||
|
Dialog(
|
||||||
|
properties = DialogProperties(
|
||||||
|
usePlatformDefaultWidth = false,
|
||||||
|
usePlatformInsets = false,
|
||||||
|
),
|
||||||
|
onDismissRequest = onDismissRequest,
|
||||||
|
content = {
|
||||||
|
CharacterSheetAlterationContent(
|
||||||
|
dialog = it,
|
||||||
|
onConfirm = onConfirm,
|
||||||
|
onTag = onTag,
|
||||||
|
onAlteration = onAlteration,
|
||||||
|
onDismissRequest = onDismissRequest,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CharacterSheetAlterationContent(
|
||||||
|
dialog: CharacterSheetAlterationDialogUio,
|
||||||
|
onConfirm: (CharacterSheetAlterationDialogUio) -> Unit,
|
||||||
|
onTag: (String) -> Unit,
|
||||||
|
onAlteration: (characterSheetId: String, alterationId: String, active: Boolean) -> Unit,
|
||||||
|
onDismissRequest: () -> Unit,
|
||||||
|
) {
|
||||||
|
Surface(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxHeight()
|
||||||
|
.width(width = 128.dp * 4)
|
||||||
|
.padding(vertical = 16.dp),
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxSize(),
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.padding(start = 16.dp).fillMaxWidth(),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
style = MaterialTheme.typography.h6,
|
||||||
|
color = MaterialTheme.colors.onSurface,
|
||||||
|
text = dialog.characterName,
|
||||||
|
)
|
||||||
|
IconButton(
|
||||||
|
onClick = onDismissRequest,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(Res.drawable.ic_close_24dp),
|
||||||
|
tint = MaterialTheme.lwa.colorScheme.base.primary,
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GMFilterHeader(
|
||||||
|
filter = dialog.filter,
|
||||||
|
tags = dialog.tags.collectAsState(),
|
||||||
|
onTag = onTag,
|
||||||
|
)
|
||||||
|
LazyColumn(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.weight(weight = 1f),
|
||||||
|
contentPadding = PaddingValues(start = 8.dp, end = 8.dp, bottom = 8.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
|
) {
|
||||||
|
items(
|
||||||
|
items = dialog.alterations,
|
||||||
|
key = { it.id }
|
||||||
|
) { alteration ->
|
||||||
|
AlterationToggleItem(
|
||||||
|
modifier = Modifier
|
||||||
|
.animateItem()
|
||||||
|
.background(
|
||||||
|
color = MaterialTheme.lwa.colorScheme.elevated.base1dp,
|
||||||
|
shape = MaterialTheme.lwa.shapes.base.small,
|
||||||
|
)
|
||||||
|
.minimumInteractiveComponentSize()
|
||||||
|
.padding(horizontal = 8.dp),
|
||||||
|
alteration = alteration,
|
||||||
|
onAlteration = {
|
||||||
|
onAlteration(
|
||||||
|
dialog.characterSheetId,
|
||||||
|
alteration.id,
|
||||||
|
alteration.active,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
onTag = onTag,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.pixelized.desktop.lwa.ui.composable.character.alterteration
|
||||||
|
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagFactory
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
|
import com.pixelized.desktop.lwa.utils.extention.unAccent
|
||||||
|
import com.pixelized.shared.lwa.model.alteration.Alteration
|
||||||
|
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
|
||||||
|
import com.pixelized.shared.lwa.model.tag.Tag
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
|
||||||
|
class CharacterSheetAlterationDialogFactory(
|
||||||
|
private val tagFactory: GMTagFactory,
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun filterAlteration(
|
||||||
|
alterations: Collection<Alteration>,
|
||||||
|
unAccentFilter: String,
|
||||||
|
selectedTagId: String?,
|
||||||
|
): List<Alteration> {
|
||||||
|
return alterations.filter {
|
||||||
|
val matchName = it.metadata.name.unAccent().contains(
|
||||||
|
other = unAccentFilter,
|
||||||
|
ignoreCase = true
|
||||||
|
)
|
||||||
|
val matchTag = selectedTagId == null || it.tags.contains(
|
||||||
|
element = selectedTagId
|
||||||
|
)
|
||||||
|
matchName && matchTag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun convertToDialogUio(
|
||||||
|
characterSheet: CharacterSheet?,
|
||||||
|
alterations: List<Alteration>,
|
||||||
|
tagMap: Map<String, Tag>,
|
||||||
|
filter: LwaTextFieldUio,
|
||||||
|
tags: StateFlow<List<GMTagUio>>,
|
||||||
|
selectedTagId: String?,
|
||||||
|
): CharacterSheetAlterationDialogUio? {
|
||||||
|
if (characterSheet == null) return null
|
||||||
|
|
||||||
|
return CharacterSheetAlterationDialogUio(
|
||||||
|
characterSheetId = characterSheet.id,
|
||||||
|
characterName = characterSheet.name,
|
||||||
|
filter = filter,
|
||||||
|
tags = tags,
|
||||||
|
alterations = alterations.map { alteration ->
|
||||||
|
AlterationToggleItemUio(
|
||||||
|
id = alteration.id,
|
||||||
|
label = alteration.metadata.name,
|
||||||
|
tags = tagFactory.convertToGMTagItemUio(
|
||||||
|
tags = alteration.tags.mapNotNull { tagMap[it] },
|
||||||
|
selectedTagId = selectedTagId
|
||||||
|
),
|
||||||
|
active = characterSheet.alterations.contains(alteration.id),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
package com.pixelized.desktop.lwa.ui.composable.character.alterteration
|
||||||
|
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
||||||
|
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
||||||
|
import com.pixelized.desktop.lwa.repository.tag.TagRepository
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagFactory
|
||||||
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
|
import com.pixelized.desktop.lwa.utils.extention.unAccent
|
||||||
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.combine
|
||||||
|
import kotlinx.coroutines.flow.flatMapLatest
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.stateIn
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import lwacharactersheet.composeapp.generated.resources.Res
|
||||||
|
import lwacharactersheet.composeapp.generated.resources.game_master__alteration__filter
|
||||||
|
import org.jetbrains.compose.resources.getString
|
||||||
|
|
||||||
|
class CharacterSheetAlterationDialogViewModel(
|
||||||
|
private val characterSheetRepository: CharacterSheetRepository,
|
||||||
|
alterationRepository: AlterationRepository,
|
||||||
|
tagRepository: TagRepository,
|
||||||
|
dialogFactory: CharacterSheetAlterationDialogFactory,
|
||||||
|
tagFactory: GMTagFactory,
|
||||||
|
) : ViewModel() {
|
||||||
|
|
||||||
|
private val selectedCharacterSheetIdFlow = MutableStateFlow<String?>(null)
|
||||||
|
private val selectedAlterationNameFlow = MutableStateFlow("")
|
||||||
|
private val selectedTagIdFlow = MutableStateFlow<String?>(null)
|
||||||
|
|
||||||
|
private val selectedAlterationsFlow = combine(
|
||||||
|
alterationRepository.alterationFlow.map { it.values },
|
||||||
|
selectedAlterationNameFlow.map { it.unAccent() },
|
||||||
|
selectedTagIdFlow,
|
||||||
|
dialogFactory::filterAlteration
|
||||||
|
)
|
||||||
|
|
||||||
|
private val filter = LwaTextFieldUio(
|
||||||
|
enable = true,
|
||||||
|
isError = MutableStateFlow(false),
|
||||||
|
valueFlow = selectedAlterationNameFlow,
|
||||||
|
label = runBlocking { getString(Res.string.game_master__alteration__filter) },
|
||||||
|
placeHolder = null,
|
||||||
|
onValueChange = { selectedAlterationNameFlow.value = it },
|
||||||
|
)
|
||||||
|
|
||||||
|
private val tags: StateFlow<List<GMTagUio>> = combine(
|
||||||
|
tagRepository.alterationsTagFlow(),
|
||||||
|
selectedTagIdFlow,
|
||||||
|
) { tags, selectedTagId ->
|
||||||
|
tagFactory.convertToGMTagItemUio(
|
||||||
|
tags = tags.values,
|
||||||
|
selectedTagId = selectedTagId,
|
||||||
|
)
|
||||||
|
}.stateIn(
|
||||||
|
scope = viewModelScope,
|
||||||
|
started = SharingStarted.Lazily,
|
||||||
|
initialValue = emptyList(),
|
||||||
|
)
|
||||||
|
|
||||||
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
|
val alterationDialog = selectedCharacterSheetIdFlow
|
||||||
|
.flatMapLatest { characterSheetId ->
|
||||||
|
combine(
|
||||||
|
characterSheetRepository.characterDetailFlow(characterSheetId = characterSheetId),
|
||||||
|
tagRepository.alterationsTagFlow(),
|
||||||
|
selectedAlterationsFlow,
|
||||||
|
selectedTagIdFlow,
|
||||||
|
) { characterSheet, tagMap, alterations, selectedTagId ->
|
||||||
|
dialogFactory.convertToDialogUio(
|
||||||
|
characterSheet = characterSheet,
|
||||||
|
tagMap = tagMap,
|
||||||
|
alterations = alterations,
|
||||||
|
filter = filter,
|
||||||
|
tags = tags,
|
||||||
|
selectedTagId = selectedTagId,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.stateIn(
|
||||||
|
scope = viewModelScope,
|
||||||
|
started = SharingStarted.Lazily,
|
||||||
|
initialValue = null
|
||||||
|
)
|
||||||
|
|
||||||
|
fun show(characterSheetId: String?) {
|
||||||
|
selectedCharacterSheetIdFlow.update { characterSheetId }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hide() {
|
||||||
|
selectedCharacterSheetIdFlow.update { null }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun selectedTag(id: String) {
|
||||||
|
selectedTagIdFlow.update {
|
||||||
|
when (it) {
|
||||||
|
id -> null
|
||||||
|
else -> id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun toggleAlteration(
|
||||||
|
characterSheetId: String,
|
||||||
|
alterationId: String,
|
||||||
|
active: Boolean,
|
||||||
|
) {
|
||||||
|
characterSheetRepository.updateAlteration(
|
||||||
|
characterSheetId = characterSheetId,
|
||||||
|
alterationId = alterationId,
|
||||||
|
active = active.not(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,19 +4,15 @@ import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
||||||
import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository
|
|
||||||
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
||||||
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogUio.Characteristic
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogUio.Characteristic
|
||||||
import com.pixelized.shared.lwa.model.AlteredCharacterSheetFactory
|
import com.pixelized.shared.lwa.model.AlteredCharacterSheetFactory
|
||||||
import com.pixelized.shared.lwa.model.campaign.factory.CampaignJsonFactory
|
|
||||||
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
||||||
|
|
||||||
class CharacterDetailCharacteristicDialogViewModel(
|
class CharacterSheetCharacteristicDialogViewModel(
|
||||||
private val characterSheetRepository: CharacterSheetRepository,
|
private val characterSheetRepository: CharacterSheetRepository,
|
||||||
private val campaignRepository: CampaignRepository,
|
|
||||||
private val alterationRepository: AlterationRepository,
|
private val alterationRepository: AlterationRepository,
|
||||||
private val campaignJsonFactory: CampaignJsonFactory,
|
|
||||||
private val alteredCharacterSheetFactory: AlteredCharacterSheetFactory,
|
private val alteredCharacterSheetFactory: AlteredCharacterSheetFactory,
|
||||||
private val factory: CharacterSheetCharacteristicDialogFactory,
|
private val factory: CharacterSheetCharacteristicDialogFactory,
|
||||||
private val network: NetworkRepository,
|
private val network: NetworkRepository,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog
|
package com.pixelized.desktop.lwa.ui.composable.character.diminished
|
||||||
|
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||||
|
|
@ -40,7 +40,7 @@ import lwacharactersheet.composeapp.generated.resources.dialog__confirm_action
|
||||||
import org.jetbrains.compose.resources.stringResource
|
import org.jetbrains.compose.resources.stringResource
|
||||||
|
|
||||||
@Stable
|
@Stable
|
||||||
data class CharacterSheetDiminishedStatDialogUio(
|
data class CharacterSheetDiminishedDialogUio(
|
||||||
val characterSheetId: String,
|
val characterSheetId: String,
|
||||||
val label: String,
|
val label: String,
|
||||||
val value: () -> TextFieldValue,
|
val value: () -> TextFieldValue,
|
||||||
|
|
@ -48,16 +48,16 @@ data class CharacterSheetDiminishedStatDialogUio(
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun DiminishedStatDialog(
|
fun CharacterSheetDiminishedDialog(
|
||||||
dialog: State<CharacterSheetDiminishedStatDialogUio?>,
|
dialog: State<CharacterSheetDiminishedDialogUio?>,
|
||||||
onConfirm: (CharacterSheetDiminishedStatDialogUio) -> Unit,
|
onConfirm: (CharacterSheetDiminishedDialogUio) -> Unit,
|
||||||
onDismissRequest: () -> Unit,
|
onDismissRequest: () -> Unit,
|
||||||
) {
|
) {
|
||||||
dialog.value?.let {
|
dialog.value?.let {
|
||||||
Dialog(
|
Dialog(
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
content = {
|
content = {
|
||||||
DiminishedDialogContent(
|
CharacterSheetDiminishedContent(
|
||||||
dialog = it,
|
dialog = it,
|
||||||
onConfirm = onConfirm,
|
onConfirm = onConfirm,
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
|
|
@ -68,9 +68,9 @@ fun DiminishedStatDialog(
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun DiminishedDialogContent(
|
private fun CharacterSheetDiminishedContent(
|
||||||
dialog: CharacterSheetDiminishedStatDialogUio,
|
dialog: CharacterSheetDiminishedDialogUio,
|
||||||
onConfirm: (CharacterSheetDiminishedStatDialogUio) -> Unit,
|
onConfirm: (CharacterSheetDiminishedDialogUio) -> Unit,
|
||||||
onDismissRequest: () -> Unit,
|
onDismissRequest: () -> Unit,
|
||||||
) {
|
) {
|
||||||
val typography = MaterialTheme.typography
|
val typography = MaterialTheme.typography
|
||||||
|
|
@ -5,7 +5,6 @@ import androidx.compose.ui.text.TextRange
|
||||||
import androidx.compose.ui.text.input.TextFieldValue
|
import androidx.compose.ui.text.input.TextFieldValue
|
||||||
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
||||||
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDiminishedStatDialogUio
|
|
||||||
import com.pixelized.shared.lwa.model.AlteredCharacterSheetFactory
|
import com.pixelized.shared.lwa.model.AlteredCharacterSheetFactory
|
||||||
import com.pixelized.shared.lwa.model.alteration.FieldAlteration
|
import com.pixelized.shared.lwa.model.alteration.FieldAlteration
|
||||||
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
|
import com.pixelized.shared.lwa.model.characterSheet.CharacterSheet
|
||||||
|
|
@ -20,7 +19,7 @@ class CharacterSheetDiminishedDialogFactory(
|
||||||
) {
|
) {
|
||||||
suspend fun convertToDialogUio(
|
suspend fun convertToDialogUio(
|
||||||
characterSheetId: String?,
|
characterSheetId: String?,
|
||||||
) : CharacterSheetDiminishedStatDialogUio? {
|
) : CharacterSheetDiminishedDialogUio? {
|
||||||
|
|
||||||
if (characterSheetId == null) return null
|
if (characterSheetId == null) return null
|
||||||
|
|
||||||
|
|
@ -45,7 +44,7 @@ class CharacterSheetDiminishedDialogFactory(
|
||||||
selection = TextRange(index = 0),
|
selection = TextRange(index = 0),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return CharacterSheetDiminishedStatDialogUio(
|
return CharacterSheetDiminishedDialogUio(
|
||||||
characterSheetId = characterSheetId,
|
characterSheetId = characterSheetId,
|
||||||
label = getString(resource = Res.string.character_sheet__diminished__label),
|
label = getString(resource = Res.string.character_sheet__diminished__label),
|
||||||
value = { textFieldValue.value },
|
value = { textFieldValue.value },
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,15 @@ import androidx.compose.runtime.State
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDiminishedStatDialogUio
|
|
||||||
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
||||||
|
|
||||||
class CharacterSheetDiminishedViewModel(
|
class CharacterSheetDiminishedDialogViewModel(
|
||||||
private val networkRepository: NetworkRepository,
|
private val networkRepository: NetworkRepository,
|
||||||
private val factory: CharacterSheetDiminishedDialogFactory,
|
private val factory: CharacterSheetDiminishedDialogFactory,
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
private val _diminishedDialog = mutableStateOf<CharacterSheetDiminishedStatDialogUio?>(null)
|
private val _diminishedDialog = mutableStateOf<CharacterSheetDiminishedDialogUio?>(null)
|
||||||
val diminishedDialog: State<CharacterSheetDiminishedStatDialogUio?> get() = _diminishedDialog
|
val diminishedDialog: State<CharacterSheetDiminishedDialogUio?> get() = _diminishedDialog
|
||||||
|
|
||||||
suspend fun showDiminishedDialog(
|
suspend fun showDiminishedDialog(
|
||||||
characterSheetId: String?,
|
characterSheetId: String?,
|
||||||
|
|
@ -28,7 +27,7 @@ class CharacterSheetDiminishedViewModel(
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun changeDiminished(
|
suspend fun changeDiminished(
|
||||||
dialog: CharacterSheetDiminishedStatDialogUio,
|
dialog: CharacterSheetDiminishedDialogUio,
|
||||||
) {
|
) {
|
||||||
val diminished = dialog.value().text.toIntOrNull() ?: 0
|
val diminished = dialog.value().text.toIntOrNull() ?: 0
|
||||||
networkRepository.share(
|
networkRepository.share(
|
||||||
|
|
@ -22,9 +22,9 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
data class LwaTextFieldUio(
|
data class LwaTextFieldUio(
|
||||||
val enable: Boolean = true,
|
val enable: Boolean = true,
|
||||||
val isError: MutableStateFlow<Boolean>,
|
val isError: MutableStateFlow<Boolean>,
|
||||||
val labelFlow: MutableStateFlow<String?>?,
|
|
||||||
val valueFlow: MutableStateFlow<String>,
|
val valueFlow: MutableStateFlow<String>,
|
||||||
val placeHolderFlow: MutableStateFlow<String?>?,
|
val label: String?,
|
||||||
|
val placeHolder: String?,
|
||||||
val onValueChange: (String) -> Unit,
|
val onValueChange: (String) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -46,8 +46,6 @@ fun LwaTextField(
|
||||||
Modifier
|
Modifier
|
||||||
}
|
}
|
||||||
|
|
||||||
val label = field.labelFlow?.collectAsState()
|
|
||||||
val placeHolder = field.placeHolderFlow?.collectAsState()
|
|
||||||
val value = field.valueFlow.collectAsState()
|
val value = field.valueFlow.collectAsState()
|
||||||
val isError = field.isError.collectAsState()
|
val isError = field.isError.collectAsState()
|
||||||
|
|
||||||
|
|
@ -60,7 +58,7 @@ fun LwaTextField(
|
||||||
},
|
},
|
||||||
enabled = field.enable,
|
enabled = field.enable,
|
||||||
singleLine = singleLine,
|
singleLine = singleLine,
|
||||||
placeholder = placeHolder?.value?.let {
|
placeholder = field.placeHolder?.let {
|
||||||
{
|
{
|
||||||
Text(
|
Text(
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
|
@ -70,7 +68,7 @@ fun LwaTextField(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isError = isError.value,
|
isError = isError.value,
|
||||||
label = label?.value?.let {
|
label = field.label?.let {
|
||||||
{
|
{
|
||||||
Text(
|
Text(
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ private fun RollOverlayKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
import androidx.compose.runtime.Stable
|
import androidx.compose.runtime.Stable
|
||||||
import androidx.compose.runtime.State
|
import androidx.compose.runtime.State
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.compositionLocalOf
|
import androidx.compose.runtime.compositionLocalOf
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
|
@ -30,15 +31,18 @@ import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContent
|
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContent
|
||||||
import com.pixelized.desktop.lwa.ui.composable.blur.rememberBlurContentController
|
import com.pixelized.desktop.lwa.ui.composable.blur.rememberBlurContentController
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialog
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialog
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialog
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialog
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
|
import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
|
||||||
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController
|
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController
|
||||||
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToLevelScreen
|
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToLevelScreen
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlay
|
import com.pixelized.desktop.lwa.ui.overlay.portrait.PortraitOverlay
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel
|
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.rememberTransitionAnimation
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.rememberTransitionAnimation
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbon
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.npc.NpcRibbon
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbon
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbon
|
||||||
|
|
@ -46,7 +50,6 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChat
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.text.CampaignChatViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbar
|
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbar
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.CampaignToolbarViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.DiminishedStatDialog
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.koin.compose.viewmodel.koinViewModel
|
import org.koin.compose.viewmodel.koinViewModel
|
||||||
|
|
||||||
|
|
@ -58,8 +61,9 @@ val LocalCampaignLayoutScope = compositionLocalOf<CampaignLayoutScope> {
|
||||||
fun CampaignScreen(
|
fun CampaignScreen(
|
||||||
playerDetailViewModel: CharacterDetailViewModel = koinViewModel(key = "player"),
|
playerDetailViewModel: CharacterDetailViewModel = koinViewModel(key = "player"),
|
||||||
npcDetailViewModel: CharacterDetailViewModel = koinViewModel(key = "npc"),
|
npcDetailViewModel: CharacterDetailViewModel = koinViewModel(key = "npc"),
|
||||||
characteristicDialogViewModel: CharacterDetailCharacteristicDialogViewModel = koinViewModel(),
|
characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel = koinViewModel(),
|
||||||
dismissedViewModel: CharacterSheetDiminishedViewModel = koinViewModel(),
|
dismissedViewModel: CharacterSheetDiminishedDialogViewModel = koinViewModel(),
|
||||||
|
alterationViewModel: CharacterSheetAlterationDialogViewModel = koinViewModel(),
|
||||||
campaignViewModel: CampaignToolbarViewModel = koinViewModel(),
|
campaignViewModel: CampaignToolbarViewModel = koinViewModel(),
|
||||||
campaignChatViewModel: CampaignChatViewModel = koinViewModel(),
|
campaignChatViewModel: CampaignChatViewModel = koinViewModel(),
|
||||||
) {
|
) {
|
||||||
|
|
@ -124,6 +128,7 @@ fun CampaignScreen(
|
||||||
detailViewModel = npcDetailViewModel,
|
detailViewModel = npcDetailViewModel,
|
||||||
characterDiminishedViewModel = dismissedViewModel,
|
characterDiminishedViewModel = dismissedViewModel,
|
||||||
characteristicDialogViewModel = characteristicDialogViewModel,
|
characteristicDialogViewModel = characteristicDialogViewModel,
|
||||||
|
alterationViewModel = alterationViewModel,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
rightPanel = {
|
rightPanel = {
|
||||||
|
|
@ -150,6 +155,7 @@ fun CampaignScreen(
|
||||||
detailViewModel = playerDetailViewModel,
|
detailViewModel = playerDetailViewModel,
|
||||||
characterDiminishedViewModel = dismissedViewModel,
|
characterDiminishedViewModel = dismissedViewModel,
|
||||||
characteristicDialogViewModel = characteristicDialogViewModel,
|
characteristicDialogViewModel = characteristicDialogViewModel,
|
||||||
|
alterationViewModel = alterationViewModel,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
@ -174,7 +180,7 @@ fun CampaignScreen(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
DiminishedStatDialog(
|
CharacterSheetDiminishedDialog(
|
||||||
dialog = dismissedViewModel.diminishedDialog,
|
dialog = dismissedViewModel.diminishedDialog,
|
||||||
onConfirm = { diminished ->
|
onConfirm = { diminished ->
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
|
@ -192,10 +198,32 @@ fun CampaignScreen(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CharacterSheetAlterationDialog(
|
||||||
|
dialog = alterationViewModel.alterationDialog.collectAsState(),
|
||||||
|
onConfirm = { },
|
||||||
|
onTag = {
|
||||||
|
alterationViewModel.selectedTag(id = it)
|
||||||
|
},
|
||||||
|
onAlteration = { characterSheetId, alterationId, active ->
|
||||||
|
scope.launch {
|
||||||
|
alterationViewModel.toggleAlteration(characterSheetId, alterationId, active)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDismissRequest = {
|
||||||
|
blurController.hide()
|
||||||
|
alterationViewModel.hide()
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
CampaignKeyHandler(
|
CampaignKeyHandler(
|
||||||
onDismissRequest = {
|
onDismissRequest = {
|
||||||
playerDetailViewModel.hideCharacter()
|
val noDialog = characteristicDialogViewModel.statChangeDialog.value == null
|
||||||
npcDetailViewModel.hideCharacter()
|
&& dismissedViewModel.diminishedDialog.value == null
|
||||||
|
&& alterationViewModel.alterationDialog.value == null
|
||||||
|
if (noDialog) {
|
||||||
|
playerDetailViewModel.hideCharacter()
|
||||||
|
npcDetailViewModel.hideCharacter()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -293,7 +321,7 @@ private fun CampaignKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,10 @@ import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.pixelized.desktop.lwa.LocalRollHostState
|
import com.pixelized.desktop.lwa.LocalRollHostState
|
||||||
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController
|
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogUio
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogUio
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction
|
import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeader
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeader
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeaderUio
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header.CharacterDetailHeaderUio
|
||||||
|
|
@ -60,8 +61,9 @@ fun CharacterDetailPanel(
|
||||||
blurController: BlurContentController,
|
blurController: BlurContentController,
|
||||||
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform = rememberTransitionAnimation(),
|
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform = rememberTransitionAnimation(),
|
||||||
detailViewModel: CharacterDetailViewModel,
|
detailViewModel: CharacterDetailViewModel,
|
||||||
characteristicDialogViewModel: CharacterDetailCharacteristicDialogViewModel,
|
characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel,
|
||||||
characterDiminishedViewModel: CharacterSheetDiminishedViewModel,
|
characterDiminishedViewModel: CharacterSheetDiminishedDialogViewModel,
|
||||||
|
alterationViewModel: CharacterSheetAlterationDialogViewModel,
|
||||||
) {
|
) {
|
||||||
val roll = LocalRollHostState.current
|
val roll = LocalRollHostState.current
|
||||||
val scope = rememberCoroutineScope()
|
val scope = rememberCoroutineScope()
|
||||||
|
|
@ -74,6 +76,10 @@ fun CharacterDetailPanel(
|
||||||
onDismissRequest = {
|
onDismissRequest = {
|
||||||
detailViewModel.hideCharacter()
|
detailViewModel.hideCharacter()
|
||||||
},
|
},
|
||||||
|
onAlteration = {
|
||||||
|
blurController.show()
|
||||||
|
alterationViewModel.show(characterSheetId = it)
|
||||||
|
},
|
||||||
onDiminished = {
|
onDiminished = {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
blurController.show()
|
blurController.show()
|
||||||
|
|
@ -141,6 +147,7 @@ fun CharacterDetailAnimatedPanel(
|
||||||
detail: State<CharacterDetailPanelUio>,
|
detail: State<CharacterDetailPanelUio>,
|
||||||
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform,
|
transitionSpec: AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform,
|
||||||
onDismissRequest: (characterSheetId: String) -> Unit,
|
onDismissRequest: (characterSheetId: String) -> Unit,
|
||||||
|
onAlteration: (characterSheetId: String) -> Unit,
|
||||||
onDiminished: (characterSheetId: String) -> Unit,
|
onDiminished: (characterSheetId: String) -> Unit,
|
||||||
onHp: (characterSheetId: String) -> Unit,
|
onHp: (characterSheetId: String) -> Unit,
|
||||||
onPp: (characterSheetId: String) -> Unit,
|
onPp: (characterSheetId: String) -> Unit,
|
||||||
|
|
@ -172,6 +179,7 @@ fun CharacterDetailAnimatedPanel(
|
||||||
header = it.header.collectAsState(),
|
header = it.header.collectAsState(),
|
||||||
sheet = it.sheet.collectAsState(),
|
sheet = it.sheet.collectAsState(),
|
||||||
onDismissRequest = { onDismissRequest(it.characterSheetId) },
|
onDismissRequest = { onDismissRequest(it.characterSheetId) },
|
||||||
|
onAlteration = { onAlteration(it.characterSheetId) },
|
||||||
onDiminished = { onDiminished(it.characterSheetId) },
|
onDiminished = { onDiminished(it.characterSheetId) },
|
||||||
onHp = { onHp(it.characterSheetId) },
|
onHp = { onHp(it.characterSheetId) },
|
||||||
onPp = { onPp(it.characterSheetId) },
|
onPp = { onPp(it.characterSheetId) },
|
||||||
|
|
@ -194,6 +202,7 @@ fun CharacterDetailContent(
|
||||||
shape: Shape = MaterialTheme.lwa.shapes.panel,
|
shape: Shape = MaterialTheme.lwa.shapes.panel,
|
||||||
header: State<CharacterDetailHeaderUio?>,
|
header: State<CharacterDetailHeaderUio?>,
|
||||||
sheet: State<CharacterDetailSheetUio?>,
|
sheet: State<CharacterDetailSheetUio?>,
|
||||||
|
onAlteration: () -> Unit,
|
||||||
onDismissRequest: () -> Unit,
|
onDismissRequest: () -> Unit,
|
||||||
onDiminished: () -> Unit,
|
onDiminished: () -> Unit,
|
||||||
onHp: () -> Unit,
|
onHp: () -> Unit,
|
||||||
|
|
@ -217,6 +226,7 @@ fun CharacterDetailContent(
|
||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
header = header,
|
header = header,
|
||||||
onDismissRequest = onDismissRequest,
|
onDismissRequest = onDismissRequest,
|
||||||
|
onAlteration = onAlteration,
|
||||||
onDiminished = onDiminished,
|
onDiminished = onDiminished,
|
||||||
onHp = onHp,
|
onHp = onHp,
|
||||||
onPp = onPp,
|
onPp = onPp,
|
||||||
|
|
@ -242,7 +252,7 @@ fun CharacterDetailContent(
|
||||||
@Stable
|
@Stable
|
||||||
fun rememberTransitionAnimation(
|
fun rememberTransitionAnimation(
|
||||||
direction: LayoutDirection = LayoutDirection.Rtl,
|
direction: LayoutDirection = LayoutDirection.Rtl,
|
||||||
) : AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform {
|
): AnimatedContentTransitionScope<CharacterDetailPanelUio>.() -> ContentTransform {
|
||||||
return remember {
|
return remember {
|
||||||
val mul = if (direction == LayoutDirection.Rtl) 1 else -1
|
val mul = if (direction == LayoutDirection.Rtl) 1 else -1
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail
|
package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail
|
||||||
|
|
||||||
|
import com.pixelized.desktop.lwa.repository.settings.model.Settings
|
||||||
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio
|
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction
|
import com.pixelized.desktop.lwa.ui.overlay.roll.RollAction
|
||||||
|
|
||||||
|
|
@ -55,6 +56,7 @@ class CharacterDetailFactory(
|
||||||
suspend fun convertToCharacterDetailHeaderUio(
|
suspend fun convertToCharacterDetailHeaderUio(
|
||||||
characterSheetId: String,
|
characterSheetId: String,
|
||||||
characterSheet: CharacterSheet?,
|
characterSheet: CharacterSheet?,
|
||||||
|
settings: Settings,
|
||||||
alterations: Map<String, List<FieldAlteration>>,
|
alterations: Map<String, List<FieldAlteration>>,
|
||||||
): CharacterDetailHeaderUio? {
|
): CharacterDetailHeaderUio? {
|
||||||
if (characterSheet == null) return null
|
if (characterSheet == null) return null
|
||||||
|
|
@ -71,6 +73,7 @@ class CharacterDetailFactory(
|
||||||
characterSheetId = characterSheetId,
|
characterSheetId = characterSheetId,
|
||||||
portrait = alteredCharacterSheet.portrait,
|
portrait = alteredCharacterSheet.portrait,
|
||||||
diminished = alteredCharacterSheet.diminished,
|
diminished = alteredCharacterSheet.diminished,
|
||||||
|
alteration = settings.isAdmin ?: false,
|
||||||
name = alteredCharacterSheet.name,
|
name = alteredCharacterSheet.name,
|
||||||
level = alteredCharacterSheet.level,
|
level = alteredCharacterSheet.level,
|
||||||
hp = "${maxHp - alteredCharacterSheet.damage}",
|
hp = "${maxHp - alteredCharacterSheet.damage}",
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope
|
||||||
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
import com.pixelized.desktop.lwa.repository.alteration.AlterationRepository
|
||||||
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository
|
||||||
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
||||||
|
import com.pixelized.desktop.lwa.repository.settings.SettingsRepository
|
||||||
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
|
|
@ -17,6 +18,7 @@ import kotlinx.coroutines.launch
|
||||||
class CharacterDetailViewModel(
|
class CharacterDetailViewModel(
|
||||||
private val characterSheetRepository: CharacterSheetRepository,
|
private val characterSheetRepository: CharacterSheetRepository,
|
||||||
private val alterationRepository: AlterationRepository,
|
private val alterationRepository: AlterationRepository,
|
||||||
|
settingRepository: SettingsRepository,
|
||||||
private val characterDetailFactory: CharacterDetailFactory,
|
private val characterDetailFactory: CharacterDetailFactory,
|
||||||
private val network: NetworkRepository,
|
private val network: NetworkRepository,
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
@ -32,10 +34,12 @@ class CharacterDetailViewModel(
|
||||||
header = combine(
|
header = combine(
|
||||||
characterSheetRepository.characterDetailFlow(characterSheetId = characterSheetId),
|
characterSheetRepository.characterDetailFlow(characterSheetId = characterSheetId),
|
||||||
alterationRepository.fieldAlterationsFlow(characterSheetId = characterSheetId),
|
alterationRepository.fieldAlterationsFlow(characterSheetId = characterSheetId),
|
||||||
) { characterSheet, alterations ->
|
settingRepository.settingsFlow()
|
||||||
|
) { characterSheet, alterations, settings, ->
|
||||||
characterDetailFactory.convertToCharacterDetailHeaderUio(
|
characterDetailFactory.convertToCharacterDetailHeaderUio(
|
||||||
characterSheetId = characterSheetId,
|
characterSheetId = characterSheetId,
|
||||||
characterSheet = characterSheet,
|
characterSheet = characterSheet,
|
||||||
|
settings = settings,
|
||||||
alterations = alterations,
|
alterations = alterations,
|
||||||
)
|
)
|
||||||
}.stateIn(
|
}.stateIn(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header
|
package com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.header
|
||||||
|
|
||||||
import androidx.compose.animation.AnimatedContent
|
import androidx.compose.animation.AnimatedContent
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.animation.SizeTransform
|
import androidx.compose.animation.SizeTransform
|
||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.fadeOut
|
||||||
|
|
@ -43,13 +44,13 @@ import lwacharactersheet.composeapp.generated.resources.ic_close_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_cognition_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_cognition_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_heart_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_heart_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_heart_plus_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_heart_plus_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_near_me
|
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_shield_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_shield_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_skull_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_swords_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_water_drop_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_water_drop_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_pan_tool_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_pan_tool_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_azm_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_azm_24dp
|
||||||
|
import lwacharactersheet.composeapp.generated.resources.ic_blur_on_24dp
|
||||||
import lwacharactersheet.composeapp.generated.resources.ic_directions_run_24dp
|
import lwacharactersheet.composeapp.generated.resources.ic_directions_run_24dp
|
||||||
import org.jetbrains.compose.resources.painterResource
|
import org.jetbrains.compose.resources.painterResource
|
||||||
import org.jetbrains.compose.resources.stringResource
|
import org.jetbrains.compose.resources.stringResource
|
||||||
|
|
@ -59,6 +60,7 @@ data class CharacterDetailHeaderUio(
|
||||||
val characterSheetId: String,
|
val characterSheetId: String,
|
||||||
val portrait: String?,
|
val portrait: String?,
|
||||||
val diminished: Int,
|
val diminished: Int,
|
||||||
|
val alteration: Boolean,
|
||||||
val name: String,
|
val name: String,
|
||||||
val level: Int,
|
val level: Int,
|
||||||
val hp: String,
|
val hp: String,
|
||||||
|
|
@ -91,6 +93,7 @@ fun CharacterDetailHeader(
|
||||||
iconSize: Dp = MaterialTheme.lwa.size.sheet.subCategory,
|
iconSize: Dp = MaterialTheme.lwa.size.sheet.subCategory,
|
||||||
header: State<CharacterDetailHeaderUio?>,
|
header: State<CharacterDetailHeaderUio?>,
|
||||||
onDismissRequest: () -> Unit,
|
onDismissRequest: () -> Unit,
|
||||||
|
onAlteration: () -> Unit,
|
||||||
onDiminished: () -> Unit,
|
onDiminished: () -> Unit,
|
||||||
onHp: () -> Unit,
|
onHp: () -> Unit,
|
||||||
onPp: () -> Unit,
|
onPp: () -> Unit,
|
||||||
|
|
@ -124,6 +127,22 @@ fun CharacterDetailHeader(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
AnimatedVisibility(
|
||||||
|
visible = header.value?.alteration == true,
|
||||||
|
enter = fadeIn(),
|
||||||
|
exit = fadeOut(),
|
||||||
|
) {
|
||||||
|
IconButton(
|
||||||
|
onClick = onAlteration,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
modifier = Modifier.size(size = 24.dp),
|
||||||
|
painter = painterResource(Res.drawable.ic_blur_on_24dp),
|
||||||
|
tint = MaterialTheme.colors.primary,
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Box {
|
Box {
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = onDiminished,
|
onClick = onDiminished,
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ import androidx.compose.ui.unit.dp
|
||||||
import com.pixelized.desktop.lwa.LocalWindowController
|
import com.pixelized.desktop.lwa.LocalWindowController
|
||||||
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContent
|
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContent
|
||||||
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController
|
import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.decoratedBox.DecoratedBox
|
import com.pixelized.desktop.lwa.ui.composable.decoratedBox.DecoratedBox
|
||||||
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipLayout
|
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipLayout
|
||||||
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio
|
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio
|
||||||
|
|
@ -69,7 +69,7 @@ import com.pixelized.desktop.lwa.ui.overlay.roll.RollPage
|
||||||
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
|
import com.pixelized.desktop.lwa.ui.overlay.roll.RollViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic
|
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialog
|
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialog
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.DiminishedStatDialog
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialog
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.preview.rememberCharacterSheetPreview
|
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.preview.rememberCharacterSheetPreview
|
||||||
import com.pixelized.desktop.lwa.utils.preview.ContentPreview
|
import com.pixelized.desktop.lwa.utils.preview.ContentPreview
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -132,7 +132,7 @@ data class CharacterSheetPageUio(
|
||||||
@Composable
|
@Composable
|
||||||
fun CharacterSheetPage(
|
fun CharacterSheetPage(
|
||||||
viewModel: CharacterSheetViewModel = koinViewModel(),
|
viewModel: CharacterSheetViewModel = koinViewModel(),
|
||||||
diminishedDialogViewModel: CharacterSheetDiminishedViewModel = koinViewModel(),
|
diminishedDialogViewModel: CharacterSheetDiminishedDialogViewModel = koinViewModel(),
|
||||||
rollViewModel: RollViewModel = koinViewModel(),
|
rollViewModel: RollViewModel = koinViewModel(),
|
||||||
) {
|
) {
|
||||||
val windowController = LocalWindowController.current
|
val windowController = LocalWindowController.current
|
||||||
|
|
@ -248,7 +248,7 @@ fun CharacterSheetPage(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
DiminishedStatDialog(
|
CharacterSheetDiminishedDialog(
|
||||||
dialog = viewModel.diminishedDialog,
|
dialog = viewModel.diminishedDialog,
|
||||||
onConfirm = {
|
onConfirm = {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetReposit
|
||||||
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
import com.pixelized.desktop.lwa.repository.network.NetworkRepository
|
||||||
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.CharacterSheetDestination
|
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.CharacterSheetDestination
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialogUio
|
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDeleteConfirmationDialogUio
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.CharacterSheetDiminishedStatDialogUio
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogUio
|
||||||
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
import com.pixelized.shared.lwa.protocol.websocket.CharacterSheetEvent
|
||||||
import kotlinx.coroutines.flow.SharingStarted
|
import kotlinx.coroutines.flow.SharingStarted
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
|
|
@ -35,8 +35,8 @@ class CharacterSheetViewModel(
|
||||||
private val _displayRollOverlay = mutableStateOf(false)
|
private val _displayRollOverlay = mutableStateOf(false)
|
||||||
val displayRollOverlay: State<Boolean> get() = _displayRollOverlay
|
val displayRollOverlay: State<Boolean> get() = _displayRollOverlay
|
||||||
|
|
||||||
private val _diminishedDialog = mutableStateOf<CharacterSheetDiminishedStatDialogUio?>(null)
|
private val _diminishedDialog = mutableStateOf<CharacterSheetDiminishedDialogUio?>(null)
|
||||||
val diminishedDialog: State<CharacterSheetDiminishedStatDialogUio?> get() = _diminishedDialog
|
val diminishedDialog: State<CharacterSheetDiminishedDialogUio?> get() = _diminishedDialog
|
||||||
|
|
||||||
val sheetFlow = combine(
|
val sheetFlow = combine(
|
||||||
characterRepository.characterDetailFlow(characterSheetId = argument.characterSheetId),
|
characterRepository.characterDetailFlow(characterSheetId = argument.characterSheetId),
|
||||||
|
|
|
||||||
|
|
@ -497,21 +497,19 @@ class CharacterSheetEditFactory(
|
||||||
fun createLwaTextField(
|
fun createLwaTextField(
|
||||||
enable: Boolean = true,
|
enable: Boolean = true,
|
||||||
isError: Boolean = false,
|
isError: Boolean = false,
|
||||||
|
value: String? = null,
|
||||||
label: String? = null,
|
label: String? = null,
|
||||||
placeholder: String? = null,
|
placeholder: String? = null,
|
||||||
value: String? = null,
|
|
||||||
): LwaTextFieldUio {
|
): LwaTextFieldUio {
|
||||||
val valueFlow = MutableStateFlow(value ?: "")
|
val valueFlow = MutableStateFlow(value ?: "")
|
||||||
val labelFlow = MutableStateFlow(label)
|
|
||||||
val placeholderFlow = MutableStateFlow(placeholder)
|
|
||||||
val isErrorFlow = MutableStateFlow(isError)
|
val isErrorFlow = MutableStateFlow(isError)
|
||||||
|
|
||||||
return LwaTextFieldUio(
|
return LwaTextFieldUio(
|
||||||
enable = enable,
|
enable = enable,
|
||||||
isError = isErrorFlow,
|
isError = isErrorFlow,
|
||||||
labelFlow = labelFlow,
|
|
||||||
valueFlow = valueFlow,
|
valueFlow = valueFlow,
|
||||||
placeHolderFlow = placeholderFlow,
|
label = label,
|
||||||
|
placeHolder = placeholder,
|
||||||
onValueChange = { valueFlow.value = it },
|
onValueChange = { valueFlow.value = it },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,11 +57,11 @@ class CharacterSheetEditViewModel(
|
||||||
copyDialog.value = CharacterSheetCopyDialogUio(
|
copyDialog.value = CharacterSheetCopyDialogUio(
|
||||||
label = getString(Res.string.character_sheet_edit__copy__title),
|
label = getString(Res.string.character_sheet_edit__copy__title),
|
||||||
value = LwaTextFieldUio(
|
value = LwaTextFieldUio(
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.character_sheet_edit__copy__label)),
|
label = getString(Res.string.character_sheet_edit__copy__label),
|
||||||
isError = error,
|
isError = error,
|
||||||
valueFlow = characterSheetId,
|
valueFlow = characterSheetId,
|
||||||
placeHolderFlow = MutableStateFlow(null),
|
placeHolder = null,
|
||||||
onValueChange = { characterSheetId.value = it },
|
onValueChange = { characterSheetId.value = it }
|
||||||
),
|
),
|
||||||
validate = {
|
validate = {
|
||||||
characterSheetRepository.checkCharacterSheetIdValidity(
|
characterSheetRepository.checkCharacterSheetIdValidity(
|
||||||
|
|
|
||||||
|
|
@ -40,25 +40,25 @@ class GMAlterationEditFactory(
|
||||||
id = LwaTextFieldUio(
|
id = LwaTextFieldUio(
|
||||||
enable = originId == null,
|
enable = originId == null,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.game_master__alteration__edit_id)),
|
label = getString(Res.string.game_master__alteration__edit_id),
|
||||||
valueFlow = idFlow,
|
valueFlow = idFlow,
|
||||||
placeHolderFlow = null,
|
placeHolder = null,
|
||||||
onValueChange = { idFlow.value = it },
|
onValueChange = { idFlow.value = it },
|
||||||
),
|
),
|
||||||
label = LwaTextFieldUio(
|
label = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.game_master__alteration__edit_label)),
|
label = getString(Res.string.game_master__alteration__edit_label),
|
||||||
valueFlow = labelFlow,
|
valueFlow = labelFlow,
|
||||||
placeHolderFlow = null,
|
placeHolder = null,
|
||||||
onValueChange = { labelFlow.value = it },
|
onValueChange = { labelFlow.value = it },
|
||||||
),
|
),
|
||||||
description = LwaTextFieldUio(
|
description = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.game_master__alteration__edit_description)),
|
label = getString(Res.string.game_master__alteration__edit_description),
|
||||||
valueFlow = descriptionFlow,
|
valueFlow = descriptionFlow,
|
||||||
placeHolderFlow = null,
|
placeHolder = null,
|
||||||
onValueChange = { descriptionFlow.value = it },
|
onValueChange = { descriptionFlow.value = it },
|
||||||
),
|
),
|
||||||
tags = tagFlow,
|
tags = tagFlow,
|
||||||
|
|
@ -77,17 +77,17 @@ class GMAlterationEditFactory(
|
||||||
id = LwaTextFieldUio(
|
id = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.game_master__alteration__edit_field_id)),
|
label = getString(Res.string.game_master__alteration__edit_field_id),
|
||||||
valueFlow = idFlow,
|
valueFlow = idFlow,
|
||||||
placeHolderFlow = null,
|
placeHolder = null,
|
||||||
onValueChange = { idFlow.value = it },
|
onValueChange = { idFlow.value = it },
|
||||||
),
|
),
|
||||||
expression = LwaTextFieldUio(
|
expression = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
labelFlow = MutableStateFlow(getString(Res.string.game_master__alteration__edit_field_expression)),
|
label = getString(Res.string.game_master__alteration__edit_field_expression),
|
||||||
valueFlow = expressionFlow,
|
valueFlow = expressionFlow,
|
||||||
placeHolderFlow = null,
|
placeHolder = null,
|
||||||
onValueChange = { expressionFlow.value = it },
|
onValueChange = { expressionFlow.value = it },
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -365,7 +365,7 @@ private fun AlterationEditKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ class GMAlterationViewModel(
|
||||||
|
|
||||||
val filter = LwaTextFieldUio(
|
val filter = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
labelFlow = MutableStateFlow(runBlocking { getString(Res.string.game_master__character__filter) }),
|
label = runBlocking { getString(Res.string.game_master__character__filter) },
|
||||||
valueFlow = filterValue,
|
valueFlow = filterValue,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
placeHolderFlow = MutableStateFlow(null),
|
placeHolder = null,
|
||||||
onValueChange = { filterValue.value = it },
|
onValueChange = { filterValue.value = it },
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,16 +34,18 @@ import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.pixelized.desktop.lwa.LocalBlurController
|
import com.pixelized.desktop.lwa.LocalBlurController
|
||||||
import com.pixelized.desktop.lwa.LocalWindowController
|
import com.pixelized.desktop.lwa.LocalWindowController
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterDetailCharacteristicDialogViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialog
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.alterteration.CharacterSheetAlterationDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialog
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialog
|
||||||
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedViewModel
|
import com.pixelized.desktop.lwa.ui.composable.character.characteristic.CharacterSheetCharacteristicDialogViewModel
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialog
|
||||||
|
import com.pixelized.desktop.lwa.ui.composable.character.diminished.CharacterSheetDiminishedDialogViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
|
import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
|
||||||
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
||||||
import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToCharacterSheetEdit
|
import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToCharacterSheetEdit
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailPanel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.CharacterDetailViewModel
|
||||||
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.rememberTransitionAnimation
|
import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.rememberTransitionAnimation
|
||||||
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.DiminishedStatDialog
|
|
||||||
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.GMFilterHeader
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.GMFilterHeader
|
||||||
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
import com.pixelized.desktop.lwa.ui.theme.color.component.LwaButtonColors
|
import com.pixelized.desktop.lwa.ui.theme.color.component.LwaButtonColors
|
||||||
|
|
@ -60,8 +62,9 @@ import org.koin.compose.viewmodel.koinViewModel
|
||||||
fun GMCharacterPage(
|
fun GMCharacterPage(
|
||||||
viewModel: GMCharacterViewModel = koinViewModel(),
|
viewModel: GMCharacterViewModel = koinViewModel(),
|
||||||
characterDetailViewModel: CharacterDetailViewModel = koinViewModel(),
|
characterDetailViewModel: CharacterDetailViewModel = koinViewModel(),
|
||||||
characteristicDialogViewModel: CharacterDetailCharacteristicDialogViewModel = koinViewModel(),
|
characteristicDialogViewModel: CharacterSheetCharacteristicDialogViewModel = koinViewModel(),
|
||||||
dismissedViewModel: CharacterSheetDiminishedViewModel = koinViewModel(),
|
dismissedViewModel: CharacterSheetDiminishedDialogViewModel = koinViewModel(),
|
||||||
|
alterationViewModel: CharacterSheetAlterationDialogViewModel = koinViewModel(),
|
||||||
) {
|
) {
|
||||||
val windows = LocalWindowController.current
|
val windows = LocalWindowController.current
|
||||||
val blurController = LocalBlurController.current
|
val blurController = LocalBlurController.current
|
||||||
|
|
@ -111,6 +114,7 @@ fun GMCharacterPage(
|
||||||
detailViewModel = characterDetailViewModel,
|
detailViewModel = characterDetailViewModel,
|
||||||
characterDiminishedViewModel = dismissedViewModel,
|
characterDiminishedViewModel = dismissedViewModel,
|
||||||
characteristicDialogViewModel = characteristicDialogViewModel,
|
characteristicDialogViewModel = characteristicDialogViewModel,
|
||||||
|
alterationViewModel = alterationViewModel,
|
||||||
)
|
)
|
||||||
|
|
||||||
CharacterSheetCharacteristicDialog(
|
CharacterSheetCharacteristicDialog(
|
||||||
|
|
@ -132,7 +136,7 @@ fun GMCharacterPage(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
DiminishedStatDialog(
|
CharacterSheetDiminishedDialog(
|
||||||
dialog = dismissedViewModel.diminishedDialog,
|
dialog = dismissedViewModel.diminishedDialog,
|
||||||
onConfirm = { diminished ->
|
onConfirm = { diminished ->
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
|
@ -148,6 +152,23 @@ fun GMCharacterPage(
|
||||||
dismissedViewModel.hideDiminishedDialog()
|
dismissedViewModel.hideDiminishedDialog()
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CharacterSheetAlterationDialog(
|
||||||
|
dialog = alterationViewModel.alterationDialog.collectAsState(),
|
||||||
|
onConfirm = { },
|
||||||
|
onTag = {
|
||||||
|
alterationViewModel.selectedTag(id = it)
|
||||||
|
},
|
||||||
|
onAlteration = { characterSheetId, alterationId, active ->
|
||||||
|
scope.launch {
|
||||||
|
alterationViewModel.toggleAlteration(characterSheetId, alterationId, active)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onDismissRequest = {
|
||||||
|
blurController.hide()
|
||||||
|
alterationViewModel.hide()
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
GameMasterCharacterKeyHandler(
|
GameMasterCharacterKeyHandler(
|
||||||
|
|
@ -253,7 +274,7 @@ private fun GameMasterCharacterKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import kotlinx.coroutines.runBlocking
|
||||||
import lwacharactersheet.composeapp.generated.resources.Res
|
import lwacharactersheet.composeapp.generated.resources.Res
|
||||||
import lwacharactersheet.composeapp.generated.resources.game_master__character__filter
|
import lwacharactersheet.composeapp.generated.resources.game_master__character__filter
|
||||||
import org.jetbrains.compose.resources.getString
|
import org.jetbrains.compose.resources.getString
|
||||||
import java.text.Collator
|
|
||||||
|
|
||||||
class GMCharacterViewModel(
|
class GMCharacterViewModel(
|
||||||
private val networkRepository: NetworkRepository,
|
private val networkRepository: NetworkRepository,
|
||||||
|
|
@ -38,10 +37,10 @@ class GMCharacterViewModel(
|
||||||
|
|
||||||
val filter = LwaTextFieldUio(
|
val filter = LwaTextFieldUio(
|
||||||
enable = true,
|
enable = true,
|
||||||
labelFlow = MutableStateFlow(runBlocking { getString(Res.string.game_master__character__filter) }),
|
label = runBlocking { getString(Res.string.game_master__character__filter) },
|
||||||
valueFlow = filterValue,
|
valueFlow = filterValue,
|
||||||
isError = MutableStateFlow(false),
|
isError = MutableStateFlow(false),
|
||||||
placeHolderFlow = MutableStateFlow(null),
|
placeHolder = null,
|
||||||
onValueChange = { filterValue.value = it },
|
onValueChange = { filterValue.value = it },
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,14 @@ import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField
|
||||||
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
|
||||||
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTag
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTag
|
||||||
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
import com.pixelized.desktop.lwa.ui.screen.gamemaster.common.tag.GMTagUio
|
||||||
|
import com.pixelized.desktop.lwa.ui.theme.color.component.LwaTextFieldColors
|
||||||
import com.pixelized.desktop.lwa.ui.theme.lwa
|
import com.pixelized.desktop.lwa.ui.theme.lwa
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import lwacharactersheet.composeapp.generated.resources.Res
|
import lwacharactersheet.composeapp.generated.resources.Res
|
||||||
|
|
@ -54,6 +56,7 @@ fun GMFilterHeader(
|
||||||
LwaTextField(
|
LwaTextField(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
field = filter,
|
field = filter,
|
||||||
|
colors = LwaTextFieldColors(backgroundColor = Color.Transparent),
|
||||||
trailingIcon = {
|
trailingIcon = {
|
||||||
val value = filter.valueFlow.collectAsState()
|
val value = filter.valueFlow.collectAsState()
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,10 @@ class GMTagFactory {
|
||||||
): List<GMTagUio> {
|
): List<GMTagUio> {
|
||||||
return tags
|
return tags
|
||||||
.map { tag ->
|
.map { tag ->
|
||||||
convertToGMTagItemUio(
|
GMTagUio(
|
||||||
tag = tag,
|
id = tag.id,
|
||||||
selectedTagId = selectedTagId,
|
label = tag.label,
|
||||||
|
highlight = tag.id == selectedTagId,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.sortedWith(
|
.sortedWith(
|
||||||
|
|
|
||||||
|
|
@ -411,7 +411,7 @@ private fun LevelUpKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@ private fun SettingsKeyHandler(
|
||||||
) {
|
) {
|
||||||
KeyHandler {
|
KeyHandler {
|
||||||
when {
|
when {
|
||||||
it.type == KeyEventType.KeyUp && it.key == Key.Escape -> {
|
it.type == KeyEventType.KeyDown && it.key == Key.Escape -> {
|
||||||
onDismissRequest()
|
onDismissRequest()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,16 @@ fun LwaTextFieldColors(
|
||||||
backgroundColor = colors.elevated.base1dp,
|
backgroundColor = colors.elevated.base1dp,
|
||||||
disabledIndicatorColor = Color.Transparent,
|
disabledIndicatorColor = Color.Transparent,
|
||||||
unfocusedIndicatorColor = Color.Transparent,
|
unfocusedIndicatorColor = Color.Transparent,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
@Stable
|
||||||
|
fun LwaTextFieldColors(
|
||||||
|
backgroundColor: Color = MaterialTheme.lwa.colorScheme.elevated.base1dp,
|
||||||
|
disabledIndicatorColor: Color = Color.Transparent,
|
||||||
|
unfocusedIndicatorColor: Color = Color.Transparent,
|
||||||
|
): TextFieldColors = TextFieldDefaults.textFieldColors(
|
||||||
|
backgroundColor = backgroundColor,
|
||||||
|
disabledIndicatorColor = disabledIndicatorColor,
|
||||||
|
unfocusedIndicatorColor = unfocusedIndicatorColor,
|
||||||
)
|
)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue