11package cz.frantisekmasa.wfrp_master.desktop
22
3- import androidx.compose.material.DrawerValue
43import androidx.compose.material.ExperimentalMaterialApi
5- import androidx.compose.material.rememberDrawerState
64import androidx.compose.runtime.CompositionLocalProvider
5+ import androidx.compose.runtime.key
6+ import androidx.compose.runtime.mutableStateListOf
77import androidx.compose.runtime.rememberCoroutineScope
8- import androidx.compose.ui.window.Window
8+ import androidx.compose.runtime.saveable.rememberSaveable
99import androidx.compose.ui.window.application
10- import cafe.adriel.voyager.navigator.Navigator
1110import cz.frantisekmasa.wfrp_master.common.appModule
1211import cz.frantisekmasa.wfrp_master.common.core.LocalStaticConfiguration
1312import cz.frantisekmasa.wfrp_master.common.core.config.Platform
1413import cz.frantisekmasa.wfrp_master.common.core.config.StaticConfiguration
1514import cz.frantisekmasa.wfrp_master.common.core.shared.LocalFileChooserFactory
1615import cz.frantisekmasa.wfrp_master.common.core.shared.LocalFileSaverFactory
1716import cz.frantisekmasa.wfrp_master.common.core.shared.LocalUrlOpener
18- import cz.frantisekmasa.wfrp_master.common.core.ui.navigation.ProvideNavigationTransaction
19- import cz.frantisekmasa.wfrp_master.common.core.ui.responsive.ScreenWithBreakpoints
20- import cz.frantisekmasa.wfrp_master.common.core.ui.scaffolding.KeyboardDispatcher
21- import cz.frantisekmasa.wfrp_master.common.core.ui.scaffolding.LocalKeyboardDispatcher
22- import cz.frantisekmasa.wfrp_master.common.core.ui.theme.Theme
23- import cz.frantisekmasa.wfrp_master.common.localization.FixedStrings
2417import cz.frantisekmasa.wfrp_master.common.partyList.PartyListScreen
25- import cz.frantisekmasa.wfrp_master.common.shell.DrawerShell
26- import cz.frantisekmasa.wfrp_master.common.shell.SnackbarScaffold
2718import cz.frantisekmasa.wfrp_master.desktop.interop.DesktopUrlOpener
2819import cz.frantisekmasa.wfrp_master.desktop.interop.NativeFileChooser
2920import cz.frantisekmasa.wfrp_master.desktop.interop.NativeFileSaver
30- import kotlinx.coroutines.launch
21+ import io.github.aakira.napier.Napier
3122import org.kodein.di.compose.withDI
23+ import java.util.UUID
3224
3325@ExperimentalMaterialApi
3426object WfrpMasterApplication {
3527 @JvmStatic
3628 fun main (args : Array <String >) {
37- val keyboardDispatcher = KeyboardDispatcher ()
38-
3929 application {
4030 withDI(appModule) {
4131 val coroutineScope = rememberCoroutineScope()
@@ -49,49 +39,38 @@ object WfrpMasterApplication {
4939 version = " dev" ,
5040 platform = Platform .Desktop ,
5141 ),
52- LocalKeyboardDispatcher provides keyboardDispatcher,
5342 ) {
54- Window (
55- title = FixedStrings .appName,
56- onCloseRequest = ::exitApplication,
57- onPreviewKeyEvent = {
58- keyboardDispatcher.dispatch(it, beforeChildren = true )
59- },
60- onKeyEvent = {
61- keyboardDispatcher.dispatch(it, beforeChildren = false )
62- },
63- ) {
64- Theme {
65- SnackbarScaffold {
66- Startup {
67- ScreenWithBreakpoints {
68- val drawerState = rememberDrawerState(DrawerValue .Closed )
69-
70- Navigator (
71- screens = listOf (PartyListScreen ),
72- onBackPressed = {
73- if (drawerState.isOpen) {
74- coroutineScope.launch { drawerState.close() }
75- return @Navigator false
76- }
77-
78- true
79- }
80- ) { navigator ->
81- DrawerShell (drawerState) {
82- val screen = navigator.lastItem
43+ val windows = rememberSaveable {
44+ mutableStateListOf(
45+ ApplicationWindowState (
46+ initialScreen = PartyListScreen ,
47+ key = UUID .randomUUID(),
48+ isPrimary = true ,
49+ )
50+ )
51+ }
8352
84- navigator.saveableState(" currentScreen" ) {
85- ProvideNavigationTransaction (screen) {
86- Shortcuts ()
87- screen.Content ()
88- }
89- }
90- }
91- }
53+ windows.forEach { window ->
54+ key(window.key) {
55+ ApplicationWindow (
56+ initialScreen = window.initialScreen,
57+ onNewWindowRequest = { initialScreen ->
58+ windows + = ApplicationWindowState (
59+ initialScreen = initialScreen,
60+ key = UUID .randomUUID(),
61+ isPrimary = false ,
62+ )
63+ },
64+ onCloseRequest = {
65+ if (window.isPrimary) {
66+ Napier .d(" Requested closing of primary window, exiting the app" )
67+ exitApplication()
68+ } else {
69+ Napier .d(" Closing non-primary window" )
70+ windows.removeIf { it.key == window.key }
9271 }
93- }
94- }
72+ },
73+ )
9574 }
9675 }
9776 }
0 commit comments