Fix some stuff on the old UI (diminished & edit?)

This commit is contained in:
Thomas Andres Gomez 2025-02-27 22:42:10 +01:00
parent f51a83cf6e
commit 1bf0cb7c0a
15 changed files with 448 additions and 366 deletions

View file

@ -32,7 +32,7 @@ kotlin {
implementation(libs.koin.compose.viewmodel) implementation(libs.koin.compose.viewmodel)
// composable component. // composable component.
implementation(libs.coil.compose) implementation(libs.coil.compose)
implementation(libs.coil.network) implementation(libs.coil.network.ktor)
// network // network
implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.json)
implementation(libs.ktor.serialization.json) implementation(libs.ktor.serialization.json)
@ -77,6 +77,9 @@ compose.desktop {
buildTypes.release.proguard { buildTypes.release.proguard {
obfuscate.set(false) // Obfuscation doesn't work because of netty. obfuscate.set(false) // Obfuscation doesn't work because of netty.
// optimize.set(false)
// isEnabled.set(false)
configurationFiles.from(project.file("compose-desktop.pro")) configurationFiles.from(project.file("compose-desktop.pro"))
} }
} }

View file

@ -11,6 +11,8 @@
# OkHttp comming from COIL. # OkHttp comming from COIL.
-dontwarn okhttp3.internal.platform.** -dontwarn okhttp3.internal.platform.**
-keep class coil3.compose.** { *; }
-keep class coil3.network.ktor3.** { *; }
# Serialization # Serialization
-keep class io.ktor.serialization.kotlinx.json.** { *; } -keep class io.ktor.serialization.kotlinx.json.** { *; }

View file

@ -85,10 +85,10 @@ class CharacterSheetStore(
) { ) {
try { try {
client.deleteCharacter(id = characterId) client.deleteCharacter(id = characterId)
_detailFlow.delete(characterId = characterId)
} catch (exception: Exception) { } catch (exception: Exception) {
} }
_detailFlow.delete(characterId = characterId)
} }
// endregion // endregion

View file

