Add a navigation layer into the GameMaster screens.

This commit is contained in:
Thomas Andres Gomez 2025-04-01 17:29:39 +02:00
parent 1ebb7c1400
commit 6213d5ac15
8 changed files with 93 additions and 34 deletions

View file

@ -52,6 +52,7 @@ import com.pixelized.desktop.lwa.ui.navigation.window.destination.RollHistoryWin
import com.pixelized.desktop.lwa.ui.navigation.window.rememberMaxWindowHeight import com.pixelized.desktop.lwa.ui.navigation.window.rememberMaxWindowHeight
import com.pixelized.desktop.lwa.ui.overlay.roll.RollHostState import com.pixelized.desktop.lwa.ui.overlay.roll.RollHostState
import com.pixelized.desktop.lwa.ui.screen.characterSheet.CharacterSheetMainNavHost import com.pixelized.desktop.lwa.ui.screen.characterSheet.CharacterSheetMainNavHost
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterNavHost
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterScreen import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterScreen
import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryPage import com.pixelized.desktop.lwa.ui.screen.rollhistory.RollHistoryPage
import com.pixelized.desktop.lwa.ui.theme.LwaTheme import com.pixelized.desktop.lwa.ui.theme.LwaTheme
@ -184,7 +185,7 @@ private fun WindowsHandler(
is RollHistoryWindow -> RollHistoryPage() is RollHistoryWindow -> RollHistoryPage()
is GameMasterWindow -> LwaScaffold { is GameMasterWindow -> LwaScaffold {
GameMasterScreen() GameMasterNavHost()
} }
} }
} }

View file

