diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index dd625a6..077b5ae 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -210,6 +210,8 @@ Passage du niveau %1$d ▸ %2$d niv : %1$d - + Admin + GameMaster niv: %1$d Joueur Joueur-%1$d diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt index 0264711..3d29f4f 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/DataSyncViewModel.kt @@ -9,6 +9,7 @@ import com.pixelized.desktop.lwa.repository.settings.SettingsRepository import com.pixelized.shared.lwa.model.campaign.Campaign import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -36,17 +37,16 @@ class DataSyncViewModel( networkRepository.status .filter { status -> status == NetworkRepository.Status.CONNECTED } - .onEach { campaignRepository.campaign(update = true) } - .launchIn(this) - - networkRepository.status - .filter { status -> status == NetworkRepository.Status.CONNECTED } - .onEach { characterRepository.updateCharacterPreviews() } + .onEach { + campaignRepository.campaign(update = true) + characterRepository.updateCharacterPreviews() + } .launchIn(this) networkRepository.status .filter { status -> status == NetworkRepository.Status.CONNECTED } .combine(campaignRepository.campaignFlow) { _, campaign: Campaign -> campaign } + .distinctUntilChanged() .onEach { campaign -> (campaign.characters.keys + campaign.npcs.keys).forEach { id -> characterRepository.characterDetail( diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt index 419a3a8..77080ec 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterScreen.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.draggable import androidx.compose.foundation.gestures.rememberDraggableState @@ -12,6 +13,8 @@ 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.Row +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -26,8 +29,8 @@ import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Surface +import androidx.compose.material.Switch import androidx.compose.material.Text -import androidx.compose.material.TextButton import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add @@ -38,6 +41,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import com.pixelized.desktop.lwa.LocalWindowController import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField @@ -52,9 +56,12 @@ import kotlinx.coroutines.launch import lwacharactersheet.composeapp.generated.resources.Res import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__create__title import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__edit__title +import lwacharactersheet.composeapp.generated.resources.game_master__action +import lwacharactersheet.composeapp.generated.resources.game_master__title import lwacharactersheet.composeapp.generated.resources.ic_cancel_24dp import org.jetbrains.compose.resources.getString import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource import org.koin.compose.viewmodel.koinViewModel @Composable @@ -65,6 +72,7 @@ fun GameMasterScreen( val scope = rememberCoroutineScope() val characters = viewModel.characters.collectAsState() + val gameMaster = viewModel.gameMaster.collectAsState() val tags = viewModel.tags.collectAsState() Surface( @@ -73,10 +81,11 @@ fun GameMasterScreen( GameMasterContent( modifier = Modifier.fillMaxSize(), filter = viewModel.filter, - onGameMaster = viewModel::onGameMaster, tags = tags, + gameMaster = gameMaster, characters = characters, onTag = viewModel::onTag, + onGameMaster = viewModel::onGameMaster, onCharacterAction = viewModel::onCharacterAction, onCharacterSheetEdit = { characterSheetId -> scope.launch { @@ -104,8 +113,9 @@ private fun GameMasterContent( filterChipsState: LazyListState = rememberLazyListState(), filter: LwaTextFieldUio, tags: State>, + gameMaster: State, characters: State>, - onGameMaster: () -> Unit, + onGameMaster: (Boolean) -> Unit, onTag: (GMTagUio.TagId) -> Unit, onCharacterAction: (String, GMCharacterUio.Action) -> Unit, onCharacterSheetEdit: (String) -> Unit, @@ -119,14 +129,28 @@ private fun GameMasterContent( TopAppBar( title = { Text( - text = "", + text = stringResource(Res.string.game_master__title), ) }, actions = { - TextButton( - onClick = onGameMaster, + Row( + modifier = Modifier + .clip(shape = CircleShape) + .clickable { onGameMaster(gameMaster.value.not()) } + .padding(all = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(space = 4.dp) ) { - Text(text = "GameMaster") + Text( + color = MaterialTheme.lwa.colorScheme.base.primary, + style = MaterialTheme.typography.caption, + text = stringResource(Res.string.game_master__action), + ) + Switch( + checked = gameMaster.value, + colors = MaterialTheme.lwa.colorScheme.component.switch, + onCheckedChange = null, + ) } } ) diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterViewModel.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterViewModel.kt index 726dfa1..53825ed 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/screen/gamemaster/GameMasterViewModel.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import lwacharactersheet.composeapp.generated.resources.Res @@ -72,11 +73,19 @@ class GameMasterViewModel( initialValue = emptyList(), ) - fun onGameMaster() { + val gameMaster = settingsRepository.settingsFlow() + .map { it.isGameMaster ?: false } + .stateIn( + scope = viewModelScope, + started = SharingStarted.Eagerly, + initialValue = false, + ) + + fun onGameMaster(value: Boolean) { val settings = settingsRepository.settings() settingsRepository.update( settings = settings.copy( - isGameMaster = (settings.isGameMaster ?: false).not(), + isGameMaster = value, ) ) } diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/LwaColors.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/LwaColors.kt index d1b1a24..3095c03 100644 --- a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/LwaColors.kt +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/LwaColors.kt @@ -1,6 +1,7 @@ package com.pixelized.desktop.lwa.ui.theme.color import androidx.compose.material.Colors +import androidx.compose.material.SwitchColors import androidx.compose.material.darkColors import androidx.compose.runtime.Composable import androidx.compose.runtime.ReadOnlyComposable @@ -10,16 +11,23 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import com.pixelized.desktop.lwa.ui.theme.color.component.lwaSwitch import kotlin.math.ln @Stable data class LwaColors( val base: Colors, + val component: Component, val elevated: Elevated, val portrait: Portrait, val portraitBackgroundBrush: Brush, val chat: Chat, ) { + @Stable + data class Component( + val switch: SwitchColors, + ) + @Stable data class Elevated( val base1dp: Color, @@ -72,6 +80,9 @@ fun darkLwaColorTheme( elevation = 4.dp, ), ), + component: LwaColors.Component = LwaColors.Component( + switch = lwaSwitch(base = base), + ), portraitBackgroundBrush: Brush = Brush.verticalGradient( listOf( elevated.base1dp.copy(alpha = 0.0f), @@ -96,6 +107,7 @@ fun darkLwaColorTheme( ), ): LwaColors = LwaColors( base = base, + component = component, elevated = elevated, portrait = portrait, portraitBackgroundBrush = portraitBackgroundBrush, diff --git a/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/component/LwaSwitch.kt b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/component/LwaSwitch.kt new file mode 100644 index 0000000..418b92e --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/pixelized/desktop/lwa/ui/theme/color/component/LwaSwitch.kt @@ -0,0 +1,14 @@ +package com.pixelized.desktop.lwa.ui.theme.color.component + +import androidx.compose.material.Colors +import androidx.compose.material.SwitchDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable + +@Composable +@Stable +fun lwaSwitch( + base: Colors +) = SwitchDefaults.colors( + checkedThumbColor = base.primary, +) \ No newline at end of file