@ -34,6 +34,7 @@ import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp 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.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.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.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.navigateToOldMainPage 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.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.CharacterDiminishedViewModel 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 com.pixelized.desktop.lwa.ui.screen.roll.RollViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.Res
import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp
import lwacharactersheet.composeapp.generated.resources.ic_table_24dp import lwacharactersheet.composeapp.generated.resources.ic_table_24dp
import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.painterResource
import org.koin.compose.viewmodel.koinViewModel import org.koin.compose.viewmodel.koinViewModel
@ -74,6 +77,7 @@ fun MainPage(
} }
} }
val windows = LocalWindowController.current
val screen = LocalScreenController.current val screen = LocalScreenController.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val blurController = rememberBlurContentController() val blurController = rememberBlurContentController()
@ -91,6 +95,16 @@ fun MainPage(
Toolbar( Toolbar(
title = campaignViewModel.title.collectAsState(initial = "").value, title = campaignViewModel.title.collectAsState(initial = "").value,
actions = { actions = {
IconButton(
onClick = {
windows.navigateToRollHistory()
},
) {
Icon(
painter = painterResource(Res.drawable.ic_d20_24dp),
contentDescription = null,
)
}
IconButton( IconButton(
onClick = { onClick = {
screen.navigateToOldMainPage() screen.navigateToOldMainPage()

View file

@ -1,8 +1,10 @@
package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail
import com.pixelized.desktop.lwa.ui.composable.tooltip.TooltipUio 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.Characteristic
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.CharacterSheetPageUio.Node 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.AlteredCharacterSheetFactory
import com.pixelized.shared.lwa.model.alteration.FieldAlteration import com.pixelized.shared.lwa.model.alteration.FieldAlteration
import com.pixelized.shared.lwa.model.campaign.Campaign import com.pixelized.shared.lwa.model.campaign.Campaign
@ -70,71 +72,113 @@ class CharacterSheetFactory(
id = CharacteristicId.STR, id = CharacteristicId.STR,
label = getString(Res.string.character_sheet__characteristics__str), label = getString(Res.string.character_sheet__characteristics__str),
value = "${alteredSheet.strength}", value = "${alteredSheet.strength}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__str), title = getString(Res.string.character_sheet__characteristics__str),
description = getString(Res.string.tooltip__characteristics__strength), 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( Characteristic(
id = CharacteristicId.DEX, id = CharacteristicId.DEX,
label = getString(Res.string.character_sheet__characteristics__dex), label = getString(Res.string.character_sheet__characteristics__dex),
value = "${alteredSheet.dexterity}", value = "${alteredSheet.dexterity}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__dex), title = getString(Res.string.character_sheet__characteristics__dex),
description = getString(Res.string.tooltip__characteristics__dexterity), 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( Characteristic(
id = CharacteristicId.CON, id = CharacteristicId.CON,
label = getString(Res.string.character_sheet__characteristics__con), label = getString(Res.string.character_sheet__characteristics__con),
value = "${alteredSheet.constitution}", value = "${alteredSheet.constitution}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__con), title = getString(Res.string.character_sheet__characteristics__con),
description = getString(Res.string.tooltip__characteristics__constitution), 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( Characteristic(
id = CharacteristicId.HEI, id = CharacteristicId.HEI,
label = getString(Res.string.character_sheet__characteristics__hei), label = getString(Res.string.character_sheet__characteristics__hei),
value = "${alteredSheet.height}", value = "${alteredSheet.height}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__hei), title = getString(Res.string.character_sheet__characteristics__hei),
description = getString(Res.string.tooltip__characteristics__height), 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( Characteristic(
id = CharacteristicId.INT, id = CharacteristicId.INT,
label = getString(Res.string.character_sheet__characteristics__int), label = getString(Res.string.character_sheet__characteristics__int),
value = "${alteredSheet.intelligence}", value = "${alteredSheet.intelligence}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__int), title = getString(Res.string.character_sheet__characteristics__int),
description = getString(Res.string.tooltip__characteristics__intelligence), 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( Characteristic(
id = CharacteristicId.POW, id = CharacteristicId.POW,
label = getString(Res.string.character_sheet__characteristics__pow), label = getString(Res.string.character_sheet__characteristics__pow),
value = "${alteredSheet.power}", value = "${alteredSheet.power}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__pow), title = getString(Res.string.character_sheet__characteristics__pow),
description = getString(Res.string.tooltip__characteristics__power), 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( Characteristic(
id = CharacteristicId.CHA, id = CharacteristicId.CHA,
label = getString(Res.string.character_sheet__characteristics__cha), label = getString(Res.string.character_sheet__characteristics__cha),
value = "${alteredSheet.charisma}", value = "${alteredSheet.charisma}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__characteristics__cha), title = getString(Res.string.character_sheet__characteristics__cha),
description = getString(Res.string.tooltip__characteristics__charisma), 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( subCharacteristics = listOf(
@ -142,139 +186,170 @@ class CharacterSheetFactory(
id = CharacteristicId.MOV, id = CharacteristicId.MOV,
label = getString(Res.string.character_sheet__sub_characteristics__movement), label = getString(Res.string.character_sheet__sub_characteristics__movement),
value = "${alteredSheet.movement}", value = "${alteredSheet.movement}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__movement), title = getString(Res.string.character_sheet__sub_characteristics__movement),
description = getString(Res.string.tooltip__sub_characteristics__movement), description = getString(Res.string.tooltip__sub_characteristics__movement),
), ),
editable = false, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.HP, id = CharacteristicId.HP,
label = getString(Res.string.character_sheet__sub_characteristics__hit_point), label = getString(Res.string.character_sheet__sub_characteristics__hit_point),
value = alteredSheet.maxHp.let { maxHp -> "${maxHp - instance.damage}/${maxHp}" }, value = alteredSheet.maxHp.let { maxHp -> "${maxHp - instance.damage}/${maxHp}" },
editable = true,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__hit_point), title = getString(Res.string.character_sheet__sub_characteristics__hit_point),
description = getString(Res.string.tooltip__sub_characteristics__hit_point), description = getString(Res.string.tooltip__sub_characteristics__hit_point),
), ),
editable = true, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.PP, id = CharacteristicId.PP,
label = getString(Res.string.character_sheet__sub_characteristics__power_point), label = getString(Res.string.character_sheet__sub_characteristics__power_point),
value = alteredSheet.maxPp.let { maxPp -> "${maxPp - instance.power}/${maxPp}" }, value = alteredSheet.maxPp.let { maxPp -> "${maxPp - instance.power}/${maxPp}" },
editable = true,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__power_point), title = getString(Res.string.character_sheet__sub_characteristics__power_point),
description = getString(Res.string.tooltip__sub_characteristics__power_point), description = getString(Res.string.tooltip__sub_characteristics__power_point),
), ),
editable = true, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.DMG, id = CharacteristicId.DMG,
label = getString(Res.string.character_sheet__sub_characteristics__damage_bonus), label = getString(Res.string.character_sheet__sub_characteristics__damage_bonus),
value = alteredSheet.damageBonus, value = alteredSheet.damageBonus,
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__damage_bonus), title = getString(Res.string.character_sheet__sub_characteristics__damage_bonus),
description = getString(Res.string.tooltip__sub_characteristics__bonus_damage), description = getString(Res.string.tooltip__sub_characteristics__bonus_damage),
), ),
editable = false, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.ARMOR, id = CharacteristicId.ARMOR,
label = getString(Res.string.character_sheet__sub_characteristics__armor), label = getString(Res.string.character_sheet__sub_characteristics__armor),
value = "${alteredSheet.armor}", value = "${alteredSheet.armor}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__armor), title = getString(Res.string.character_sheet__sub_characteristics__armor),
description = getString(Res.string.tooltip__sub_characteristics__armor), description = getString(Res.string.tooltip__sub_characteristics__armor),
), ),
editable = false, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.LB, id = CharacteristicId.LB,
label = getString(Res.string.character_sheet__sub_characteristics__learning), label = getString(Res.string.character_sheet__sub_characteristics__learning),
value = "${alteredSheet.learning}", value = "${alteredSheet.learning}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__learning), title = getString(Res.string.character_sheet__sub_characteristics__learning),
description = getString(Res.string.tooltip__sub_characteristics__learning), description = getString(Res.string.tooltip__sub_characteristics__learning),
), ),
editable = false, roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.GHP, id = CharacteristicId.GHP,
label = getString(Res.string.character_sheet__sub_characteristics__hp_grow), label = getString(Res.string.character_sheet__sub_characteristics__hp_grow),
value = "${alteredSheet.hpGrow}", value = "${alteredSheet.hpGrow}",
editable = false,
tooltips = TooltipUio( tooltips = TooltipUio(
title = getString(Res.string.character_sheet__sub_characteristics__hp_grow), title = getString(Res.string.character_sheet__sub_characteristics__hp_grow),
description = getString(Res.string.tooltip__sub_characteristics__hp_grow), description = getString(Res.string.tooltip__sub_characteristics__hp_grow),
), ),
editable = false, roll = null,
), ),
), ),
commonSkills = characterSheet.commonSkills.map { skill -> commonSkills = characterSheet.commonSkills.map { skill ->
Node( val value = skillUseCase.computeSkillValue(
id = skill.id,
label = skill.label,
value = skillUseCase.computeSkillValue(
sheet = characterSheet, sheet = characterSheet,
skill = skill, skill = skill,
diminished = instance.diminished, diminished = instance.diminished,
alterations = alterations, alterations = alterations,
), )
Node(
id = skill.id,
label = skill.label,
value = value,
used = skill.used,
tooltips = skill.description?.let { tooltips = skill.description?.let {
TooltipUio( TooltipUio(
title = skill.label, title = skill.label,
description = it, description = it,
) )
}, },
used = skill.used, roll = RollActionUio(
characterSheetId = alteredSheet.id,
label = skill.label,
rollAction = "1d100",
rollSuccessValue = value,
),
) )
}, },
specialSKills = characterSheet.specialSkills.map { skill -> specialSKills = characterSheet.specialSkills.map { skill ->
Node( val value = skillUseCase.computeSkillValue(
id = skill.id,
label = skill.label,
tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description ->
TooltipUio(
title = skill.label,
description = description,
)
},
value = skillUseCase.computeSkillValue(
sheet = characterSheet, sheet = characterSheet,
skill = skill, skill = skill,
diminished = instance.diminished, diminished = instance.diminished,
alterations = alterations, alterations = alterations,
), )
Node(
id = skill.id,
label = skill.label,
value = value,
used = skill.used, used = skill.used,
tooltips = skill.description?.let {
TooltipUio(
title = skill.label,
description = it,
)
},
roll = RollActionUio(
characterSheetId = alteredSheet.id,
label = skill.label,
rollAction = "1d100",
rollSuccessValue = value,
),
) )
}, },
magicsSkills = characterSheet.magicSkills.map { skill -> magicsSkills = characterSheet.magicSkills.map { skill ->
Node( val value = skillUseCase.computeSkillValue(
id = skill.id,
label = skill.label,
tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description ->
TooltipUio(
title = skill.label,
description = description,
)
},
value = skillUseCase.computeSkillValue(
sheet = characterSheet, sheet = characterSheet,
skill = skill, skill = skill,
diminished = instance.diminished, diminished = instance.diminished,
alterations = alterations, alterations = alterations,
), )
Node(
id = skill.id,
label = skill.label,
value = value,
used = skill.used, used = skill.used,
tooltips = skill.description?.let {
TooltipUio(
title = skill.label,
description = it,
)
},
roll = RollActionUio(
characterSheetId = alteredSheet.id,
label = skill.label,
rollAction = "1d100",
rollSuccessValue = value,
),
) )
}, },
actions = characterSheet.actions.mapNotNull { actions = characterSheet.actions.mapNotNull {
if (it.roll.isNotEmpty()) { if (it.roll.isEmpty()) return@mapNotNull null
CharacterSheetPageUio.Roll( CharacterSheetPageUio.Roll(
label = it.label, label = it.label,
value = it.roll, value = it.roll,
roll = RollActionUio(
characterSheetId = alteredSheet.id,
label = it.label,
rollAction = it.roll,
rollSuccessValue = null,
)
) )
} else {
null
}
} }
) )
} }

View file

@ -45,6 +45,7 @@ import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -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.CharacterSheetDeleteConfirmationDialog
import com.pixelized.desktop.lwa.ui.screen.characterSheet.detail.dialog.DiminishedStatDialog 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.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.RollPage
import com.pixelized.desktop.lwa.ui.screen.roll.RollViewModel import com.pixelized.desktop.lwa.ui.screen.roll.RollViewModel
import com.pixelized.desktop.lwa.utils.preview.ContentPreview import com.pixelized.desktop.lwa.utils.preview.ContentPreview
@ -105,6 +107,7 @@ data class CharacterSheetPageUio(
val value: String, val value: String,
val editable: Boolean, val editable: Boolean,
val tooltips: TooltipUio?, val tooltips: TooltipUio?,
val roll: RollActionUio?,
) )
@Stable @Stable
@ -112,14 +115,16 @@ data class CharacterSheetPageUio(
val id: String, val id: String,
val label: String, val label: String,
val value: Int, val value: Int,
val tooltips: TooltipUio? = null,
val used: Boolean, val used: Boolean,
val tooltips: TooltipUio? = null,
val roll: RollActionUio,
) )
@Stable @Stable
data class Roll( data class Roll(
val label: String, val label: String,
val value: String, val value: String,
val roll: RollActionUio?,
) )
} }
@ -133,6 +138,7 @@ fun CharacterSheetPage(
val window = LocalWindow.current val window = LocalWindow.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val blurController = remember { BlurContentController() } val blurController = remember { BlurContentController() }
val sheet = viewModel.sheetFlow.collectAsState()
Surface( Surface(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
@ -140,11 +146,11 @@ fun CharacterSheetPage(
BlurContent( BlurContent(
controller = blurController, controller = blurController,
content = { content = {
viewModel.sheet.value?.let { sheet -> sheet.value?.let { sheet ->
CharacterSheetPageContent( CharacterSheetPageContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
characterSheet = sheet, characterSheet = sheet,
diminishedValue = viewModel.diminishedValue, diminishedValue = viewModel.diminishedValueFlow.collectAsState(),
onDiminished = { onDiminished = {
blurController.show() blurController.show()
scope.launch { scope.launch {
@ -162,11 +168,9 @@ fun CharacterSheetPage(
viewModel.showConfirmCharacterDeletionDialog() viewModel.showConfirmCharacterDeletionDialog()
}, },
onCharacteristic = { characteristic -> onCharacteristic = { characteristic ->
if (characteristic.roll == null) return@CharacterSheetPageContent
rollViewModel.prepareRoll(characteristic.roll)
blurController.show() blurController.show()
rollViewModel.prepareRoll(
sheet = sheet,
characteristic = characteristic
)
viewModel.showRollOverlay() viewModel.showRollOverlay()
}, },
onSubCharacteristic = { onSubCharacteristic = {
@ -177,7 +181,7 @@ fun CharacterSheetPage(
}, },
onSkill = { node -> onSkill = { node ->
blurController.show() blurController.show()
rollViewModel.prepareRoll(sheet = sheet, node = node) rollViewModel.prepareRoll(node.roll)
viewModel.showRollOverlay() viewModel.showRollOverlay()
}, },
onUseSkill = viewModel::onUseSkill, onUseSkill = viewModel::onUseSkill,
@ -233,11 +237,11 @@ fun CharacterSheetPage(
DiminishedStatDialog( DiminishedStatDialog(
dialog = viewModel.diminishedDialog, dialog = viewModel.diminishedDialog,
onConfirm = { onConfirm = {
viewModel.changeDiminished( scope.launch {
dialog = it viewModel.changeDiminished(dialog = it)
)
viewModel.hideDiminishedDialog() viewModel.hideDiminishedDialog()
blurController.hide() blurController.hide()
}
}, },
onDismissRequest = { onDismissRequest = {
viewModel.hideDiminishedDialog() viewModel.hideDiminishedDialog()

View file

@ -1,10 +1,9 @@
package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail package com.pixelized.desktop.lwa.ui.screen.characterSheet.detail
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf 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.SavedStateHandle
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope 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.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.DiminishedStatDialogUio 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 com.pixelized.shared.lwa.protocol.websocket.payload.UpdateSkillUsageMessage
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.serialization.json.Json 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 private typealias CSDCDialogUio = CharacterSheetDeleteConfirmationDialogUio
@ -46,16 +50,12 @@ class CharacterSheetViewModel(
private val _diminishedDialog = mutableStateOf<DiminishedStatDialogUio?>(null) private val _diminishedDialog = mutableStateOf<DiminishedStatDialogUio?>(null)
val diminishedDialog: State<DiminishedStatDialogUio?> get() = _diminishedDialog val diminishedDialog: State<DiminishedStatDialogUio?> get() = _diminishedDialog
// TODO val diminishedValueFlow: StateFlow<Int?> = campaignRepository
// private val diminishedValueFlow = characterRepository.characterDiminishedFlow(id = argument.id) .characterInstanceFlow(id = argument.characterInstanceId)
val diminishedValue: State<Int?> .map { instance -> instance.diminished.takeIf { it > 0 } }
@Composable .stateIn(scope = viewModelScope, SharingStarted.Lazily, null)
// get() = diminishedValueFlow.collectAsState { it ->
// it.takeIf { it > 0 }
// }
get() = remember { mutableStateOf(null) }
private val sheetFlow = combine( val sheetFlow = combine(
characterRepository.characterDetailFlow(characterId = argument.characterInstanceId.characterSheetId), characterRepository.characterDetailFlow(characterId = argument.characterInstanceId.characterSheetId),
campaignRepository.campaignFlow, campaignRepository.campaignFlow,
alteration.alterationsFlow(characterId = argument.characterInstanceId), alteration.alterationsFlow(characterId = argument.characterInstanceId),
@ -72,9 +72,6 @@ class CharacterSheetViewModel(
started = SharingStarted.Eagerly, started = SharingStarted.Eagerly,
initialValue = null, initialValue = null,
) )
val sheet: State<CharacterSheetPageUio?>
@Composable
get() = sheetFlow.collectAsState()
suspend fun deleteCharacter(id: String) { suspend fun deleteCharacter(id: String) {
characterRepository.deleteCharacter(characterId = id) characterRepository.deleteCharacter(characterId = id)
@ -93,15 +90,14 @@ class CharacterSheetViewModel(
} }
fun showConfirmCharacterDeletionDialog() { fun showConfirmCharacterDeletionDialog() {
characterRepository.characterPreview( val preview = characterRepository.characterPreview(
characterId = argument.characterInstanceId.characterSheetId characterId = argument.characterInstanceId.characterSheetId
)?.let { preview -> ) ?: return
_displayDeleteConfirmationDialog.value = CharacterSheetDeleteConfirmationDialogUio( _displayDeleteConfirmationDialog.value = CharacterSheetDeleteConfirmationDialogUio(
id = preview.id, id = preview.id,
name = preview.name, name = preview.name,
) )
} }
}
fun hideConfirmCharacterDeletionDialog() { fun hideConfirmCharacterDeletionDialog() {
_displayDeleteConfirmationDialog.value = null _displayDeleteConfirmationDialog.value = null
@ -115,32 +111,43 @@ class CharacterSheetViewModel(
_displayRollOverlay.value = false _displayRollOverlay.value = false
} }
suspend fun showDiminishedDialog() { fun showDiminishedDialog() {
// val diminished = characterRepository.characterDiminishedFlow(id = argument.id).value val diminished = campaignRepository
// val textFieldValue = .characterInstance(characterInstanceId = argument.characterInstanceId)
// mutableStateOf(TextFieldValue("$diminished", selection = TextRange(index = 0))) .diminished
// _diminishedDialog.value = DiminishedStatDialogUio(
// id = argument.id, val textFieldValue = mutableStateOf(
// label = getString(resource = Res.string.character_sheet__diminished__label), TextFieldValue(
// value = { textFieldValue.value }, text = "$diminished",
// onValueChange = { value -> selection = TextRange(index = 0),
// textFieldValue.value = when (value.text.toIntOrNull()?.takeIf { it >= 0 }) { )
// null -> TextFieldValue("0", selection = TextRange(index = 0)) )
// else -> value
// } _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() { fun hideDiminishedDialog() {
_diminishedDialog.value = null _diminishedDialog.value = null
} }
fun changeDiminished(dialog: DiminishedStatDialogUio) { suspend fun changeDiminished(dialog: DiminishedStatDialogUio) {
// val value = dialog.value().text.toIntOrNull() ?: 0 val diminished = dialog.value().text.toIntOrNull() ?: 0
// characterRepository.setDiminishedForCharacter( network.share(
// id = dialog.id, payload = CampaignMessage.UpdateDiminished(
// diminished = value, characterSheetId = dialog.characterInstanceId.characterSheetId,
// ) instanceId = dialog.characterInstanceId.instanceId,
diminished = diminished,
)
)
} }
} }

View file

@ -22,6 +22,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.DEX, id = CharacteristicId.DEX,
@ -29,6 +30,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.CON, id = CharacteristicId.CON,
@ -36,6 +38,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.HEI, id = CharacteristicId.HEI,
@ -43,6 +46,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.INT, id = CharacteristicId.INT,
@ -50,6 +54,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.POW, id = CharacteristicId.POW,
@ -57,6 +62,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.CHA, id = CharacteristicId.CHA,
@ -64,6 +70,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
), ),
subCharacteristics = listOf( subCharacteristics = listOf(
@ -73,6 +80,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "10", value = "10",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.HP, id = CharacteristicId.HP,
@ -80,6 +88,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "20/20", value = "20/20",
tooltips = null, tooltips = null,
editable = true, editable = true,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.PP, id = CharacteristicId.PP,
@ -87,6 +96,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "15/15", value = "15/15",
tooltips = null, tooltips = null,
editable = true, editable = true,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.DMG, id = CharacteristicId.DMG,
@ -94,6 +104,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "1d4", value = "1d4",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.ARMOR, id = CharacteristicId.ARMOR,
@ -101,6 +112,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "0", value = "0",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.LB, id = CharacteristicId.LB,
@ -108,6 +120,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "0", value = "0",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
Characteristic( Characteristic(
id = CharacteristicId.GHP, id = CharacteristicId.GHP,
@ -115,6 +128,7 @@ fun rememberCharacterSheetPreview(): CharacterSheetPageUio {
value = "5", value = "5",
tooltips = null, tooltips = null,
editable = false, editable = false,
roll = null,
), ),
), ),
commonSkills = emptyList(), commonSkills = emptyList(),

View file

@ -1,5 +1,6 @@
package com.pixelized.desktop.lwa.ui.screen.main package com.pixelized.desktop.lwa.ui.screen.main
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column 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.navigateToCharacterSheet
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.navigation.window.destination.navigateToRollHistory 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 com.pixelized.shared.lwa.model.campaign.Campaign
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import lwacharactersheet.composeapp.generated.resources.Res 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.character_sheet_edit__create__title
import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp import lwacharactersheet.composeapp.generated.resources.ic_d20_24dp
import lwacharactersheet.composeapp.generated.resources.ic_file_24dp import lwacharactersheet.composeapp.generated.resources.ic_file_24dp
@ -63,21 +66,15 @@ fun OldMainPage(
val screen = LocalScreenController.current val screen = LocalScreenController.current
val characters = viewModel.characters.collectAsState() val characters = viewModel.characters.collectAsState()
val npcs = viewModel.npcs.collectAsState() val npcs = viewModel.npcs.collectAsState()
val enableRollHistory = viewModel.enableRollHistoryFlow.collectAsState()
Surface( Surface(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) {
Box(
modifier = Modifier
.verticalScroll(state = rememberScrollState())
.fillMaxSize()
.padding(horizontal = 16.dp),
contentAlignment = Alignment.Center,
) { ) {
MainPageContent( MainPageContent(
characters = characters, characters = characters,
npcs = npcs, npcs = npcs,
enableRollHistory = viewModel.enableRollHistory, enableRollHistory = enableRollHistory,
onCharacter = { onCharacter = {
window.navigateToCharacterSheet( window.navigateToCharacterSheet(
characterId = it.id, characterId = it.id,
@ -104,12 +101,12 @@ fun OldMainPage(
} }
) )
} }
}
} }
@Composable @Composable
fun MainPageContent( fun MainPageContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
scrollState: ScrollState = rememberScrollState(),
characters: State<List<CharacterUio>>, characters: State<List<CharacterUio>>,
npcs: State<List<CharacterUio>>, npcs: State<List<CharacterUio>>,
enableRollHistory: State<Boolean>, enableRollHistory: State<Boolean>,
@ -123,6 +120,38 @@ fun MainPageContent(
Column( Column(
modifier = modifier, modifier = modifier,
) { ) {
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(
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Start,
maxLines = 1,
text = "Nouvelle interface utilisateur",
)
}
}
}
)
Box(
modifier = Modifier
.verticalScroll(state = scrollState)
.fillMaxSize()
.padding(horizontal = 16.dp),
contentAlignment = Alignment.Center,
) {
Column {
if (characters.value.isNotEmpty()) { if (characters.value.isNotEmpty()) {
Column { Column {
characters.value.forEach { sheet -> characters.value.forEach { sheet ->
@ -249,24 +278,6 @@ fun MainPageContent(
) )
} }
} }
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",
)
} }
} }
} }

View file

@ -1,14 +1,11 @@
package com.pixelized.desktop.lwa.ui.screen.main 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.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.lordcodes.turtle.shellRun import com.lordcodes.turtle.shellRun
import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository 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.utils.extention.collectAsState
import com.pixelized.shared.lwa.OperatingSystem import com.pixelized.shared.lwa.OperatingSystem
import com.pixelized.shared.lwa.storePath import com.pixelized.shared.lwa.storePath
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@ -78,10 +75,13 @@ class MainPageViewModel(
initialValue = emptyList(), initialValue = emptyList(),
) )
private val networkStatus = networkRepository.status val enableRollHistoryFlow = networkRepository.status
val enableRollHistory: State<Boolean> .map { it == NetworkRepository.Status.CONNECTED }
@Composable .stateIn(
get() = networkStatus.collectAsState { it == NetworkRepository.Status.CONNECTED } scope = viewModelScope,
started = SharingStarted.Lazily,
initialValue = false,
)
fun openSaveDirectory( fun openSaveDirectory(
os: OperatingSystem = OperatingSystem.current, os: OperatingSystem = OperatingSystem.current,

View file

@ -34,6 +34,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
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.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@ -60,7 +61,25 @@ data class NetworkPageUio(
val enableFields: Boolean, val enableFields: Boolean,
val enableActions: Boolean, val enableActions: Boolean,
val enableCancel: 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 @Composable
fun NetworkPage( fun NetworkPage(
@ -82,7 +101,7 @@ fun NetworkPage(
) { ) {
NetworkContent( NetworkContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
player = viewModel.network, player = viewModel.network.collectAsState(),
onBack = { screen.popBackStack() }, onBack = { screen.popBackStack() },
onPlayerChange = viewModel::onPlayerNameChange, onPlayerChange = viewModel::onPlayerNameChange,
onHostChange = viewModel::onHostChange, onHostChange = viewModel::onHostChange,

View file

@ -1,21 +1,19 @@
package com.pixelized.desktop.lwa.ui.screen.network 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.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
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.desktop.lwa.repository.settings.SettingsRepository
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.error.ErrorSnackUio 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.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow 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 import kotlinx.coroutines.launch
class NetworkViewModel( class NetworkViewModel(
@ -38,23 +36,21 @@ class NetworkViewModel(
val controller: BlurContentController = BlurContentController() val controller: BlurContentController = BlurContentController()
val network: State<NetworkPageUio> val network: StateFlow<NetworkPageUio> = combine(
@Composable settingsRepository.settingsFlow(),
@Stable networkRepository.status,
get() { ) { settings, status ->
val player = settingsRepository.settingsFlow().collectAsState { it.playerName }
val status = networkRepository.status.collectAsState()
return remember {
derivedStateOf {
factory.convertToUio( factory.convertToUio(
player = player.value, player = settings.playerName,
status = status.value, status = status,
host = host.value, host = host.value,
port = port.value, port = port.value,
) )
} }.stateIn(
} scope = viewModelScope,
} started = SharingStarted.Eagerly,
initialValue = NetworkPageUio.empty()
)
fun onPlayerNameChange(player: String) { fun onPlayerNameChange(player: String) {
settingsRepository.update( settingsRepository.update(

View file

@ -59,35 +59,6 @@ class RollViewModel(
private val _displayOverlay = mutableStateOf(false) private val _displayOverlay = mutableStateOf(false)
val displayOverlay: State<Boolean> get() = _displayOverlay val displayOverlay: State<Boolean> 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)") @Deprecated(message = "@See prepareRoll(RollActionUio)")
fun prepareRoll( fun prepareRoll(
sheet: CharacterSheetPageUio, sheet: CharacterSheetPageUio,

View file

@ -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 <T, R> StateFlow<T>.collectAsState(
context: CoroutineContext = EmptyCoroutineContext,
convert: (T) -> R,
): State<R> = collectAsState(
initial = value,
context = context,
convert = convert,
)
@Composable
fun <T, R> Flow<T>.collectAsState(
initial: T,
context: CoroutineContext = EmptyCoroutineContext,
convert: (T) -> R,
): State<R> = produceState(convert(initial), this, context) {
if (context == EmptyCoroutineContext) {
collect { value = convert(it) }
} else withContext(context) {
collect { value = convert(it) }
}
}

View file

@ -20,21 +20,24 @@ kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref =
ktor = { id = "io.ktor.plugin", version.ref = "ktor" } ktor = { id = "io.ktor.plugin", version.ref = "ktor" }
[libraries] [libraries]
# Test & preview
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } 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-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-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-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" } 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-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" } 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-core = { module = "io.insert-koin:koin-core", version.ref = "koin" }
koin-ktor = { module = "io.insert-koin:koin-ktor", 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 = { module = "io.insert-koin:koin-compose", version.ref = "koin" }
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", 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-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-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" } ktor-client-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" }
@ -47,6 +50,3 @@ ktor-server-negotiation = { group = 'io.ktor', name = 'ktor-server-content-negot
turtle = { group = "com.lordcodes.turtle", name = "turtle", version.ref = "turtle" } turtle = { group = "com.lordcodes.turtle", name = "turtle", version.ref = "turtle" }
logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } 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" }