Add a navigation layer into the GameMaster screens.
This commit is contained in:
parent
1ebb7c1400
commit
6213d5ac15
8 changed files with 93 additions and 34 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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,35 +50,24 @@ 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(
|
GameMasterContent(
|
||||||
LocalScreenController provides screen,
|
modifier = Modifier.fillMaxSize(),
|
||||||
) {
|
controller = controller,
|
||||||
Surface(
|
gameMaster = gameMaster,
|
||||||
modifier = Modifier.fillMaxSize()
|
onGameMaster = gameMasterViewModel::onGameMaster,
|
||||||
) {
|
onTab = {
|
||||||
Box {
|
when (it) {
|
||||||
GameMasterContent(
|
GMTabUio.Actions -> controller.navigateToGameMasterActionPage()
|
||||||
modifier = Modifier.fillMaxSize(),
|
GMTabUio.Characters -> controller.navigateToGameMasterCharacterPage()
|
||||||
controller = screen,
|
GMTabUio.Alterations -> controller.navigateToGameMasterAlterationPage()
|
||||||
gameMaster = gameMaster,
|
GMTabUio.Objects -> controller.navigateToGameMasterObjectPage()
|
||||||
onGameMaster = gameMasterViewModel::onGameMaster,
|
|
||||||
onTab = {
|
|
||||||
when (it) {
|
|
||||||
GMTabUio.Actions -> screen.navigateToGameMasterActionPage()
|
|
||||||
GMTabUio.Characters -> screen.navigateToGameMasterCharacterPage()
|
|
||||||
GMTabUio.Alterations -> screen.navigateToGameMasterAlterationPage()
|
|
||||||
GMTabUio.Objects -> screen.navigateToGameMasterObjectPage()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue