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 ->
|
||||||
|
val value = skillUseCase.computeSkillValue(
|
||||||
|
sheet = characterSheet,
|
||||||
|
skill = skill,
|
||||||
|
diminished = instance.diminished,
|
||||||
|
alterations = alterations,
|
||||||
|
)
|
||||||
Node(
|
Node(
|
||||||
id = skill.id,
|
id = skill.id,
|
||||||
label = skill.label,
|
label = skill.label,
|
||||||
value = skillUseCase.computeSkillValue(
|
value = value,
|
||||||
sheet = characterSheet,
|
used = skill.used,
|
||||||
skill = skill,
|
|
||||||
diminished = instance.diminished,
|
|
||||||
alterations = alterations,
|
|
||||||
),
|
|
||||||
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 ->
|
||||||
|
val value = skillUseCase.computeSkillValue(
|
||||||
|
sheet = characterSheet,
|
||||||
|
skill = skill,
|
||||||
|
diminished = instance.diminished,
|
||||||
|
alterations = alterations,
|
||||||
|
)
|
||||||
Node(
|
Node(
|
||||||
id = skill.id,
|
id = skill.id,
|
||||||
label = skill.label,
|
label = skill.label,
|
||||||
tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description ->
|
value = value,
|
||||||
|
used = skill.used,
|
||||||
|
tooltips = skill.description?.let {
|
||||||
TooltipUio(
|
TooltipUio(
|
||||||
title = skill.label,
|
title = skill.label,
|
||||||
description = description,
|
description = it,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
value = skillUseCase.computeSkillValue(
|
roll = RollActionUio(
|
||||||
sheet = characterSheet,
|
characterSheetId = alteredSheet.id,
|
||||||
skill = skill,
|
label = skill.label,
|
||||||
diminished = instance.diminished,
|
rollAction = "1d100",
|
||||||
alterations = alterations,
|
rollSuccessValue = value,
|
||||||
),
|
),
|
||||||
used = skill.used,
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
magicsSkills = characterSheet.magicSkills.map { skill ->
|
magicsSkills = characterSheet.magicSkills.map { skill ->
|
||||||
|
val value = skillUseCase.computeSkillValue(
|
||||||
|
sheet = characterSheet,
|
||||||
|
skill = skill,
|
||||||
|
diminished = instance.diminished,
|
||||||
|
alterations = alterations,
|
||||||
|
)
|
||||||
Node(
|
Node(
|
||||||
id = skill.id,
|
id = skill.id,
|
||||||
label = skill.label,
|
label = skill.label,
|
||||||
tooltips = skill.description?.takeIf { it.isNotBlank() }?.let { description ->
|
value = value,
|
||||||
|
used = skill.used,
|
||||||
|
tooltips = skill.description?.let {
|
||||||
TooltipUio(
|
TooltipUio(
|
||||||
title = skill.label,
|
title = skill.label,
|
||||||
description = description,
|
description = it,
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
value = skillUseCase.computeSkillValue(
|
roll = RollActionUio(
|
||||||
sheet = characterSheet,
|
characterSheetId = alteredSheet.id,
|
||||||
skill = skill,
|
label = skill.label,
|
||||||
diminished = instance.diminished,
|
rollAction = "1d100",
|
||||||
alterations = alterations,
|
rollSuccessValue = value,
|
||||||
),
|
),
|
||||||
used = skill.used,
|
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
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,
|
||||||
|
value = it.roll,
|
||||||
|
roll = RollActionUio(
|
||||||
|
characterSheetId = alteredSheet.id,
|
||||||
label = it.label,
|
label = it.label,
|
||||||
value = it.roll,
|
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,14 +90,13 @@ 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() {
|
||||||
|
|
@ -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,53 +66,47 @@ 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(
|
MainPageContent(
|
||||||
modifier = Modifier
|
characters = characters,
|
||||||
.verticalScroll(state = rememberScrollState())
|
npcs = npcs,
|
||||||
.fillMaxSize()
|
enableRollHistory = enableRollHistory,
|
||||||
.padding(horizontal = 16.dp),
|
onCharacter = {
|
||||||
contentAlignment = Alignment.Center,
|
window.navigateToCharacterSheet(
|
||||||
) {
|
characterId = it.id,
|
||||||
MainPageContent(
|
title = it.name,
|
||||||
characters = characters,
|
)
|
||||||
npcs = npcs,
|
},
|
||||||
enableRollHistory = viewModel.enableRollHistory,
|
onCreateCharacter = {
|
||||||
onCharacter = {
|
window.navigateToCharacterSheetEdit(
|
||||||
window.navigateToCharacterSheet(
|
characterId = null,
|
||||||
characterId = it.id,
|
title = runBlocking { getString(Res.string.character_sheet_edit__create__title) },
|
||||||
title = it.name,
|
)
|
||||||
)
|
},
|
||||||
},
|
onRollHistory = {
|
||||||
onCreateCharacter = {
|
window.navigateToRollHistory()
|
||||||
window.navigateToCharacterSheetEdit(
|
},
|
||||||
characterId = null,
|
onOpenSaveDirectory = {
|
||||||
title = runBlocking { getString(Res.string.character_sheet_edit__create__title) },
|
viewModel.openSaveDirectory()
|
||||||
)
|
},
|
||||||
},
|
onNetwork = {
|
||||||
onRollHistory = {
|
screen.navigateToNetwork()
|
||||||
window.navigateToRollHistory()
|
},
|
||||||
},
|
onMainPage = {
|
||||||
onOpenSaveDirectory = {
|
screen.navigateToMainPage()
|
||||||
viewModel.openSaveDirectory()
|
}
|
||||||
},
|
)
|
||||||
onNetwork = {
|
|
||||||
screen.navigateToNetwork()
|
|
||||||
},
|
|
||||||
onMainPage = {
|
|
||||||
screen.navigateToMainPage()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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,150 +120,164 @@ fun MainPageContent(
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
) {
|
) {
|
||||||
if (characters.value.isNotEmpty()) {
|
Toolbar(
|
||||||
Column {
|
title = runBlocking { getString(Res.string.app_name) },
|
||||||
characters.value.forEach { sheet ->
|
actions = {
|
||||||
TextButton(
|
TextButton(
|
||||||
onClick = { onCharacter(sheet) },
|
onClick = onMainPage,
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(Res.drawable.ic_swords_24dp),
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
Text(
|
Text(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
textAlign = TextAlign.Start,
|
textAlign = TextAlign.Start,
|
||||||
maxLines = 1,
|
maxLines = 1,
|
||||||
text = sheet.name,
|
text = "Nouvelle interface utilisateur",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
)
|
||||||
|
Box(
|
||||||
if (characters.value.isNotEmpty() && npcs.value.isNotEmpty()) {
|
modifier = Modifier
|
||||||
Spacer(modifier = Modifier.height(height = 24.dp))
|
.verticalScroll(state = scrollState)
|
||||||
}
|
.fillMaxSize()
|
||||||
|
.padding(horizontal = 16.dp),
|
||||||
if (npcs.value.isNotEmpty()) {
|
contentAlignment = Alignment.Center,
|
||||||
|
) {
|
||||||
Column {
|
Column {
|
||||||
npcs.value.forEach { sheet ->
|
if (characters.value.isNotEmpty()) {
|
||||||
TextButton(
|
Column {
|
||||||
onClick = { onCharacter(sheet) },
|
characters.value.forEach { sheet ->
|
||||||
|
TextButton(
|
||||||
|
onClick = { onCharacter(sheet) },
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
textAlign = TextAlign.Start,
|
||||||
|
maxLines = 1,
|
||||||
|
text = sheet.name,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (characters.value.isNotEmpty() && npcs.value.isNotEmpty()) {
|
||||||
|
Spacer(modifier = Modifier.height(height = 24.dp))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (npcs.value.isNotEmpty()) {
|
||||||
|
Column {
|
||||||
|
npcs.value.forEach { sheet ->
|
||||||
|
TextButton(
|
||||||
|
onClick = { onCharacter(sheet) },
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
textAlign = TextAlign.Start,
|
||||||
|
maxLines = 1,
|
||||||
|
text = sheet.name,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(modifier = Modifier.height(height = 24.dp))
|
||||||
|
|
||||||
|
TextButton(
|
||||||
|
onClick = onCreateCharacter,
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(Res.drawable.ic_file_24dp),
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
Text(
|
Text(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
maxLines = 1,
|
||||||
overflow = TextOverflow.Ellipsis,
|
overflow = TextOverflow.Ellipsis,
|
||||||
textAlign = TextAlign.Start,
|
textAlign = TextAlign.Start,
|
||||||
maxLines = 1,
|
text = stringResource(Res.string.main_page__create_action),
|
||||||
text = sheet.name,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(height = 24.dp))
|
TextButton(
|
||||||
|
onClick = onOpenSaveDirectory,
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
painter = painterResource(Res.drawable.ic_folder_24dp),
|
||||||
|
contentDescription = null,
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
maxLines = 1,
|
||||||
|
overflow = TextOverflow.Ellipsis,
|
||||||
|
textAlign = TextAlign.Start,
|
||||||
|
text = stringResource(Res.string.main_page__open_save_directory),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TextButton(
|
TextButton(
|
||||||
onClick = onCreateCharacter,
|
enabled = enableRollHistory.value,
|
||||||
) {
|
onClick = onRollHistory,
|
||||||
Row(
|
) {
|
||||||
modifier = Modifier.fillMaxWidth(),
|
Row(
|
||||||
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
) {
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
Icon(
|
) {
|
||||||
painter = painterResource(Res.drawable.ic_file_24dp),
|
Icon(
|
||||||
contentDescription = null,
|
painter = painterResource(Res.drawable.ic_d20_24dp),
|
||||||
)
|
contentDescription = null,
|
||||||
Text(
|
)
|
||||||
maxLines = 1,
|
Text(
|
||||||
overflow = TextOverflow.Ellipsis,
|
maxLines = 1,
|
||||||
textAlign = TextAlign.Start,
|
overflow = TextOverflow.Ellipsis,
|
||||||
text = stringResource(Res.string.main_page__create_action),
|
textAlign = TextAlign.Start,
|
||||||
)
|
text = stringResource(Res.string.main_page__roll_history_action),
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TextButton(
|
TextButton(
|
||||||
onClick = onOpenSaveDirectory,
|
onClick = onNetwork,
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier.fillMaxWidth(),
|
modifier = Modifier.fillMaxWidth(),
|
||||||
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
painter = painterResource(Res.drawable.ic_folder_24dp),
|
painter = painterResource(Res.drawable.ic_table_24dp),
|
||||||
contentDescription = null,
|
contentDescription = null,
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
maxLines = 1,
|
overflow = TextOverflow.Ellipsis,
|
||||||
overflow = TextOverflow.Ellipsis,
|
textAlign = TextAlign.Start,
|
||||||
textAlign = TextAlign.Start,
|
maxLines = 1,
|
||||||
text = stringResource(Res.string.main_page__open_save_directory),
|
text = stringResource(Res.string.main_page__network_action),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TextButton(
|
|
||||||
enabled = enableRollHistory.value,
|
|
||||||
onClick = onRollHistory,
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
painter = painterResource(Res.drawable.ic_d20_24dp),
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
maxLines = 1,
|
|
||||||
overflow = TextOverflow.Ellipsis,
|
|
||||||
textAlign = TextAlign.Start,
|
|
||||||
text = stringResource(Res.string.main_page__roll_history_action),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextButton(
|
|
||||||
onClick = onNetwork,
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
painter = painterResource(Res.drawable.ic_table_24dp),
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
overflow = TextOverflow.Ellipsis,
|
|
||||||
textAlign = TextAlign.Start,
|
|
||||||
maxLines = 1,
|
|
||||||
text = stringResource(Res.string.main_page__network_action),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
TextButton(
|
|
||||||
onClick = onMainPage,
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
|
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
painter = painterResource(Res.drawable.ic_swords_24dp),
|
|
||||||
contentDescription = null,
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
overflow = TextOverflow.Ellipsis,
|
|
||||||
textAlign = TextAlign.Start,
|
|
||||||
maxLines = 1,
|
|
||||||
text = "Nouvelle interface utilisateur",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
factory.convertToUio(
|
||||||
val status = networkRepository.status.collectAsState()
|
player = settings.playerName,
|
||||||
return remember {
|
status = status,
|
||||||
derivedStateOf {
|
host = host.value,
|
||||||
factory.convertToUio(
|
port = port.value,
|
||||||
player = player.value,
|
)
|
||||||
status = status.value,
|
}.stateIn(
|
||||||
host = host.value,
|
scope = viewModelScope,
|
||||||
port = port.value,
|
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" }
|
||||||
|
|
@ -46,7 +49,4 @@ ktor-server-websockets = { group = 'io.ktor', name = "ktor-server-websockets", v
|
||||||
ktor-server-negotiation = { group = 'io.ktor', name = 'ktor-server-content-negotiation', version.ref = "ktor" }
|
ktor-server-negotiation = { group = 'io.ktor', name = 'ktor-server-content-negotiation', version.ref = "ktor" }
|
||||||
|
|
||||||
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