Fix some stuff on the old UI (diminished & edit?)
This commit is contained in:
		
							parent
							
								
									f51a83cf6e
								
							
						
					
					
						commit
						1bf0cb7c0a
					
				
					 15 changed files with 448 additions and 366 deletions
				
			
		| 
						 | 
					@ -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"))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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.** { *; }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -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(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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",
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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) }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -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" }
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue