Refactor the windows navigation system
This commit is contained in:
parent
5ac0c2dcf6
commit
59f8aff121
20 changed files with 155 additions and 148 deletions
|
|
@ -7,80 +7,44 @@ import androidx.compose.material.SnackbarHostState
|
|||
import androidx.compose.material.Surface
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.Stable
|
||||
import androidx.compose.runtime.State
|
||||
import androidx.compose.runtime.compositionLocalOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.ApplicationScope
|
||||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.rememberWindowState
|
||||
import com.pixelized.desktop.lwa.navigation.MainNavHost
|
||||
import com.pixelized.desktop.lwa.navigation.destination.CharacterSheetDestination
|
||||
import com.pixelized.desktop.lwa.navigation.destination.CharacterSheetEditDestination
|
||||
import com.pixelized.desktop.lwa.navigation.screen.MainNavHost
|
||||
import com.pixelized.desktop.lwa.navigation.screen.destination.CharacterSheetDestination
|
||||
import com.pixelized.desktop.lwa.navigation.screen.destination.CharacterSheetEditDestination
|
||||
import com.pixelized.desktop.lwa.navigation.window.WindowController
|
||||
import com.pixelized.desktop.lwa.navigation.window.WindowsNavHost
|
||||
import com.pixelized.desktop.lwa.navigation.window.destination.CharacterSheetCreateWindow
|
||||
import com.pixelized.desktop.lwa.navigation.window.destination.CharacterSheetWindow
|
||||
import com.pixelized.desktop.lwa.screen.characterSheet.CharacterSheetMainNavHost
|
||||
import com.pixelized.desktop.lwa.screen.main.CharacterUio
|
||||
import com.pixelized.desktop.lwa.theme.LwaTheme
|
||||
import lwacharactersheet.composeapp.generated.resources.Res
|
||||
import lwacharactersheet.composeapp.generated.resources.character_sheet_edit__title
|
||||
import org.jetbrains.compose.resources.stringResource
|
||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||
|
||||
val LocalSnackHost = compositionLocalOf<SnackbarHostState> {
|
||||
error("Local Snack Controller is not yet ready")
|
||||
}
|
||||
val LocalWindowController = compositionLocalOf<WindowController> {
|
||||
error("Local Window Controller is not yet ready")
|
||||
}
|
||||
|
||||
@Stable
|
||||
data class WindowController(
|
||||
private val onCloseRequest: () -> Unit
|
||||
) {
|
||||
val sheet: State<Set<CharacterUio>> get() = _sheet
|
||||
|
||||
val create: State<Set<Int>> get() = _create
|
||||
|
||||
fun showCreateCharacterSheet() {
|
||||
_create.value = _create.value.toMutableSet().apply { add(size) }
|
||||
}
|
||||
|
||||
fun hideCreateCharacterSheet(id: Int) {
|
||||
_create.value = _create.value.toMutableSet().apply { remove(id) }
|
||||
}
|
||||
|
||||
fun showCharacterSheet(sheet: CharacterUio) {
|
||||
_sheet.value = _sheet.value.toMutableSet().apply { add(sheet) }
|
||||
}
|
||||
|
||||
fun hideCharacterSheet(sheet: CharacterUio) {
|
||||
_sheet.value = _sheet.value.toMutableSet().apply { remove(sheet) }
|
||||
}
|
||||
|
||||
fun closeWindows() = onCloseRequest()
|
||||
|
||||
companion object {
|
||||
private val _sheet = mutableStateOf<Set<CharacterUio>>(emptySet())
|
||||
private val _create = mutableStateOf<Set<Int>>(emptySet())
|
||||
}
|
||||
val LocalSnackHost = compositionLocalOf<SnackbarHostState> {
|
||||
error("Local Snack Controller is not yet ready")
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun ApplicationScope.App() {
|
||||
val controller = remember { WindowController(onCloseRequest = ::exitApplication) }
|
||||
val snackHostState = remember { SnackbarHostState() }
|
||||
val windowController = remember { WindowController() }
|
||||
|
||||
CompositionLocalProvider(
|
||||
LocalWindowController provides controller,
|
||||
LocalSnackHost provides snackHostState,
|
||||
LocalWindowController provides windowController,
|
||||
) {
|
||||
Window(
|
||||
onCloseRequest = {
|
||||
controller.closeWindows()
|
||||
},
|
||||
onCloseRequest = ::exitApplication,
|
||||
state = rememberWindowState(
|
||||
width = 320.dp + 64.dp,
|
||||
height = 900.dp,
|
||||
|
|
@ -101,13 +65,8 @@ fun ApplicationScope.App() {
|
|||
MainNavHost()
|
||||
}
|
||||
)
|
||||
HandleCharacterSheet(
|
||||
sheets = controller.sheet,
|
||||
onCloseRequest = { controller.hideCharacterSheet(sheet = it) }
|
||||
)
|
||||
HandleCharacterSheetCreation(
|
||||
sheets = controller.create,
|
||||
onCloseRequest = { controller.hideCreateCharacterSheet(id = it) },
|
||||
WindowsHandler(
|
||||
windowController = windowController,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -116,64 +75,26 @@ fun ApplicationScope.App() {
|
|||
}
|
||||
|
||||
@Composable
|
||||
fun HandleCharacterSheet(
|
||||
sheets: State<Set<CharacterUio>>,
|
||||
onCloseRequest: (id: CharacterUio) -> Unit,
|
||||
private fun WindowsHandler(
|
||||
windowController: WindowController
|
||||
) {
|
||||
sheets.value.forEach { sheet ->
|
||||
val controller = remember {
|
||||
WindowController(
|
||||
onCloseRequest = { onCloseRequest(sheet) }
|
||||
)
|
||||
}
|
||||
CompositionLocalProvider(
|
||||
LocalWindowController provides controller,
|
||||
) {
|
||||
Window(
|
||||
onCloseRequest = { onCloseRequest(sheet) },
|
||||
state = rememberWindowState(
|
||||
width = 400.dp + 64.dp,
|
||||
height = 900.dp,
|
||||
),
|
||||
title = sheet.name,
|
||||
) {
|
||||
CharacterSheetMainNavHost(
|
||||
startDestination = CharacterSheetDestination.navigationRoute(id = sheet.id)
|
||||
WindowsNavHost(
|
||||
controller = windowController,
|
||||
content = { window ->
|
||||
when (window) {
|
||||
is CharacterSheetWindow -> CharacterSheetMainNavHost(
|
||||
startDestination = CharacterSheetDestination.navigationRoute(
|
||||
id = window.characterId,
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun HandleCharacterSheetCreation(
|
||||
sheets: State<Set<Int>>,
|
||||
onCloseRequest: (id: Int) -> Unit,
|
||||
) {
|
||||
sheets.value.forEach { sheet ->
|
||||
val controller = remember {
|
||||
WindowController(
|
||||
onCloseRequest = { onCloseRequest(sheet) }
|
||||
)
|
||||
}
|
||||
CompositionLocalProvider(
|
||||
LocalWindowController provides controller,
|
||||
) {
|
||||
Window(
|
||||
onCloseRequest = { controller.closeWindows() },
|
||||
state = rememberWindowState(
|
||||
width = 400.dp + 64.dp,
|
||||
height = 900.dp,
|
||||
),
|
||||
title = stringResource(Res.string.character_sheet_edit__title),
|
||||
) {
|
||||
CharacterSheetMainNavHost(
|
||||
is CharacterSheetCreateWindow -> CharacterSheetMainNavHost(
|
||||
startDestination = CharacterSheetEditDestination.navigationRoute(
|
||||
id = null,
|
||||
enableBack = false,
|
||||
)
|
||||
),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue