diff --git a/composeApp/src/commonMain/composeResources/drawable/ic_more_down_24dp.svg b/composeApp/src/commonMain/composeResources/drawable/ic_more_down_24dp.svg
new file mode 100644
index 0000000..febe0eb
--- /dev/null
+++ b/composeApp/src/commonMain/composeResources/drawable/ic_more_down_24dp.svg
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml
index e9363d3..dcb2884 100644
--- a/composeApp/src/commonMain/composeResources/values/strings.xml
+++ b/composeApp/src/commonMain/composeResources/values/strings.xml
@@ -269,12 +269,6 @@
Délai pour les Dés dynamiques
Délai après lequel les dés dynamiques disparaissent.
Chatlog options
- Afficher automatiquement le chat
- Affiche automatiquement le chat lors de la réception d'un message
- Cacher automatiquement le chat
- Cache automatiquement le chat au bout d'un certain temps
- Délai pour cacher le chat
- Délai après lequel le chat disparaît
Défilement automatique
Défilement automatique du chat vers le dernier message reçu lors de la réception de ce dernier.
Nombre de lignes de textes visibles
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/SettingsFactory.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/SettingsFactory.kt
index 8924ff2..f9b4f03 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/SettingsFactory.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/SettingsFactory.kt
@@ -3,6 +3,7 @@ package com.pixelized.desktop.lwa.repository.settings
import com.pixelized.desktop.lwa.repository.settings.model.Settings
import com.pixelized.desktop.lwa.repository.settings.model.SettingsJson
import com.pixelized.desktop.lwa.repository.settings.model.SettingsJsonV1
+import com.pixelized.desktop.lwa.repository.settings.model.SettingsJsonV2
import com.pixelized.desktop.lwa.usecase.SettingsUseCase
@@ -12,15 +13,13 @@ class SettingsFactory(
fun convertToJson(
settings: Settings,
): SettingsJson {
- return SettingsJsonV1(
+ return SettingsJsonV2(
host = settings.network.host,
port = settings.network.port,
playerName = settings.playerName,
dynamicDice = settings.portrait.dynamicDice,
dynamicDiceDelay = settings.portrait.dynamicDiceDelay,
- autoHideChat = settings.chat.autoHideChat,
- autoHideDelay = settings.chat.autoHideDelay,
- autoShowChat = settings.chat.autoShowChat,
+ showChat = settings.chat.showChat,
autoScrollChat = settings.chat.autoScrollChat,
maxLineCount = settings.chat.maxLineCount,
isAdmin = settings.isAdmin,
@@ -33,6 +32,7 @@ class SettingsFactory(
): Settings {
return when (json) {
is SettingsJsonV1 -> convertFromJsonV1(json)
+ is SettingsJsonV2 -> convertFromJsonV2(json)
}
}
@@ -51,9 +51,31 @@ class SettingsFactory(
dynamicDiceDelay = json.dynamicDiceDelay ?: default.portrait.dynamicDiceDelay,
),
chat = Settings.Chat(
- autoHideChat = json.autoHideChat ?: default.chat.autoHideChat,
- autoHideDelay = json.autoHideDelay ?: default.chat.autoHideDelay,
- autoShowChat = json.autoShowChat ?: default.chat.autoShowChat,
+ showChat = default.chat.showChat,
+ autoScrollChat = json.autoScrollChat ?: default.chat.autoScrollChat,
+ maxLineCount = json.maxLineCount ?: default.chat.maxLineCount,
+ ),
+ isAdmin = json.isAdmin ?: default.isAdmin,
+ isGameMaster = json.isGameMaster ?: default.isGameMaster,
+ )
+ }
+
+ private fun convertFromJsonV2(
+ json: SettingsJsonV2,
+ ): Settings {
+ val default = useCase.defaultSettings()
+ return Settings(
+ playerName = json.playerName ?: default.playerName,
+ network = Settings.Network(
+ host = json.host ?: default.network.host,
+ port = json.port ?: default.network.port,
+ ),
+ portrait = Settings.Portrait(
+ dynamicDice = json.dynamicDice ?: default.portrait.dynamicDice,
+ dynamicDiceDelay = json.dynamicDiceDelay ?: default.portrait.dynamicDiceDelay,
+ ),
+ chat = Settings.Chat(
+ showChat = json.showChat ?: default.chat.showChat,
autoScrollChat = json.autoScrollChat ?: default.chat.autoScrollChat,
maxLineCount = json.maxLineCount ?: default.chat.maxLineCount,
),
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/Settings.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/Settings.kt
index 80fc9ee..2ef636a 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/Settings.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/Settings.kt
@@ -14,9 +14,7 @@ data class Settings(
)
data class Chat(
- val autoHideChat: Boolean,
- val autoHideDelay: Int,
- val autoShowChat: Boolean,
+ val showChat: Boolean,
val autoScrollChat: Boolean,
val maxLineCount: Int,
)
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/SettingsJsonV2.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/SettingsJsonV2.kt
new file mode 100644
index 0000000..7e54773
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/SettingsJsonV2.kt
@@ -0,0 +1,17 @@
+package com.pixelized.desktop.lwa.repository.settings.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class SettingsJsonV2(
+ val host: String?,
+ val port: Int?,
+ val playerName: String?,
+ val dynamicDice: Boolean?,
+ val dynamicDiceDelay: Int?,
+ val showChat: Boolean?,
+ val autoScrollChat: Boolean?,
+ val maxLineCount: Int?,
+ val isGameMaster: Boolean?,
+ val isAdmin: Boolean?,
+) : SettingsJson
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt
index 06fe469..de9e574 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/CampaignScreen.kt
@@ -2,6 +2,7 @@ package com.pixelized.desktop.lwa.ui.screen.campaign
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
@@ -338,26 +339,25 @@ private fun CampaignLayout(
) {
main()
}
- Box(
- modifier = Modifier
- .align(alignment = Alignment.BottomEnd)
- .onSizeChanged { chatOverlayState.value = it.toDp(density) },
- ) {
- chat()
- }
- Box(
- modifier = Modifier
- .align(alignment = Alignment.CenterStart)
- .onSizeChanged { leftPanelState.value = it.toDp(density) },
- ) {
- leftPanel()
- }
- Box(
- modifier = Modifier
- .align(alignment = Alignment.CenterEnd)
- .onSizeChanged { rightPanelState.value = it.toDp(density) },
- ) {
- rightPanel()
+ Row {
+ Box(
+ modifier = Modifier.onSizeChanged { leftPanelState.value = it.toDp(density) },
+ ) {
+ leftPanel()
+ }
+ Box(
+ modifier = Modifier
+ .align(alignment = Alignment.Bottom)
+ .weight(weight = 1f)
+ .onSizeChanged { chatOverlayState.value = it.toDp(density) },
+ ) {
+ chat()
+ }
+ Box(
+ modifier = Modifier.onSizeChanged { rightPanelState.value = it.toDp(density) },
+ ) {
+ rightPanel()
+ }
}
Box(
modifier = Modifier
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbon.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbon.kt
new file mode 100644
index 0000000..3e0b752
--- /dev/null
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbon.kt
@@ -0,0 +1,72 @@
+package com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.collectAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.common.CharacterRibbonPortrait
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.common.CharacterRibbonRoll
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.common.CharacterRibbonAlteration
+import com.pixelized.desktop.lwa.ui.screen.campaign.player.ribbon.player.PlayerRibbonViewModel
+import org.koin.compose.viewmodel.koinViewModel
+
+@Composable
+fun CharacterRibbon(
+ modifier: Modifier = Modifier,
+ layoutDirection: LayoutDirection,
+ viewModel: PlayerRibbonViewModel = koinViewModel(),
+ padding: PaddingValues = PaddingValues(all = 8.dp),
+ onCharacterLeftClick: (characterSheetId: String) -> Unit,
+ onCharacterRightClick: (characterSheetId: String) -> Unit,
+ onLevelUp: (characterSheetId: String) -> Unit,
+) {
+ val characters = viewModel.characters.collectAsState()
+
+ CompositionLocalProvider(
+ LocalLayoutDirection provides layoutDirection
+ ) {
+ LazyColumn(
+ modifier = modifier,
+ contentPadding = padding,
+ verticalArrangement = Arrangement.spacedBy(space = 8.dp)
+ ) {
+ items(
+ items = characters.value,
+ key = { it.characterSheetId },
+ ) {
+ Row(
+ modifier = Modifier
+ .animateItem()
+ .graphicsLayer { if (it.hideOverruled) this.alpha = 0.3f },
+ horizontalArrangement = Arrangement.spacedBy(space = 4.dp),
+ ) {
+ Box {
+ CharacterRibbonPortrait(
+ character = it.portrait,
+ onCharacterLeftClick = { onCharacterLeftClick(it.characterSheetId) },
+ onCharacterRightClick = { onCharacterRightClick(it.characterSheetId) },
+ onLevelUp = { onLevelUp(it.characterSheetId) },
+ )
+ CharacterRibbonRoll(
+ value = viewModel.roll(characterSheetId = it.characterSheetId).value,
+ )
+ }
+ CharacterRibbonAlteration(
+ status = it.status,
+ direction = LayoutDirection.Ltr,
+ )
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt
index c3a1453..9af413a 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChat.kt
@@ -1,18 +1,28 @@
package com.pixelized.desktop.lwa.ui.screen.campaign.text
+import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateDpAsState
+import androidx.compose.animation.core.animateFloatAsState
+import androidx.compose.animation.expandIn
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.shrinkOut
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -21,13 +31,10 @@ import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
-import androidx.compose.ui.input.pointer.PointerEventType
-import androidx.compose.ui.input.pointer.onPointerEvent
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.max
@@ -47,21 +54,21 @@ import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.RollTextMessag
import com.pixelized.desktop.lwa.ui.screen.campaign.text.messages.TextMessage
import com.pixelized.desktop.lwa.ui.theme.lwa
import com.pixelized.desktop.lwa.usecase.SettingsUseCase
-import kotlinx.coroutines.launch
+import lwacharactersheet.composeapp.generated.resources.Res
+import lwacharactersheet.composeapp.generated.resources.ic_more_down_24dp
+import org.jetbrains.compose.resources.painterResource
import org.koin.compose.viewmodel.koinViewModel
@Stable
data class ChatSettingsUio(
- val autoShowChat: Boolean,
- val autoScrollChat: Boolean,
- val autoHideChat: Boolean,
+ val show: Boolean,
+ val autoScroll: Boolean,
) {
companion object {
fun default() = with(SettingsUseCase().defaultSettings()) {
ChatSettingsUio(
- autoShowChat = chat.autoShowChat,
- autoScrollChat = chat.autoScrollChat,
- autoHideChat = chat.autoHideChat,
+ show = chat.showChat,
+ autoScroll = chat.autoScrollChat,
)
}
}
@@ -73,9 +80,9 @@ fun CampaignChat(
modifier: Modifier = Modifier,
chatViewModel: CampaignChatViewModel = koinViewModel(),
) {
- val scope = rememberCoroutineScope()
+
val lazyState = rememberLazyListState()
- val animatedChatWidth = rememberAnimatedChatWidth()
+ val campaignLayoutScope = LocalCampaignLayoutScope.current
val colorScheme = MaterialTheme.lwa.colorScheme
val messages = chatViewModel.messages.collectAsState()
val settings = chatViewModel.settings.collectAsState()
@@ -84,54 +91,63 @@ fun CampaignChat(
lazyState = lazyState,
messages = messages,
settings = settings,
- displayChat = chatViewModel::displayChat,
- hideChat = chatViewModel::hideChat,
)
- Box(
- modifier = modifier
- .size(
- width = animatedChatWidth.value,
- height = MaterialTheme.lwa.size.portrait.minimized.height * 2 + 8.dp,
- )
- .graphicsLayer {
- alpha = chatViewModel.chatAnimatedVisibility.value
- }
- .background(
- shape = remember { RoundedCornerShape(8.dp) },
- color = remember { colorScheme.elevated.base1dp.copy(alpha = 0.5f) },
- )
- .onPointerEvent(eventType = PointerEventType.Enter) {
- scope.launch { chatViewModel.displayChat() }
- }
- .onPointerEvent(eventType = PointerEventType.Exit) {
- if (settings.value.autoHideChat) {
- scope.launch { chatViewModel.hideChat() }
- }
- },
+ Row(
+ modifier = modifier.background(
+ shape = remember { RoundedCornerShape(8.dp) },
+ color = remember { colorScheme.elevated.base1dp.copy(alpha = 0.5f) },
+ ),
) {
- LazyColumn(
- modifier = Modifier.fillMaxSize(),
- state = lazyState,
- verticalArrangement = Arrangement.spacedBy(
- space = 4.dp,
- alignment = Alignment.Bottom,
- ),
- contentPadding = remember { PaddingValues(all = 8.dp) },
+ AnimatedVisibility(
+ visible = settings.value.show,
+ enter = fadeIn() + expandIn(),
+ exit = fadeOut() + shrinkOut(),
) {
- items(
- items = messages.value,
- key = { it.id },
- contentType = { it.javaClass.simpleName }
+ LazyColumn(
+ modifier = Modifier
+ .width(width = campaignLayoutScope.chatOverlay.value.width - (32.dp + 8.dp))
+ .heightIn(min = MaterialTheme.lwa.size.portrait.minimized.height * 2 + 8.dp),
+ state = lazyState,
+ verticalArrangement = Arrangement.spacedBy(
+ space = 4.dp,
+ alignment = Alignment.Bottom,
+ ),
+ contentPadding = remember { PaddingValues(all = 8.dp) },
) {
- when (it) {
- is RollTextMessageUio -> RollTextMessage(message = it)
- is PurseTextMessageUio -> PurseTextMessage(message = it)
- is DiminishedTextMessageUio -> DiminishedTextMessage(message = it)
- is CharacteristicTextMessageUio -> CharacteristicTextMessage(message = it)
+ items(
+ items = messages.value,
+ key = { it.id },
+ contentType = { it.javaClass.simpleName }
+ ) {
+ when (it) {
+ is RollTextMessageUio -> RollTextMessage(message = it)
+ is PurseTextMessageUio -> PurseTextMessage(message = it)
+ is DiminishedTextMessageUio -> DiminishedTextMessage(message = it)
+ is CharacteristicTextMessageUio -> CharacteristicTextMessage(message = it)
+ }
}
}
}
+ Column {
+ IconButton(
+ modifier = Modifier.size(size = 32.dp),
+ onClick = chatViewModel::toggleChat
+ ) {
+ val rotation = animateFloatAsState(
+ targetValue = if (settings.value.show) 0f else 180f,
+ )
+ Icon(
+ modifier = Modifier
+ .size(size = 16.dp)
+ .graphicsLayer {
+ this.rotationZ = rotation.value
+ },
+ painter = painterResource(Res.drawable.ic_more_down_24dp),
+ contentDescription = null,
+ )
+ }
+ }
}
}
@@ -140,24 +156,16 @@ private fun ChatScrollDownEffect(
lazyState: LazyListState,
messages: State>,
settings: State,
- displayChat: suspend () -> Unit,
- hideChat: suspend () -> Unit,
) {
LaunchedEffect(
key1 = messages.value.lastOrNull()?.id,
) {
if (messages.value.isNotEmpty()) {
- if (settings.value.autoShowChat) {
- displayChat()
- }
- if (settings.value.autoScrollChat) {
+ if (settings.value.autoScroll) {
lazyState.animateScrollToItem(
index = messages.value.lastIndex + 1,
)
}
- if (settings.value.autoHideChat) {
- hideChat()
- }
}
}
}
@@ -167,19 +175,26 @@ private fun ChatScrollDownEffect(
private fun rememberAnimatedChatWidth(
campaignScreenScope: CampaignLayoutScope = LocalCampaignLayoutScope.current,
windowsState: WindowState = LocalWindowState.current,
+ settings: State,
): State {
val chatWidth = remember(windowsState, campaignScreenScope) {
derivedStateOf {
- val minChatWidth = 64.dp * 8
- val maxChatWidth = 64.dp * 12
- val windowWidth = windowsState.size.width
- if (windowWidth != Dp.Unspecified) {
- val width = windowWidth - campaignScreenScope.leftPanel.value.width - 16.dp
- min(max(width, minChatWidth), maxChatWidth)
+ if (settings.value.show) {
+ val minChatWidth = 64.dp * 8
+ val maxChatWidth = 64.dp * 12
+ val windowWidth = windowsState.size.width
+ if (windowWidth != Dp.Unspecified) {
+ val width = windowWidth - campaignScreenScope.leftPanel.value.width - 16.dp
+ min(max(width, minChatWidth), maxChatWidth)
+ } else {
+ minChatWidth
+ }
} else {
- minChatWidth
+ 0.dp
}
}
}
- return animateDpAsState(targetValue = chatWidth.value)
+ return animateDpAsState(
+ targetValue = chatWidth.value,
+ )
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt
index 21baec1..a2fab42 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/text/CampaignChatViewModel.kt
@@ -1,7 +1,5 @@
package com.pixelized.desktop.lwa.ui.screen.campaign.text
-import androidx.compose.animation.core.Animatable
-import androidx.compose.animation.core.tween
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.pixelized.desktop.lwa.repository.campaign.CampaignRepository
@@ -13,22 +11,20 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.runningFold
import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.launch
class CampaignChatViewModel(
private val settingsRepository: SettingsRepository,
- private val campaignRepository: CampaignRepository,
+ campaignRepository: CampaignRepository,
networkRepository: NetworkRepository,
textMessageFactory: TextMessageFactory,
) : ViewModel() {
- val chatAnimatedVisibility = Animatable(0f)
-
val settings = settingsRepository.settingsFlow().map {
ChatSettingsUio(
- autoShowChat = it.chat.autoShowChat,
- autoScrollChat = it.chat.autoScrollChat,
- autoHideChat = it.chat.autoHideChat,
+ show = it.chat.showChat,
+ autoScroll = it.chat.autoScrollChat,
)
}.stateIn(
scope = viewModelScope,
@@ -59,20 +55,14 @@ class CampaignChatViewModel(
initialValue = emptyList(),
)
- suspend fun displayChat() {
- chatAnimatedVisibility.animateTo(
- targetValue = 1f,
- )
- }
-
- suspend fun hideChat() {
- val settings = settingsRepository.settingsFlow().value
- chatAnimatedVisibility.animateTo(
- targetValue = 0f,
- animationSpec = tween(
- durationMillis = 2000,
- delayMillis = settings.chat.autoHideDelay * 1000,
+ fun toggleChat() {
+ viewModelScope.launch {
+ val settings = settingsRepository.settingsFlow().value
+ settingsRepository.update(
+ settings = settings.copy(
+ chat = settings.chat.copy(showChat = settings.chat.showChat.not())
+ )
)
- )
+ }
}
}
\ No newline at end of file
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/settings/SettingsViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/settings/SettingsViewModel.kt
index 6560bb1..42fd420 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/settings/SettingsViewModel.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/settings/SettingsViewModel.kt
@@ -15,16 +15,8 @@ import lwacharactersheet.composeapp.generated.resources.ic_fan_focus_24dp
import lwacharactersheet.composeapp.generated.resources.ic_format_list_numbered_24dp
import lwacharactersheet.composeapp.generated.resources.ic_ifl_24dp
import lwacharactersheet.composeapp.generated.resources.ic_timer_24dp
-import lwacharactersheet.composeapp.generated.resources.ic_visibility_24dp
-import lwacharactersheet.composeapp.generated.resources.ic_visibility_off_24dp
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_hide_delay_description
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_hide_delay_title
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_hide_description
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_hide_title
import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_scroll_description
import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_scroll_title
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_show_description
-import lwacharactersheet.composeapp.generated.resources.settings__chat_log__auto_show_title
import lwacharactersheet.composeapp.generated.resources.settings__chat_log__line_count_description
import lwacharactersheet.composeapp.generated.resources.settings__chat_log__line_count_title
import lwacharactersheet.composeapp.generated.resources.settings__chat_log__section
@@ -92,48 +84,6 @@ class SettingsViewModel(
SettingSectionUio(
title = Res.string.settings__chat_log__section,
),
- SettingToggleItemUio(
- icon = Res.drawable.ic_visibility_24dp,
- title = Res.string.settings__chat_log__auto_show_title,
- description = Res.string.settings__chat_log__auto_show_description,
- checked = booleanStates.autoShowChat,
- onToggle = {
- settingsRepository.update(
- settings = settings.value.copy(
- chat = settings.value.chat.copy(autoShowChat = it)
- )
- )
- },
- ),
- SettingToggleItemUio(
- icon = Res.drawable.ic_visibility_off_24dp,
- title = Res.string.settings__chat_log__auto_hide_title,
- description = Res.string.settings__chat_log__auto_hide_description,
- checked = booleanStates.autoHideChat,
- onToggle = {
- settingsRepository.update(
- settings = settings.value.copy(
- chat = settings.value.chat.copy(autoHideChat = it)
- )
- )
- },
- ),
- SettingNumberItemUio(
- icon = Res.drawable.ic_timer_24dp,
- title = Res.string.settings__chat_log__auto_hide_delay_title,
- description = Res.string.settings__chat_log__auto_hide_delay_description,
- enable = booleanStates.autoHideChat,
- value = intStates.autoHideDelay,
- onValueChange = {
- if (it in 0..999) {
- settingsRepository.update(
- settings = settings.value.copy(
- chat = settings.value.chat.copy(autoHideDelay = it)
- )
- )
- }
- }
- ),
SettingToggleItemUio(
icon = Res.drawable.ic_fan_focus_24dp,
title = Res.string.settings__chat_log__auto_scroll_title,
@@ -170,9 +120,6 @@ class SettingsViewModel(
settingsRepository.settingsFlow().collect { settings ->
booleanStates.dynamicDice.value = settings.portrait.dynamicDice
intStates.dynamicDiceDelay.value = settings.portrait.dynamicDiceDelay
- booleanStates.autoShowChat.value = settings.chat.autoShowChat
- booleanStates.autoHideChat.value = settings.chat.autoHideChat
- intStates.autoHideDelay.value = settings.chat.autoHideDelay
booleanStates.autoScrollChat.value = settings.chat.autoScrollChat
intStates.maxLineCount.value = settings.chat.maxLineCount
}
@@ -197,15 +144,6 @@ class SettingsViewModel(
private val HashMap>.dynamicDiceDelay
get() = getOrPut("DYNAMIC_DICE_DELAY") { mutableStateOf(settings.value.portrait.dynamicDiceDelay) }
- private val HashMap>.autoShowChat
- get() = getOrPut("AUTO_SHOW_CHAT") { mutableStateOf(settings.value.chat.autoShowChat) }
-
- private val HashMap>.autoHideChat
- get() = getOrPut("AUTO_HIDE_CHAT") { mutableStateOf(settings.value.chat.autoHideChat) }
-
- private val HashMap>.autoHideDelay
- get() = getOrPut("AUTO_HIDE_DELAY") { mutableStateOf(settings.value.chat.autoHideDelay) }
-
private val HashMap>.autoScrollChat
get() = getOrPut("AUTO_SCROLL_CHAT") { mutableStateOf(settings.value.chat.autoScrollChat) }
diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/usecase/SettingsUseCase.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/usecase/SettingsUseCase.kt
index 357b6ab..d4e325b 100644
--- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/usecase/SettingsUseCase.kt
+++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/usecase/SettingsUseCase.kt
@@ -8,12 +8,10 @@ class SettingsUseCase {
playerName = "",
portrait = Settings.Portrait(
dynamicDice = true,
- dynamicDiceDelay = 5000,
+ dynamicDiceDelay = 8000,
),
chat = Settings.Chat(
- autoHideChat = true,
- autoHideDelay = 8,
- autoShowChat = true,
+ showChat = true,
autoScrollChat = true,
maxLineCount = 200,
),