@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class AlterationStore( class AlterationStore(
private val networkRepository: NetworkRepository, private val network: NetworkRepository,
private val factory: AlterationJsonFactory, private val factory: AlterationJsonFactory,
private val client: LwaClient, private val client: LwaClient,
) { ) {
@ -26,7 +26,7 @@ class AlterationStore(
val scope = CoroutineScope(Dispatchers.IO + Job()) val scope = CoroutineScope(Dispatchers.IO + Job())
// data update through WebSocket. // data update through WebSocket.
scope.launch { scope.launch {
networkRepository.data.collect(::handleMessage) network.data.collect(::handleMessage)
} }
} }

View file

@ -16,9 +16,9 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class CampaignStore( class CampaignStore(
private val client: LwaClient,
private val network: NetworkRepository, private val network: NetworkRepository,
private val factory: CampaignJsonFactory, private val factory: CampaignJsonFactory,
private val client: LwaClient,
) { ) {
private val campaignFlow = MutableStateFlow(value = Campaign.empty()) private val campaignFlow = MutableStateFlow(value = Campaign.empty())

View file

@ -19,9 +19,9 @@ import kotlinx.coroutines.launch
class CharacterSheetStore( class CharacterSheetStore(
private val alterationStore: AlterationStore, private val alterationStore: AlterationStore,
private val client: LwaClient,
private val network: NetworkRepository, private val network: NetworkRepository,
private val factory: CharacterSheetJsonFactory, private val factory: CharacterSheetJsonFactory,
private val client: LwaClient,
) { ) {
private val _previewFlow = MutableStateFlow<List<CharacterSheetPreview>>(value = emptyList()) private val _previewFlow = MutableStateFlow<List<CharacterSheetPreview>>(value = emptyList())
val previewFlow: StateFlow<List<CharacterSheetPreview>> get() = _previewFlow val previewFlow: StateFlow<List<CharacterSheetPreview>> get() = _previewFlow
@ -88,7 +88,6 @@ class CharacterSheetStore(
} }
} }
// TODO check crash
@Throws @Throws
suspend fun updateCharacterSheet( suspend fun updateCharacterSheet(
sheet: CharacterSheet, sheet: CharacterSheet,
@ -100,7 +99,6 @@ class CharacterSheetStore(
} }
} }
// TODO check crash
@Throws @Throws
suspend fun deleteCharacterSheet( suspend fun deleteCharacterSheet(
characterSheetId: String, characterSheetId: String,

View file

@ -0,0 +1,30 @@
package com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster
import androidx.compose.runtime.Stable
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.composable
import com.pixelized.desktop.lwa.ui.screen.gamemaster.GameMasterScreen
@Stable
object GameMasterDestination {
private const val ROUTE = "GameMasterMain"
fun baseRoute() = ROUTE
@Stable
fun navigationRoute() = ROUTE
}
fun NavGraphBuilder.composableGameMasterMainPage() {
composable(
route = GameMasterDestination.baseRoute(),
) {
GameMasterScreen()
}
}
fun NavHostController.navigateToGameMasterMainPage() {
val route = GameMasterDestination.navigationRoute()
navigate(route = route)
}

View file

@ -0,0 +1,42 @@
package com.pixelized.desktop.lwa.ui.screen.gamemaster
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.GameMasterDestination
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterMainPage
val LocalGMScreenController = compositionLocalOf<NavHostController> {
error("GameMaster NavHost controller is not yet ready")
}
@Composable
fun GameMasterNavHost() {
val controller = rememberNavController()
CompositionLocalProvider(
LocalScreenController provides controller,
LocalGMScreenController provides rememberNavController(),
) {
Surface(
modifier = Modifier.fillMaxSize()
) {
NavHost(
modifier = Modifier.fillMaxSize(),
navController = controller,
startDestination = GameMasterDestination.navigationRoute(),
) {
composableGameMasterMainPage()
composableGameMasterAlterationEditPage()
}
}
}
}

View file

@ -17,7 +17,6 @@ import androidx.compose.material.Switch
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.TopAppBar import androidx.compose.material.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.State import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -28,7 +27,6 @@ import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.GMActionDestination import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.GMActionDestination
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage
@ -52,36 +50,25 @@ import org.koin.compose.viewmodel.koinViewModel
@Composable @Composable
fun GameMasterScreen( fun GameMasterScreen(
gameMasterViewModel: GameMasterViewModel = koinViewModel(), gameMasterViewModel: GameMasterViewModel = koinViewModel(),
controller: NavHostController = LocalGMScreenController.current,
) { ) {
val screen = rememberNavController()
val gameMaster = gameMasterViewModel.isGameMaster.collectAsState() val gameMaster = gameMasterViewModel.isGameMaster.collectAsState()
CompositionLocalProvider(
LocalScreenController provides screen,
) {
Surface(
modifier = Modifier.fillMaxSize()
) {
Box {
GameMasterContent( GameMasterContent(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
controller = screen, controller = controller,
gameMaster = gameMaster, gameMaster = gameMaster,
onGameMaster = gameMasterViewModel::onGameMaster, onGameMaster = gameMasterViewModel::onGameMaster,
onTab = { onTab = {
when (it) { when (it) {
GMTabUio.Actions -> screen.navigateToGameMasterActionPage() GMTabUio.Actions -> controller.navigateToGameMasterActionPage()
GMTabUio.Characters -> screen.navigateToGameMasterCharacterPage() GMTabUio.Characters -> controller.navigateToGameMasterCharacterPage()
GMTabUio.Alterations -> screen.navigateToGameMasterAlterationPage() GMTabUio.Alterations -> controller.navigateToGameMasterAlterationPage()
GMTabUio.Objects -> screen.navigateToGameMasterObjectPage() GMTabUio.Objects -> controller.navigateToGameMasterObjectPage()
} }
}, },
) )
} }
}
}
}
@Composable @Composable
private fun GameMasterContent( private fun GameMasterContent(

View file

@ -40,6 +40,7 @@ import com.pixelized.desktop.lwa.ui.composable.key.KeyHandler
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextField
import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio import com.pixelized.desktop.lwa.ui.composable.textfield.LwaTextFieldUio
import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController import com.pixelized.desktop.lwa.ui.navigation.screen.LocalScreenController
import com.pixelized.desktop.lwa.ui.screen.gamemaster.LocalGMScreenController
import com.pixelized.desktop.lwa.ui.theme.color.component.LwaButtonColors import com.pixelized.desktop.lwa.ui.theme.color.component.LwaButtonColors
import com.pixelized.desktop.lwa.ui.theme.lwa import com.pixelized.desktop.lwa.ui.theme.lwa
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow