From 1bf0cb7c0a1328357dc945d661ccd86394b1722b Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Thu, 27 Feb 2025 22:42:10 +0100 Subject: [PATCH] Fix some stuff on the old UI (diminished & edit?) --- composeApp/build.gradle.kts | 5 +- composeApp/compose-desktop.pro | 2 + .../characterSheet/CharacterSheetStore.kt | 2 +- .../lwa/ui/screen/campaign/CampaignScreen.kt | 14 + .../detail/CharacterSheetFactory.kt | 161 ++++++--- .../detail/CharacterSheetPage.kt | 30 +- .../detail/CharacterSheetViewModel.kt | 95 ++--- .../rememberCharacterSheetPagePreview.kt | 14 + .../desktop/lwa/ui/screen/main/MainPage.kt | 333 +++++++++--------- .../lwa/ui/screen/main/MainPageViewModel.kt | 14 +- .../lwa/ui/screen/network/NetworkPage.kt | 23 +- .../lwa/ui/screen/network/NetworkViewModel.kt | 42 +-- .../lwa/ui/screen/roll/RollViewModel.kt | 29 -- .../desktop/lwa/utils/extention/FlowExt.kt | 34 -- gradle/libs.versions.toml | 16 +- 15 files changed, 448 insertions(+), 366 deletions(-) delete mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/FlowExt.kt diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 820bc2e..1a7af98 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -32,7 +32,7 @@ kotlin { implementation(libs.koin.compose.viewmodel) // composable component. implementation(libs.coil.compose) - implementation(libs.coil.network) + implementation(libs.coil.network.ktor) // network implementation(libs.kotlinx.serialization.json) implementation(libs.ktor.serialization.json) @@ -77,6 +77,9 @@ compose.desktop { buildTypes.release.proguard { obfuscate.set(false) // Obfuscation doesn't work because of netty. +// optimize.set(false) +// isEnabled.set(false) + configurationFiles.from(project.file("compose-desktop.pro")) } } diff --git a/composeApp/compose-desktop.pro b/composeApp/compose-desktop.pro index 13f0767..d853df1 100644 --- a/composeApp/compose-desktop.pro +++ b/composeApp/compose-desktop.pro @@ -11,6 +11,8 @@ # OkHttp comming from COIL. -dontwarn okhttp3.internal.platform.** +-keep class coil3.compose.** { *; } +-keep class coil3.network.ktor3.** { *; } # Serialization -keep class io.ktor.serialization.kotlinx.json.** { *; } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt index d0abd95..7a9c602 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/characterSheet/CharacterSheetStore.kt @@ -85,10 +85,10 @@ class CharacterSheetStore( ) { try { client.deleteCharacter(id = characterId) + _detailFlow.delete(characterId = characterId) } catch (exception: Exception) { } - _detailFlow.delete(characterId = characterId) } // endregion diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt index 430814d..c24064f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.LocalWindowController 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.character.characteristic.CharacterDetailCharacteristicDialogViewModel @@ -41,6 +42,7 @@ import com.pixelized.desktop.lwa.ui.composable.character.characteristic.Characte 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.destination.navigateToOldMainPage +import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToRollHistory 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.CharacterDiminishedViewModel @@ -51,6 +53,7 @@ import com.pixelized.desktop.lwa.ui.screen.roll.RollPage import com.pixelized.desktop.lwa.ui.screen.roll.RollViewModel import kotlinx.coroutines.launch import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp import lwacharactersheet.composeapp.generated.resources.ic_table_24dp import org.jetbrains.compose.resources.painterResource import org.koin.compose.viewmodel.koinViewModel @@ -74,6 +77,7 @@ fun MainPage( } } + val windows = LocalWindowController.current val screen = LocalScreenController.current val scope = rememberCoroutineScope() val blurController = rememberBlurContentController() @@ -91,6 +95,16 @@ fun MainPage( Toolbar( title = campaignViewModel.title.collectAsState(initial = "").value, actions = { + IconButton( + onClick = { + windows.navigateToRollHistory() + }, + ) { + Icon( + painter = painterResource(Res.drawable.ic_d20_24dp), + contentDescription = null, + ) + } IconButton( onClick = { screen.navigateToOldMainPage() diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetFactory.kt index 1e2916e..7a150b9 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetFactory.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetFactory.kt @@ -1,8 +1,10 @@ package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio +import com.pixelized.desktop.lwa.ui.screen.campaign.player.detail.sheet.CharacterDetailSheetSkillUio import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetPageUio.Characteristic import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetPageUio.Node +import com.pixelized.desktop.lwa.ui.screen.roll.RollActionUio import com.pixelized.shared.lwa.model.AlteredCharacterSheetFactory import com.pixelized.shared.lwa.model.alteration.FieldAlteration import com.pixelized.shared.lwa.model.campaign.Campaign @@ -70,71 +72,113 @@ class CharacterSheetFactory( id = CharacteristicId.STR, label = getString(Res.string.character_sheet__characteristics__str), value = "${alteredSheet.strength}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__str), description = getString(Res.string.tooltip__characteristics__strength), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__str), + rollAction = "1d100", + rollSuccessValue = alteredSheet.strength * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.DEX, label = getString(Res.string.character_sheet__characteristics__dex), value = "${alteredSheet.dexterity}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__dex), description = getString(Res.string.tooltip__characteristics__dexterity), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__dex), + rollAction = "1d100", + rollSuccessValue = alteredSheet.dexterity * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.CON, label = getString(Res.string.character_sheet__characteristics__con), value = "${alteredSheet.constitution}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__con), description = getString(Res.string.tooltip__characteristics__constitution), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__con), + rollAction = "1d100", + rollSuccessValue = alteredSheet.constitution * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.HEI, label = getString(Res.string.character_sheet__characteristics__hei), value = "${alteredSheet.height}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__hei), description = getString(Res.string.tooltip__characteristics__height), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__hei), + rollAction = "1d100", + rollSuccessValue = alteredSheet.height * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.INT, label = getString(Res.string.character_sheet__characteristics__int), value = "${alteredSheet.intelligence}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__int), description = getString(Res.string.tooltip__characteristics__intelligence), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__int), + rollAction = "1d100", + rollSuccessValue = alteredSheet.intelligence * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.POW, label = getString(Res.string.character_sheet__characteristics__pow), value = "${alteredSheet.power}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__pow), description = getString(Res.string.tooltip__characteristics__power), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__pow), + rollAction = "1d100", + rollSuccessValue = alteredSheet.power * 5 - instance.diminished, + ), ), Characteristic( id = CharacteristicId.CHA, label = getString(Res.string.character_sheet__characteristics__cha), value = "${alteredSheet.charisma}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__characteristics__cha), description = getString(Res.string.tooltip__characteristics__charisma), ), - editable = false, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = getString(Res.string.character_sheet__characteristics__cha), + rollAction = "1d100", + rollSuccessValue = alteredSheet.charisma * 5 - instance.diminished, + ), ), ), subCharacteristics = listOf( @@ -142,139 +186,170 @@ class CharacterSheetFactory( id = CharacteristicId.MOV, label = getString(Res.string.character_sheet__sub_characteristics__movement), value = "${alteredSheet.movement}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__movement), description = getString(Res.string.tooltip__sub_characteristics__movement), ), - editable = false, + roll = null, ), Characteristic( id = CharacteristicId.HP, label = getString(Res.string.character_sheet__sub_characteristics__hit_point), value = alteredSheet.maxHp.let { maxHp -> "${maxHp - instance.damage}/${maxHp}" }, + editable = true, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__hit_point), description = getString(Res.string.tooltip__sub_characteristics__hit_point), ), - editable = true, + roll = null, ), Characteristic( id = CharacteristicId.PP, label = getString(Res.string.character_sheet__sub_characteristics__power_point), value = alteredSheet.maxPp.let { maxPp -> "${maxPp - instance.power}/${maxPp}" }, + editable = true, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__power_point), description = getString(Res.string.tooltip__sub_characteristics__power_point), ), - editable = true, + roll = null, ), Characteristic( id = CharacteristicId.DMG, label = getString(Res.string.character_sheet__sub_characteristics__damage_bonus), value = alteredSheet.damageBonus, + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__damage_bonus), description = getString(Res.string.tooltip__sub_characteristics__bonus_damage), ), - editable = false, + roll = null, ), Characteristic( id = CharacteristicId.ARMOR, label = getString(Res.string.character_sheet__sub_characteristics__armor), value = "${alteredSheet.armor}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__armor), description = getString(Res.string.tooltip__sub_characteristics__armor), ), - editable = false, + roll = null, ), Characteristic( id = CharacteristicId.LB, label = getString(Res.string.character_sheet__sub_characteristics__learning), value = "${alteredSheet.learning}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__learning), description = getString(Res.string.tooltip__sub_characteristics__learning), ), - editable = false, + roll = null, ), Characteristic( id = CharacteristicId.GHP, label = getString(Res.string.character_sheet__sub_characteristics__hp_grow), value = "${alteredSheet.hpGrow}", + editable = false, tooltips = TooltipUio( title = getString(Res.string.character_sheet__sub_characteristics__hp_grow), description = getString(Res.string.tooltip__sub_characteristics__hp_grow), ), - editable = false, + roll = null, ), ), commonSkills = characterSheet.commonSkills.map { skill -> + val value = skillUseCase.computeSkillValue( + sheet = characterSheet, + skill = skill, + diminished = instance.diminished, + alterations = alterations, + ) Node( id = skill.id, label = skill.label, - value = skillUseCase.computeSkillValue( - sheet = characterSheet, - skill = skill, - diminished = instance.diminished, - alterations = alterations, - ), + value = value, + used = skill.used, tooltips = skill.description?.let { TooltipUio( title = skill.label, description = it, ) }, - used = skill.used, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = skill.label, + rollAction = "1d100", + rollSuccessValue = value, + ), ) }, specialSKills = characterSheet.specialSkills.map { skill -> + val value = skillUseCase.computeSkillValue( + sheet = characterSheet, + skill = skill, + diminished = instance.diminished, + alterations = alterations, + ) Node( id = skill.id, label = skill.label, - tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description -> + value = value, + used = skill.used, + tooltips = skill.description?.let { TooltipUio( title = skill.label, - description = description, + description = it, ) }, - value = skillUseCase.computeSkillValue( - sheet = characterSheet, - skill = skill, - diminished = instance.diminished, - alterations = alterations, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = skill.label, + rollAction = "1d100", + rollSuccessValue = value, ), - used = skill.used, ) }, magicsSkills = characterSheet.magicSkills.map { skill -> + val value = skillUseCase.computeSkillValue( + sheet = characterSheet, + skill = skill, + diminished = instance.diminished, + alterations = alterations, + ) Node( id = skill.id, label = skill.label, - tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description -> + value = value, + used = skill.used, + tooltips = skill.description?.let { TooltipUio( title = skill.label, - description = description, + description = it, ) }, - value = skillUseCase.computeSkillValue( - sheet = characterSheet, - skill = skill, - diminished = instance.diminished, - alterations = alterations, + roll = RollActionUio( + characterSheetId = alteredSheet.id, + label = skill.label, + rollAction = "1d100", + rollSuccessValue = value, ), - used = skill.used, ) }, actions = characterSheet.actions.mapNotNull { - if (it.roll.isNotEmpty()) { - CharacterSheetPageUio.Roll( + if (it.roll.isEmpty()) return@mapNotNull null + CharacterSheetPageUio.Roll( + label = it.label, + value = it.roll, + roll = RollActionUio( + characterSheetId = alteredSheet.id, label = it.label, - value = it.roll, + rollAction = it.roll, + rollSuccessValue = null, ) - } else { - null - } + ) } ) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetPage.kt index dbe2449..23dc7e0 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetPage.kt @@ -45,6 +45,7 @@ import androidx.compose.material.icons.filled.MoreVert import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -67,6 +68,7 @@ import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetP 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.screen.characterSheet.detail.preview.rememberCharacterSheetPreview +import com.pixelized.desktop.lwa.ui.screen.roll.RollActionUio import com.pixelized.desktop.lwa.ui.screen.roll.RollPage import com.pixelized.desktop.lwa.ui.screen.roll.RollViewModel import com.pixelized.desktop.lwa.utils.preview.ContentPreview @@ -105,6 +107,7 @@ data class CharacterSheetPageUio( val value: String, val editable: Boolean, val tooltips: TooltipUio?, + val roll: RollActionUio?, ) @Stable @@ -112,14 +115,16 @@ data class CharacterSheetPageUio( val id: String, val label: String, val value: Int, - val tooltips: TooltipUio? = null, val used: Boolean, + val tooltips: TooltipUio? = null, + val roll: RollActionUio, ) @Stable data class Roll( val label: String, val value: String, + val roll: RollActionUio?, ) } @@ -133,6 +138,7 @@ fun CharacterSheetPage( val window = LocalWindow.current val scope = rememberCoroutineScope() val blurController = remember { BlurContentController() } + val sheet = viewModel.sheetFlow.collectAsState() Surface( modifier = Modifier.fillMaxSize(), @@ -140,11 +146,11 @@ fun CharacterSheetPage( BlurContent( controller = blurController, content = { - viewModel.sheet.value?.let { sheet -> + sheet.value?.let { sheet -> CharacterSheetPageContent( modifier = Modifier.fillMaxSize(), characterSheet = sheet, - diminishedValue = viewModel.diminishedValue, + diminishedValue = viewModel.diminishedValueFlow.collectAsState(), onDiminished = { blurController.show() scope.launch { @@ -162,11 +168,9 @@ fun CharacterSheetPage( viewModel.showConfirmCharacterDeletionDialog() }, onCharacteristic = { characteristic -> + if (characteristic.roll == null) return@CharacterSheetPageContent + rollViewModel.prepareRoll(characteristic.roll) blurController.show() - rollViewModel.prepareRoll( - sheet = sheet, - characteristic = characteristic - ) viewModel.showRollOverlay() }, onSubCharacteristic = { @@ -177,7 +181,7 @@ fun CharacterSheetPage( }, onSkill = { node -> blurController.show() - rollViewModel.prepareRoll(sheet = sheet, node = node) + rollViewModel.prepareRoll(node.roll) viewModel.showRollOverlay() }, onUseSkill = viewModel::onUseSkill, @@ -233,11 +237,11 @@ fun CharacterSheetPage( DiminishedStatDialog( dialog = viewModel.diminishedDialog, onConfirm = { - viewModel.changeDiminished( - dialog = it - ) - viewModel.hideDiminishedDialog() - blurController.hide() + scope.launch { + viewModel.changeDiminished(dialog = it) + viewModel.hideDiminishedDialog() + blurController.hide() + } }, onDismissRequest = { viewModel.hideDiminishedDialog() diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetViewModel.kt index 2ae42b2..0651d73 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/CharacterSheetViewModel.kt @@ -1,10 +1,9 @@ package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail -import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -15,13 +14,18 @@ import com.pixelized.desktop.lwa.repository.network.NetworkRepository 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.DiminishedStatDialogUio - +import com.pixelized.shared.lwa.protocol.websocket.payload.CampaignMessage import com.pixelized.shared.lwa.protocol.websocket.payload.UpdateSkillUsageMessage import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.serialization.json.Json +import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.character_sheet__diminished__label +import javax.swing.UIManager.getString private typealias CSDCDialogUio = CharacterSheetDeleteConfirmationDialogUio @@ -46,16 +50,12 @@ class CharacterSheetViewModel( private val _diminishedDialog = mutableStateOf(null) val diminishedDialog: State get() = _diminishedDialog - // TODO -// private val diminishedValueFlow = characterRepository.characterDiminishedFlow(id = argument.id) - val diminishedValue: State - @Composable -// get() = diminishedValueFlow.collectAsState { it -> -// it.takeIf { it > 0 } -// } - get() = remember { mutableStateOf(null) } + val diminishedValueFlow: StateFlow = campaignRepository + .characterInstanceFlow(id = argument.characterInstanceId) + .map { instance -> instance.diminished.takeIf { it > 0 } } + .stateIn(scope = viewModelScope, SharingStarted.Lazily, null) - private val sheetFlow = combine( + val sheetFlow = combine( characterRepository.characterDetailFlow(characterId = argument.characterInstanceId.characterSheetId), campaignRepository.campaignFlow, alteration.alterationsFlow(characterId = argument.characterInstanceId), @@ -72,9 +72,6 @@ class CharacterSheetViewModel( started = SharingStarted.Eagerly, initialValue = null, ) - val sheet: State - @Composable - get() = sheetFlow.collectAsState() suspend fun deleteCharacter(id: String) { characterRepository.deleteCharacter(characterId = id) @@ -93,14 +90,13 @@ class CharacterSheetViewModel( } fun showConfirmCharacterDeletionDialog() { - characterRepository.characterPreview( + val preview = characterRepository.characterPreview( characterId = argument.characterInstanceId.characterSheetId - )?.let { preview -> - _displayDeleteConfirmationDialog.value = CharacterSheetDeleteConfirmationDialogUio( - id = preview.id, - name = preview.name, - ) - } + ) ?: return + _displayDeleteConfirmationDialog.value = CharacterSheetDeleteConfirmationDialogUio( + id = preview.id, + name = preview.name, + ) } fun hideConfirmCharacterDeletionDialog() { @@ -115,32 +111,43 @@ class CharacterSheetViewModel( _displayRollOverlay.value = false } - suspend fun showDiminishedDialog() { -// val diminished = characterRepository.characterDiminishedFlow(id = argument.id).value -// val textFieldValue = -// mutableStateOf(TextFieldValue("$diminished", selection = TextRange(index = 0))) -// _diminishedDialog.value = DiminishedStatDialogUio( -// id = argument.id, -// label = getString(resource = Res.string.character_sheet__diminished__label), -// value = { textFieldValue.value }, -// onValueChange = { value -> -// textFieldValue.value = when (value.text.toIntOrNull()?.takeIf { it >= 0 }) { -// null -> TextFieldValue("0", selection = TextRange(index = 0)) -// else -> value -// } -// }, -// ) + fun showDiminishedDialog() { + val diminished = campaignRepository + .characterInstance(characterInstanceId = argument.characterInstanceId) + .diminished + + val textFieldValue = mutableStateOf( + TextFieldValue( + text = "$diminished", + selection = TextRange(index = 0), + ) + ) + + _diminishedDialog.value = DiminishedStatDialogUio( + characterInstanceId = argument.characterInstanceId, + label = getString(Res.string.character_sheet__diminished__label), + value = { textFieldValue.value }, + onValueChange = { value -> + textFieldValue.value = when (value.text.toIntOrNull()?.takeIf { it >= 0 }) { + null -> TextFieldValue("0", selection = TextRange(index = 0)) + else -> value + } + }, + ) } fun hideDiminishedDialog() { _diminishedDialog.value = null } - fun changeDiminished(dialog: DiminishedStatDialogUio) { -// val value = dialog.value().text.toIntOrNull() ?: 0 -// characterRepository.setDiminishedForCharacter( -// id = dialog.id, -// diminished = value, -// ) + suspend fun changeDiminished(dialog: DiminishedStatDialogUio) { + val diminished = dialog.value().text.toIntOrNull() ?: 0 + network.share( + payload = CampaignMessage.UpdateDiminished( + characterSheetId = dialog.characterInstanceId.characterSheetId, + instanceId = dialog.characterInstanceId.instanceId, + diminished = diminished, + ) + ) } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt index 1bac568..45c06cb 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/characterSheet/detail/preview/rememberCharacterSheetPagePreview.kt @@ -22,6 +22,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.DEX, @@ -29,6 +30,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.CON, @@ -36,6 +38,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.HEI, @@ -43,6 +46,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.INT, @@ -50,6 +54,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.POW, @@ -57,6 +62,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.CHA, @@ -64,6 +70,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), ), subCharacteristics = listOf( @@ -73,6 +80,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "10", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.HP, @@ -80,6 +88,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "20/20", tooltips = null, editable = true, + roll = null, ), Characteristic( id = CharacteristicId.PP, @@ -87,6 +96,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "15/15", tooltips = null, editable = true, + roll = null, ), Characteristic( id = CharacteristicId.DMG, @@ -94,6 +104,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "1d4", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.ARMOR, @@ -101,6 +112,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "0", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.LB, @@ -108,6 +120,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "0", tooltips = null, editable = false, + roll = null, ), Characteristic( id = CharacteristicId.GHP, @@ -115,6 +128,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio { value = "5", tooltips = null, editable = false, + roll = null, ), ), commonSkills = emptyList(), diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPage.kt index 85d8969..d759c0f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPage.kt @@ -1,5 +1,6 @@ package com.pixelized.desktop.lwa.ui.screen.main +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -31,9 +32,11 @@ import com.pixelized.desktop.lwa.ui.navigation.screen.destination.navigateToNetw import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToCharacterSheet import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToCharacterSheetEdit import com.pixelized.desktop.lwa.ui.navigation.window.destination.navigateToRollHistory +import com.pixelized.desktop.lwa.ui.screen.campaign.toolbar.Toolbar import com.pixelized.shared.lwa.model.campaign.Campaign import kotlinx.coroutines.runBlocking import lwacharactersheet.composeapp.generated.resources.Res +import lwacharactersheet.composeapp.generated.resources.app_name import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__create__title import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp import lwacharactersheet.composeapp.generated.resources.ic_file_24dp @@ -63,53 +66,47 @@ fun OldMainPage( val screen = LocalScreenController.current val characters = viewModel.characters.collectAsState() val npcs = viewModel.npcs.collectAsState() + val enableRollHistory = viewModel.enableRollHistoryFlow.collectAsState() Surface( modifier = Modifier.fillMaxSize(), ) { - Box( - modifier = Modifier - .verticalScroll(state = rememberScrollState()) - .fillMaxSize() - .padding(horizontal = 16.dp), - contentAlignment = Alignment.Center, - ) { - MainPageContent( - characters = characters, - npcs = npcs, - enableRollHistory = viewModel.enableRollHistory, - onCharacter = { - window.navigateToCharacterSheet( - characterId = it.id, - title = it.name, - ) - }, - onCreateCharacter = { - window.navigateToCharacterSheetEdit( - characterId = null, - title = runBlocking { getString(Res.string.character_sheet_edit__create__title) }, - ) - }, - onRollHistory = { - window.navigateToRollHistory() - }, - onOpenSaveDirectory = { - viewModel.openSaveDirectory() - }, - onNetwork = { - screen.navigateToNetwork() - }, - onMainPage = { - screen.navigateToMainPage() - } - ) - } + MainPageContent( + characters = characters, + npcs = npcs, + enableRollHistory = enableRollHistory, + onCharacter = { + window.navigateToCharacterSheet( + characterId = it.id, + title = it.name, + ) + }, + onCreateCharacter = { + window.navigateToCharacterSheetEdit( + characterId = null, + title = runBlocking { getString(Res.string.character_sheet_edit__create__title) }, + ) + }, + onRollHistory = { + window.navigateToRollHistory() + }, + onOpenSaveDirectory = { + viewModel.openSaveDirectory() + }, + onNetwork = { + screen.navigateToNetwork() + }, + onMainPage = { + screen.navigateToMainPage() + } + ) } } @Composable fun MainPageContent( modifier: Modifier = Modifier, + scrollState: ScrollState = rememberScrollState(), characters: State>, npcs: State>, enableRollHistory: State, @@ -123,150 +120,164 @@ fun MainPageContent( Column( modifier = modifier, ) { - if (characters.value.isNotEmpty()) { - Column { - characters.value.forEach { sheet -> - TextButton( - onClick = { onCharacter(sheet) }, + Toolbar( + title = runBlocking { getString(Res.string.app_name) }, + actions = { + TextButton( + onClick = onMainPage, + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + verticalAlignment = Alignment.CenterVertically, ) { + Icon( + painter = painterResource(Res.drawable.ic_swords_24dp), + contentDescription = null, + ) Text( - modifier = Modifier.fillMaxWidth(), overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, maxLines = 1, - text = sheet.name, + text = "Nouvelle interface utilisateur", ) } } } - } - - if (characters.value.isNotEmpty() && npcs.value.isNotEmpty()) { - Spacer(modifier = Modifier.height(height = 24.dp)) - } - - if (npcs.value.isNotEmpty()) { + ) + Box( + modifier = Modifier + .verticalScroll(state = scrollState) + .fillMaxSize() + .padding(horizontal = 16.dp), + contentAlignment = Alignment.Center, + ) { Column { - npcs.value.forEach { sheet -> - TextButton( - onClick = { onCharacter(sheet) }, + if (characters.value.isNotEmpty()) { + Column { + characters.value.forEach { sheet -> + TextButton( + onClick = { onCharacter(sheet) }, + ) { + Text( + modifier = Modifier.fillMaxWidth(), + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Start, + maxLines = 1, + text = sheet.name, + ) + } + } + } + } + + if (characters.value.isNotEmpty() && npcs.value.isNotEmpty()) { + Spacer(modifier = Modifier.height(height = 24.dp)) + } + + if (npcs.value.isNotEmpty()) { + Column { + npcs.value.forEach { sheet -> + TextButton( + onClick = { onCharacter(sheet) }, + ) { + Text( + modifier = Modifier.fillMaxWidth(), + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Start, + maxLines = 1, + text = sheet.name, + ) + } + } + } + } + + Spacer(modifier = Modifier.height(height = 24.dp)) + + TextButton( + onClick = onCreateCharacter, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + verticalAlignment = Alignment.CenterVertically, ) { + Icon( + painter = painterResource(Res.drawable.ic_file_24dp), + contentDescription = null, + ) Text( - modifier = Modifier.fillMaxWidth(), + maxLines = 1, overflow = TextOverflow.Ellipsis, textAlign = TextAlign.Start, - maxLines = 1, - text = sheet.name, + text = stringResource(Res.string.main_page__create_action), ) } } - } - } - Spacer(modifier = Modifier.height(height = 24.dp)) + TextButton( + onClick = onOpenSaveDirectory, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(Res.drawable.ic_folder_24dp), + contentDescription = null, + ) + Text( + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Start, + text = stringResource(Res.string.main_page__open_save_directory), + ) + } + } - TextButton( - onClick = onCreateCharacter, - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(Res.drawable.ic_file_24dp), - contentDescription = null, - ) - Text( - maxLines = 1, - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.Start, - text = stringResource(Res.string.main_page__create_action), - ) - } - } + TextButton( + enabled = enableRollHistory.value, + onClick = onRollHistory, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(Res.drawable.ic_d20_24dp), + contentDescription = null, + ) + Text( + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Start, + text = stringResource(Res.string.main_page__roll_history_action), + ) + } + } - TextButton( - onClick = onOpenSaveDirectory, - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(Res.drawable.ic_folder_24dp), - contentDescription = null, - ) - Text( - maxLines = 1, - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.Start, - text = stringResource(Res.string.main_page__open_save_directory), - ) - } - } - - TextButton( - enabled = enableRollHistory.value, - onClick = onRollHistory, - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(Res.drawable.ic_d20_24dp), - contentDescription = null, - ) - Text( - maxLines = 1, - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.Start, - text = stringResource(Res.string.main_page__roll_history_action), - ) - } - } - - TextButton( - onClick = onNetwork, - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(Res.drawable.ic_table_24dp), - contentDescription = null, - ) - Text( - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.Start, - maxLines = 1, - text = stringResource(Res.string.main_page__network_action), - ) - } - } - TextButton( - onClick = onMainPage, - ) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(space = 8.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Icon( - painter = painterResource(Res.drawable.ic_swords_24dp), - contentDescription = null, - ) - Text( - overflow = TextOverflow.Ellipsis, - textAlign = TextAlign.Start, - maxLines = 1, - text = "Nouvelle interface utilisateur", - ) + TextButton( + onClick = onNetwork, + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(Res.drawable.ic_table_24dp), + contentDescription = null, + ) + Text( + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Start, + maxLines = 1, + text = stringResource(Res.string.main_page__network_action), + ) + } + } } } } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPageViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPageViewModel.kt index 5b6b7da..90965bb 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPageViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/main/MainPageViewModel.kt @@ -1,14 +1,11 @@ package com.pixelized.desktop.lwa.ui.screen.main -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.lordcodes.turtle.shellRun import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository import com.pixelized.desktop.lwa.repository.characterSheet.CharacterSheetRepository import com.pixelized.desktop.lwa.repository.network.NetworkRepository -import com.pixelized.desktop.lwa.utils.extention.collectAsState import com.pixelized.shared.lwa.OperatingSystem import com.pixelized.shared.lwa.storePath import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -78,10 +75,13 @@ class MainPageViewModel( initialValue = emptyList(), ) - private val networkStatus = networkRepository.status - val enableRollHistory: State - @Composable - get() = networkStatus.collectAsState { it == NetworkRepository.Status.CONNECTED } + val enableRollHistoryFlow = networkRepository.status + .map { it == NetworkRepository.Status.CONNECTED } + .stateIn( + scope = viewModelScope, + started = SharingStarted.Lazily, + initialValue = false, + ) fun openSaveDirectory( os: OperatingSystem = OperatingSystem.current, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkPage.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkPage.kt index 1b3924c..08cfbf5 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkPage.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkPage.kt @@ -34,6 +34,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow @@ -60,7 +61,25 @@ data class NetworkPageUio( val enableFields: Boolean, val enableActions: Boolean, val enableCancel: Boolean, -) +) { + companion object { + fun empty( + player: String = "", + host: String = "", + port: String = "", + enableFields: Boolean = false, + enableActions: Boolean = false, + enableCancel: Boolean = false, + ) = NetworkPageUio( + player = player, + host = host, + port = port, + enableFields = enableFields, + enableActions = enableActions, + enableCancel = enableCancel, + ) + } +} @Composable fun NetworkPage( @@ -82,7 +101,7 @@ fun NetworkPage( ) { NetworkContent( modifier = Modifier.fillMaxSize(), - player = viewModel.network, + player = viewModel.network.collectAsState(), onBack = { screen.popBackStack() }, onPlayerChange = viewModel::onPlayerNameChange, onHostChange = viewModel::onHostChange, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkViewModel.kt index 80d1dec..9f44169 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/network/NetworkViewModel.kt @@ -1,21 +1,19 @@ package com.pixelized.desktop.lwa.ui.screen.network -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Stable import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pixelized.desktop.lwa.repository.network.NetworkRepository import com.pixelized.desktop.lwa.repository.settings.SettingsRepository import com.pixelized.desktop.lwa.ui.composable.blur.BlurContentController import com.pixelized.desktop.lwa.ui.composable.error.ErrorSnackUio -import com.pixelized.desktop.lwa.utils.extention.collectAsState import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch class NetworkViewModel( @@ -38,23 +36,21 @@ class NetworkViewModel( val controller: BlurContentController = BlurContentController() - val network: State - @Composable - @Stable - get() { - val player = settingsRepository.settingsFlow().collectAsState { it.playerName } - val status = networkRepository.status.collectAsState() - return remember { - derivedStateOf { - factory.convertToUio( - player = player.value, - status = status.value, - host = host.value, - port = port.value, - ) - } - } - } + val network: StateFlow = combine( + settingsRepository.settingsFlow(), + networkRepository.status, + ) { settings, status -> + factory.convertToUio( + player = settings.playerName, + status = status, + host = host.value, + port = port.value, + ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.Eagerly, + initialValue = NetworkPageUio.empty() + ) fun onPlayerNameChange(player: String) { settingsRepository.update( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/roll/RollViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/roll/RollViewModel.kt index 315271d..093c6f8 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/roll/RollViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/roll/RollViewModel.kt @@ -59,35 +59,6 @@ class RollViewModel( private val _displayOverlay = mutableStateOf(false) val displayOverlay: State get() = _displayOverlay - @Deprecated(message = "@See prepareRoll(RollActionUio)") - fun prepareRoll( - sheet: CharacterSheetPageUio, - characteristic: CharacterSheetPageUio.Characteristic, - ) { - // TODO characterSheetRepository.characterDiminishedFlow(id = sheet.id).value - val diminished = 0 - - prepareRoll( - characterSheetId = sheet.id, - label = characteristic.label, - rollAction = "1d100", - rollSuccessValue = (characteristic.value.toIntOrNull() ?: 0) * 5 - diminished, - ) - } - - @Deprecated(message = "@See prepareRoll(RollActionUio)") - fun prepareRoll( - sheet: CharacterSheetPageUio, - node: CharacterSheetPageUio.Node, - ) { - prepareRoll( - characterSheetId = sheet.id, - label = node.label, - rollAction = "1d100", - rollSuccessValue = node.value, - ) - } - @Deprecated(message = "@See prepareRoll(RollActionUio)") fun prepareRoll( sheet: CharacterSheetPageUio, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/FlowExt.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/FlowExt.kt deleted file mode 100644 index 1fc1dbb..0000000 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/utils/extention/FlowExt.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.pixelized.desktop.lwa.utils.extention - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.runtime.produceState -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.withContext -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext - -@Suppress("StateFlowValueCalledInComposition") -@Composable -fun StateFlow.collectAsState( - context: CoroutineContext = EmptyCoroutineContext, - convert: (T) -> R, -): State = collectAsState( - initial = value, - context = context, - convert = convert, -) - -@Composable -fun Flow.collectAsState( - initial: T, - context: CoroutineContext = EmptyCoroutineContext, - convert: (T) -> R, -): State = produceState(convert(initial), this, context) { - if (context == EmptyCoroutineContext) { - collect { value = convert(it) } - } else withContext(context) { - collect { value = convert(it) } - } -} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 09d2ba3..221c87d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,21 +20,24 @@ kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = ktor = { id = "io.ktor.plugin", version.ref = "ktor" } [libraries] +# Test & preview kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } - compose-desktop-preview = { group = "org.jetbrains.compose.ui", name = "ui-tooling-preview", version.ref = "compose-multiplatform" } - +# Compose & Kotlin androidx-lifecycle-viewmodel = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "androidx-lifecycle" } androidx-lifecycle-runtime-compose = { group = "org.jetbrains.androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidx-lifecycle" } androidx-navigation-compose = { group = "org.jetbrains.androidx.navigation", name = "navigation-compose", version.ref = "androidx-navigation" } kotlinx-coroutines-swing = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-json" } - +# UI. +coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } +coil-network-ktor = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = "coil" } +# Injection with Koin koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } koin-ktor = { module = "io.insert-koin:koin-ktor", version.ref = "koin" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" } - +# Ktor server & client ktor-serialization-json = { group = 'io.ktor', name = 'ktor-serialization-kotlinx-json', version.ref = "ktor" } ktor-client-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" } ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" } @@ -46,7 +49,4 @@ ktor-server-websockets = { group = 'io.ktor', name = "ktor-server-websockets", v ktor-server-negotiation = { group = 'io.ktor', name = 'ktor-server-content-negotiation', version.ref = "ktor" } turtle = { group = "com.lordcodes.turtle", name = "turtle", version.ref = "turtle" } -logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } - -coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" } -coil-network = { module = "io.coil-kt.coil3:coil-network-okhttp", version.ref = "coil" } \ No newline at end of file +logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } \ No newline at end of file