Add roll sharing feature over the WebSocket.
This commit is contained in:
		
							parent
							
								
									0e5fee6771
								
							
						
					
					
						commit
						f92922c228
					
				
					 17 changed files with 476 additions and 183 deletions
				
			
		| 
						 | 
				
			
			@ -1,11 +1,16 @@
 | 
			
		|||
package com.pixelized.desktop.lwa
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.fillMaxSize
 | 
			
		||||
import androidx.compose.material.Scaffold
 | 
			
		||||
import androidx.compose.material.SnackbarHost
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			@ -13,9 +18,19 @@ 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.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")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,23 +39,47 @@ val LocalWindowController = compositionLocalOf<WindowController> {
 | 
			
		|||
data class WindowController(
 | 
			
		||||
    private val onCloseRequest: () -> Unit
 | 
			
		||||
) {
 | 
			
		||||
    fun close() = onCloseRequest()
 | 
			
		||||
    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())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
@Preview
 | 
			
		||||
fun ApplicationScope.App() {
 | 
			
		||||
    val controller = remember {
 | 
			
		||||
        WindowController(
 | 
			
		||||
            onCloseRequest = ::exitApplication
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
    val controller = remember { WindowController(onCloseRequest = ::exitApplication) }
 | 
			
		||||
    val snackHostState = remember { SnackbarHostState() }
 | 
			
		||||
 | 
			
		||||
    CompositionLocalProvider(
 | 
			
		||||
        LocalWindowController provides controller,
 | 
			
		||||
        LocalSnackHost provides snackHostState,
 | 
			
		||||
    ) {
 | 
			
		||||
        Window(
 | 
			
		||||
            onCloseRequest = {
 | 
			
		||||
                controller.close()
 | 
			
		||||
                controller.closeWindows()
 | 
			
		||||
            },
 | 
			
		||||
            state = rememberWindowState(
 | 
			
		||||
                width = 320.dp + 64.dp,
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +91,86 @@ fun ApplicationScope.App() {
 | 
			
		|||
                Surface(
 | 
			
		||||
                    modifier = Modifier.fillMaxSize()
 | 
			
		||||
                ) {
 | 
			
		||||
                    MainNavHost()
 | 
			
		||||
                    Scaffold(
 | 
			
		||||
                        snackbarHost = {
 | 
			
		||||
                            SnackbarHost(
 | 
			
		||||
                                hostState = snackHostState,
 | 
			
		||||
                            )
 | 
			
		||||
                        },
 | 
			
		||||
                        content = {
 | 
			
		||||
                            MainNavHost()
 | 
			
		||||
                        }
 | 
			
		||||
                    )
 | 
			
		||||
                    HandleCharacterSheet(
 | 
			
		||||
                        sheets = controller.sheet,
 | 
			
		||||
                        onCloseRequest = { controller.hideCharacterSheet(sheet = it) }
 | 
			
		||||
                    )
 | 
			
		||||
                    HandleCharacterSheetCreation(
 | 
			
		||||
                        sheets = controller.create,
 | 
			
		||||
                        onCloseRequest = { controller.hideCreateCharacterSheet(id = it) },
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun HandleCharacterSheet(
 | 
			
		||||
    sheets: State<Set<CharacterUio>>,
 | 
			
		||||
    onCloseRequest: (id: CharacterUio) -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    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)
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@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(
 | 
			
		||||
                    startDestination = CharacterSheetEditDestination.navigationRoute(id = null)
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue