From 8413cf7ae7645b435126c6a42711f6c664ab9253 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 19 Dec 2024 15:22:01 +0100 Subject: [PATCH] Reintroduce Compose State to AppState --- .../java/com/kernelmaft/zanbur/app-state.kt | 27 ++++++++++--------- .../main/java/com/kernelmaft/zanbur/main.kt | 11 +++----- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt index 52c4991..ae77a76 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/app-state.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/app-state.kt @@ -1,25 +1,26 @@ package com.kernelmaft.zanbur +import androidx.compose.runtime.* + object AppState { - val groups : List get () = groupsAsMutable - private var groupsAsMutable : List = emptyList () - - private val subscribers : MutableList < ( List ) -> Unit > = mutableListOf () - - fun subscribe ( subscriber : ( List ) -> Unit ) = subscribers . add (subscriber) - - fun addGroup ( group : Group ) { - groupsAsMutable += group - subscribers . forEach { it (groups) } - } + // The index of a group in this list is always equal to its ID + val groups : State < List > get () = groupsAsMutable + private val groupsAsMutable : MutableState < List > = mutableStateOf ( emptyList () ) fun setCurrentScene ( groupId : Int , scene : Scene ) { - groupsAsMutable = groupsAsMutable . mapIndexed { index , group -> + groupsAsMutable . value = groupsAsMutable . value . mapIndexed { index , group -> if ( index == groupId ) group . copy ( currentScene = scene ) else group } - subscribers . forEach { it (groups) } + } + + fun addGroup ( group : Group ) { + val newGroups = groupsAsMutable . value . toMutableList () + // Wow this is sooo much better than Java + if ( newGroups . getOrNull ( group . id ) != null ) newGroups . removeAt ( group . id ) + newGroups . add ( group . id , group ) + groupsAsMutable . value = newGroups } } diff --git a/app/src/main/java/com/kernelmaft/zanbur/main.kt b/app/src/main/java/com/kernelmaft/zanbur/main.kt index 13339d4..5e5a914 100644 --- a/app/src/main/java/com/kernelmaft/zanbur/main.kt +++ b/app/src/main/java/com/kernelmaft/zanbur/main.kt @@ -3,7 +3,6 @@ package com.kernelmaft.zanbur import android.os.* import androidx.activity.compose.* import androidx.compose.foundation.layout.* -import androidx.compose.runtime.* import androidx.compose.ui.* import androidx.compose.ui.unit.* import androidx.datastore.preferences.* @@ -23,14 +22,12 @@ class MainActivity : EdgeToEdgeActivity () { Config . groups . forEach { AppState . addGroup (it) } - val groups = mutableStateOf ( AppState . groups ) - AppState . subscribe { groups . value = it } - lifecycleScope . launch (IO) { val prefs = dataStore . data . firstOrNull () val savedSceneName = prefs ?. get ( stringPreferencesKey ("scene") ) if ( savedSceneName != null ) { - val savedScene = AppState . groups [0] . scenes . find { it . name == savedSceneName } + val savedScene = AppState . groups . value [0] . scenes + . find { it . name == savedSceneName } savedScene ?. let { AppState . setCurrentScene ( 0 , it ) } } } @@ -38,7 +35,7 @@ class MainActivity : EdgeToEdgeActivity () { setContent { AppFrame { Column ( Modifier . width ( 300 . dp ) ) { - groups . value . forEach { group -> + AppState . groups . value . forEach { group -> SceneSwitcher (group) { newScene -> AppState . setCurrentScene ( group . id , newScene ) publishSceneChange ( group , newScene ) @@ -54,7 +51,7 @@ class MainActivity : EdgeToEdgeActivity () { override fun onStop () { super . onStop () - val currentScene = AppState . groups [0] . currentScene + val currentScene = AppState . groups . value [0] . currentScene if ( currentScene != null ) lifecycleScope . launch (IO) { dataStore . edit { it [ stringPreferencesKey ("scene") ] = currentScene . name