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