From fc06e3ef95c6f9fa40074bd83e57afb403f2a1f7 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Sun, 12 Oct 2025 21:19:03 +0200 Subject: [PATCH] Refactor the chat to add a collapsable state. --- .../drawable/ic_more_down_24dp.svg | 7 + .../composeResources/values/strings.xml | 6 - .../repository/settings/SettingsFactory.kt | 36 +++- .../lwa/repository/settings/model/Settings.kt | 4 +- .../settings/model/SettingsJsonV2.kt | 17 ++ .../lwa/ui/screen/campaign/CampaignScreen.kt | 40 ++--- .../campaign/player/ribbon/CharacterRibbon.kt | 72 ++++++++ .../ui/screen/campaign/text/CampaignChat.kt | 157 ++++++++++-------- .../campaign/text/CampaignChatViewModel.kt | 34 ++-- .../ui/screen/settings/SettingsViewModel.kt | 62 ------- .../desktop/lwa/usecase/SettingsUseCase.kt | 6 +- 11 files changed, 246 insertions(+), 195 deletions(-) create mode 100644 composeApp/src/commonMain/composeResources/drawable/ic_more_down_24dp.svg create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/repository/settings/model/SettingsJsonV2.kt create mode 100644 composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/campaign/player/ribbon/CharacterRibbon.kt 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, ),