Add switch to the gamemaster screen + small adjustment for the UI.
This commit is contained in:
		
							parent
							
								
									50ed975913
								
							
						
					
					
						commit
						edbb508f6a
					
				
					 6 changed files with 76 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -210,6 +210,8 @@
 | 
			
		|||
    <string name="level_up__character_level_description">Passage du niveau %1$d ▸ %2$d</string>
 | 
			
		||||
    <string name="level_up__skill_level">niv : %1$d -</string>
 | 
			
		||||
 | 
			
		||||
    <string name="game_master__title">Admin</string>
 | 
			
		||||
    <string name="game_master__action">GameMaster</string>
 | 
			
		||||
    <string name="game_master__character_level__label">niv: %1$d</string>
 | 
			
		||||
    <string name="game_master__character_tag__character_search">Joueur</string>
 | 
			
		||||
    <string name="game_master__character_tag__character_label">Joueur-%1$d</string>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<List<GMTagUio>>,
 | 
			
		||||
    gameMaster: State<Boolean>,
 | 
			
		||||
    characters: State<List<GMCharacterUio>>,
 | 
			
		||||
    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,
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
)
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue