From 362f9a96416bdb8a0084fa9228dd5b1149538f34 Mon Sep 17 00:00:00 2001 From: Raphael TEYSSANDIER Date: Thu, 22 Jan 2026 00:06:34 +0100 Subject: [PATCH 1/3] feat: Rework nav3 --- .../openflocon/flocondesktop/app/MenuScene.kt | 27 +++++++++---------- FloconDesktop/gradle/libs.versions.toml | 4 +++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt index 36f8e7d35..864d3d373 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt @@ -43,14 +43,13 @@ import io.github.openflocon.navigation.FloconRoute @Immutable data class MenuScene( - override val entries: List>, - override val previousEntries: List>, - val entry: NavEntry, - val menuContent: @Composable (expanded: Boolean) -> Unit, + val scene: Scene, + val menuContent: @Composable ((expanded: Boolean) -> Unit), val topBarContent: @Composable (() -> Unit)? ) : Scene { - override val key: Any - get() = Unit + override val key: Any = Unit + override val entries: List> = scene.entries + override val previousEntries: List> = scene.previousEntries override val content: @Composable (() -> Unit) = { var expanded by remember { mutableStateOf(true) } @@ -84,7 +83,7 @@ data class MenuScene( ) { menuContent(expanded) } - entry.Content() + scene.content() } } Box( @@ -115,22 +114,20 @@ class MenuSceneStrategy( private val topBarContent: @Composable (() -> Unit)? = null ) : SceneStrategy { - override fun SceneStrategyScope.calculateScene(entries: List>): Scene? { - val entry = entries.lastOrNull() ?: return null - - if (entry.metadata.containsKey(MENU_KEY)) { + override fun SceneStrategyScope.calculateScene(scene: Scene): Scene { + if (scene.metadata.containsKey(MENU_KEY)) { return MenuScene( - entries = listOf(entry), - previousEntries = entries.dropLast(1), - entry = entry, + scene = scene, menuContent = menuContent, topBarContent = topBarContent ) } - return null + return scene } + override fun SceneStrategyScope.calculateScene(entries: List>): Scene? = null + companion object { private const val MENU_KEY = "menu_key" diff --git a/FloconDesktop/gradle/libs.versions.toml b/FloconDesktop/gradle/libs.versions.toml index c9f089e98..0e0d815d4 100644 --- a/FloconDesktop/gradle/libs.versions.toml +++ b/FloconDesktop/gradle/libs.versions.toml @@ -39,6 +39,10 @@ runner = "1.7.0" sqlite = "2.6.2" ui-tooling-preview-desktop = "1.8.2" +# TODO Sort +nav3Core = "1.1.0-alpha02+dev3508"#"1.0.0-alpha03" +material3-adaptive = "1.0.0-alpha03" +kotlinxSerializationCore = "1.8.1" [libraries] # AboutLibraries aboutlibraries-compose-core = { module = "com.mikepenz:aboutlibraries-compose-core", version.ref = "about-libraries" } From c8acf3dfced19003b35e8827ccbe3862fa59396f Mon Sep 17 00:00:00 2001 From: Raphael TEYSSANDIER Date: Wed, 4 Mar 2026 14:47:29 +0100 Subject: [PATCH 2/3] bump: Update compose --- .../openflocon/flocondesktop/app/AppScreen.kt | 52 +++++++++---------- .../openflocon/flocondesktop/app/MenuScene.kt | 8 +-- FloconDesktop/gradle/libs.versions.toml | 2 +- .../openflocon/navigation/FloconNavigation.kt | 3 ++ 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt index 5b4e5cf3a..555e75897 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt @@ -60,33 +60,33 @@ private fun Content( .then(WindowSceneStrategy()) .then(DialogSceneStrategy()) .then(BigDialogSceneStrategy()) - .then( - MenuSceneStrategy( - menuContent = { - LeftPanelView( - current = uiState.contentState.current, - state = uiState.menuState, - expanded = it, - onClickItem = { menu -> onAction(AppAction.SelectMenu(menu.screen)) } - ) - }, - topBarContent = { - MainScreenTopBar( - devicesState = uiState.deviceState, - appsState = uiState.appState, - recordState = uiState.recordState, - deleteApp = { onAction(AppAction.DeleteApp(it)) }, - deleteDevice = { onAction(AppAction.DeleteDevice(it)) }, - onDeviceSelected = { onAction(AppAction.SelectDevice(it)) }, - onAppSelected = { onAction(AppAction.SelectApp(it)) }, - onRecordClicked = { onAction(AppAction.Record) }, - onRestartClicked = { onAction(AppAction.Restart) }, - onTakeScreenshotClicked = { onAction(AppAction.Screenshoot) } - ) - } - ) - ) .then(SinglePaneSceneStrategy()), + sceneDecoratorStrategies = listOf( + MenuSceneStrategy( + menuContent = { + LeftPanelView( + current = uiState.contentState.current, + state = uiState.menuState, + expanded = it, + onClickItem = { menu -> onAction(AppAction.SelectMenu(menu.screen)) } + ) + }, + topBarContent = { + MainScreenTopBar( + devicesState = uiState.deviceState, + appsState = uiState.appState, + recordState = uiState.recordState, + deleteApp = { onAction(AppAction.DeleteApp(it)) }, + deleteDevice = { onAction(AppAction.DeleteDevice(it)) }, + onDeviceSelected = { onAction(AppAction.SelectDevice(it)) }, + onAppSelected = { onAction(AppAction.SelectApp(it)) }, + onRecordClicked = { onAction(AppAction.Record) }, + onRestartClicked = { onAction(AppAction.Restart) }, + onTakeScreenshotClicked = { onAction(AppAction.Screenshoot) } + ) + } + ) + ), modifier = Modifier .fillMaxSize() .background(FloconTheme.colorPalette.surface) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt index 864d3d373..aa7b29228 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/MenuScene.kt @@ -32,6 +32,8 @@ import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.navigation3.runtime.NavEntry import androidx.navigation3.scene.Scene +import androidx.navigation3.scene.SceneDecoratorStrategy +import androidx.navigation3.scene.SceneDecoratorStrategyScope import androidx.navigation3.scene.SceneStrategy import androidx.navigation3.scene.SceneStrategyScope import io.github.openflocon.flocondesktop.app.ui.view.leftpannel.PanelMaxWidth @@ -112,9 +114,9 @@ data class MenuScene( class MenuSceneStrategy( private val menuContent: @Composable (expanded: Boolean) -> Unit, private val topBarContent: @Composable (() -> Unit)? = null -) : SceneStrategy { +) : SceneDecoratorStrategy { - override fun SceneStrategyScope.calculateScene(scene: Scene): Scene { + override fun SceneDecoratorStrategyScope.decorateScene(scene: Scene): Scene { if (scene.metadata.containsKey(MENU_KEY)) { return MenuScene( scene = scene, @@ -126,8 +128,6 @@ class MenuSceneStrategy( return scene } - override fun SceneStrategyScope.calculateScene(entries: List>): Scene? = null - companion object { private const val MENU_KEY = "menu_key" diff --git a/FloconDesktop/gradle/libs.versions.toml b/FloconDesktop/gradle/libs.versions.toml index 0e0d815d4..37de3913b 100644 --- a/FloconDesktop/gradle/libs.versions.toml +++ b/FloconDesktop/gradle/libs.versions.toml @@ -40,7 +40,7 @@ sqlite = "2.6.2" ui-tooling-preview-desktop = "1.8.2" # TODO Sort -nav3Core = "1.1.0-alpha02+dev3508"#"1.0.0-alpha03" +nav3Core = "1.1.0-alpha03" material3-adaptive = "1.0.0-alpha03" kotlinxSerializationCore = "1.8.1" [libraries] diff --git a/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt b/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt index 4d1e4aef6..f3d2f239e 100644 --- a/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt +++ b/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDe import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator +import androidx.navigation3.scene.SceneDecoratorStrategy import androidx.navigation3.scene.SceneStrategy import androidx.navigation3.scene.SinglePaneSceneStrategy import androidx.navigation3.ui.NavDisplay @@ -18,6 +19,7 @@ fun FloconNavigation( navigationState: FloconNavigationState, modifier: Modifier = Modifier, sceneStrategy: SceneStrategy = SinglePaneSceneStrategy(), + sceneDecoratorStrategies: List> = emptyList(), builder: EntryProviderScope.() -> Unit ) { NavDisplay( @@ -30,6 +32,7 @@ fun FloconNavigation( rememberViewModelStoreNavEntryDecorator() ), sceneStrategy = sceneStrategy, + sceneDecoratorStrategies = sceneDecoratorStrategies, onBack = { navigationState.back(1) }, // TODO entryProvider = entryProvider { builder() From e2ef25e64c61e50c8b04bf9a0f7042dc2ad05ef8 Mon Sep 17 00:00:00 2001 From: doTTTTT Date: Wed, 25 Mar 2026 22:36:07 +0100 Subject: [PATCH 3/3] fix: Version --- .../github/openflocon/flocondesktop/app/AppScreen.kt | 12 +++++++----- FloconDesktop/gradle/libs.versions.toml | 11 +++-------- .../github/openflocon/navigation/FloconNavigation.kt | 5 +++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt index 555e75897..122d23f2d 100644 --- a/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt +++ b/FloconDesktop/composeApp/src/commonMain/kotlin/io/github/openflocon/flocondesktop/app/AppScreen.kt @@ -56,11 +56,13 @@ private fun Content( ) { FloconNavigation( navigationState = navigationState, - sceneStrategy = PanelSceneStrategy() - .then(WindowSceneStrategy()) - .then(DialogSceneStrategy()) - .then(BigDialogSceneStrategy()) - .then(SinglePaneSceneStrategy()), + sceneStrategies = listOf( + PanelSceneStrategy(), + WindowSceneStrategy(), + DialogSceneStrategy(), + BigDialogSceneStrategy(), + SinglePaneSceneStrategy() + ), sceneDecoratorStrategies = listOf( MenuSceneStrategy( menuContent = { diff --git a/FloconDesktop/gradle/libs.versions.toml b/FloconDesktop/gradle/libs.versions.toml index 37de3913b..8853e4cad 100644 --- a/FloconDesktop/gradle/libs.versions.toml +++ b/FloconDesktop/gradle/libs.versions.toml @@ -14,7 +14,7 @@ androidx-testExt = "1.3.0" buildconfig = "5.6.8" coil = "3.4.0" compose-hot-reload = "1.0.0" -compose-multiplatform = "1.10.1" +compose-multiplatform = "1.11.0-alpha04" core = "1.7.0" junit = "4.13.2" kermit = "2.0.8" @@ -23,14 +23,13 @@ kotlin = "2.3.10" kotlinx-coroutines = "1.10.2" kotlinx-datetime = "0.7.1" kotlinx-serialization = "1.9.0" -kotlinx-serialization-core = "1.8.1" ksp = "2.3.6" ktlint = "14.0.1" ktor = "3.4.1" logback = "1.5.18" material3-adaptive = "1.0.0-alpha03" multiplatform-settings = "1.3.0" -navigation3 = "1.0.0-alpha04+dev3147" +navigation3 = "1.1.0-alpha04" opencsv = "5.9" other-jsontree = "2.6.0" paging = "3.3.2" @@ -39,10 +38,6 @@ runner = "1.7.0" sqlite = "2.6.2" ui-tooling-preview-desktop = "1.8.2" -# TODO Sort -nav3Core = "1.1.0-alpha03" -material3-adaptive = "1.0.0-alpha03" -kotlinxSerializationCore = "1.8.1" [libraries] # AboutLibraries aboutlibraries-compose-core = { module = "com.mikepenz:aboutlibraries-compose-core", version.ref = "about-libraries" } @@ -96,7 +91,7 @@ kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } kotlinx-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } -kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization-core" } +kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } # Ktor diff --git a/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt b/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt index f3d2f239e..db856b293 100644 --- a/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt +++ b/FloconDesktop/navigation/src/commonMain/kotlin/io/github/openflocon/navigation/FloconNavigation.kt @@ -13,12 +13,13 @@ import androidx.navigation3.scene.SceneDecoratorStrategy import androidx.navigation3.scene.SceneStrategy import androidx.navigation3.scene.SinglePaneSceneStrategy import androidx.navigation3.ui.NavDisplay +import kotlin.collections.listOf @Composable fun FloconNavigation( navigationState: FloconNavigationState, modifier: Modifier = Modifier, - sceneStrategy: SceneStrategy = SinglePaneSceneStrategy(), + sceneStrategies: List> = listOf(SinglePaneSceneStrategy()), sceneDecoratorStrategies: List> = emptyList(), builder: EntryProviderScope.() -> Unit ) { @@ -31,7 +32,7 @@ fun FloconNavigation( rememberSaveableStateHolderNavEntryDecorator(), rememberViewModelStoreNavEntryDecorator() ), - sceneStrategy = sceneStrategy, + sceneStrategies = sceneStrategies, sceneDecoratorStrategies = sceneDecoratorStrategies, onBack = { navigationState.back(1) }, // TODO entryProvider = entryProvider {