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.overlay.roll.RollHostState
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.rollhistory.RollHistoryPage
import com.pixelized.desktop.lwa.ui.theme.LwaTheme
@ -184,7 +185,7 @@ private fun WindowsHandler(
is RollHistoryWindow -> RollHistoryPage()
is GameMasterWindow -> LwaScaffold {
GameMasterScreen()
GameMasterNavHost()
}
}
}

View file

@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
class AlterationStore(
private val networkRepository: NetworkRepository,
private val network: NetworkRepository,
private val factory: AlterationJsonFactory,
private val client: LwaClient,
) {
@ -26,7 +26,7 @@ class AlterationStore(
val scope = CoroutineScope(Dispatchers.IO + Job())
// data update through WebSocket.
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
class CampaignStore(
private val client: LwaClient,
private val network: NetworkRepository,
private val factory: CampaignJsonFactory,
private val client: LwaClient,
) {
private val campaignFlow = MutableStateFlow(value = Campaign.empty())

View file

@ -19,9 +19,9 @@ import kotlinx.coroutines.launch
class CharacterSheetStore(
private val alterationStore: AlterationStore,
private val client: LwaClient,
private val network: NetworkRepository,
private val factory: CharacterSheetJsonFactory,
private val client: LwaClient,
) {
private val _previewFlow = MutableStateFlow<List<CharacterSheetPreview>>(value = emptyList())
val previewFlow: StateFlow<List<CharacterSheetPreview>> get() = _previewFlow
@ -88,7 +88,6 @@ class CharacterSheetStore(
}
}
// TODO check crash
@Throws
suspend fun updateCharacterSheet(
sheet: CharacterSheet,
@ -100,7 +99,6 @@ class CharacterSheetStore(
}
}
// TODO check crash
@Throws
suspend fun deleteCharacterSheet(
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.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Alignment
@ -28,7 +27,6 @@ import androidx.compose.ui.unit.dp
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.GMActionDestination
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterActionPage
import com.pixelized.desktop.lwa.ui.navigation.screen.destination.gamemaster.composableGameMasterAlterationEditPage
@ -52,35 +50,24 @@ import org.koin.compose.viewmodel.koinViewModel
@Composable
fun GameMasterScreen(
gameMasterViewModel: GameMasterViewModel = koinViewModel(),
controller: NavHostController = LocalGMScreenController.current,
) {
val screen = rememberNavController()
val gameMaster = gameMasterViewModel.isGameMaster.collectAsState()
CompositionLocalProvider(
LocalScreenController provides screen,
) {
Surface(
modifier = Modifier.fillMaxSize()
) {
Box {
GameMasterContent(
modifier = Modifier.fillMaxSize(),
controller = screen,
gameMaster = gameMaster,
onGameMaster = gameMasterViewModel::onGameMaster,
onTab = {
when (it) {
GMTabUio.Actions -> screen.navigateToGameMasterActionPage()
GMTabUio.Characters -> screen.navigateToGameMasterCharacterPage()
GMTabUio.Alterations -> screen.navigateToGameMasterAlterationPage()
GMTabUio.Objects -> screen.navigateToGameMasterObjectPage()
}
},
)
GameMasterContent(
modifier = Modifier.fillMaxSize(),
controller = controller,
gameMaster = gameMaster,
onGameMaster = gameMasterViewModel::onGameMaster,
onTab = {
when (it) {
GMTabUio.Actions -> controller.navigateToGameMasterActionPage()
GMTabUio.Characters -> controller.navigateToGameMasterCharacterPage()
GMTabUio.Alterations -> controller.navigateToGameMasterAlterationPage()
GMTabUio.Objects -> controller.navigateToGameMasterObjectPage()
}
}
}
},
)
}
@Composable

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.LwaTextFieldUio
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.lwa
import kotlinx.coroutines.flow.MutableStateFlow