Skip to content

Commit 25983b5

Browse files
committed
Add operator setValue to StoryParameterDelegate to allow changing its state in Story code
1 parent 977b4d9 commit 25983b5

File tree

4 files changed

+14
-15
lines changed

4 files changed

+14
-15
lines changed

gallery-demo/src/commonMain/kotlin/storytale/gallery/demo/Simple inputs.story.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import androidx.compose.material3.Checkbox
88
import androidx.compose.material3.MaterialTheme
99
import androidx.compose.material3.Switch
1010
import androidx.compose.material3.Text
11-
import androidx.compose.runtime.mutableStateOf
12-
import androidx.compose.runtime.remember
1311
import org.jetbrains.compose.storytale.story
1412

1513
val Button by story {
@@ -29,11 +27,11 @@ val Button by story {
2927
}
3028

3129
val Checkbox by story {
32-
val checked = remember { mutableStateOf(false) }
33-
Checkbox(checked.value, onCheckedChange = { checked.value = it })
30+
var checked by parameter(false)
31+
Checkbox(checked, onCheckedChange = { checked = it })
3432
}
3533

3634
val Switch by story {
37-
val checked = remember { mutableStateOf(false) }
38-
Switch(checked.value, onCheckedChange = { checked.value = it })
35+
var checked by parameter(false)
36+
Switch(checked, onCheckedChange = { checked = it })
3937
}

modules/runtime-api/src/commonMain/kotlin/org/jetbrains/compose/storytale/Story.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,5 @@ data class Story(
1313
internal val nameToParameterMapping = linkedMapOf<String, StoryParameter<*>>() // using linkedMap to keep the order
1414
val parameters inline get() = nameToParameterMapping.values.toList()
1515

16-
@Composable
1716
inline fun <reified T> parameter(defaultValue: T) = StoryParameterDelegate(this, T::class, defaultValue)
1817
}

modules/runtime-api/src/commonMain/kotlin/org/jetbrains/compose/storytale/StoryParameter.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package org.jetbrains.compose.storytale
22

3-
import androidx.compose.runtime.Composable
43
import androidx.compose.runtime.MutableState
54
import kotlin.reflect.KClass
65

76
class StoryParameter<T>(
87
val name: String,
98
val type: KClass<*>,
10-
private val initializeMutableState: @Composable () -> MutableState<T>,
9+
private val initializeMutableState: () -> MutableState<T>,
1110
) {
1211
private var _state: MutableState<T>? = null
1312
val state: MutableState<T>
14-
@Composable get() {
13+
get() {
1514
var state = _state
1615
if (state == null) {
1716
state = initializeMutableState()
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package org.jetbrains.compose.storytale
22

3-
import androidx.compose.runtime.Composable
3+
import androidx.compose.runtime.MutableState
44
import androidx.compose.runtime.mutableStateOf
5-
import androidx.compose.runtime.remember
65
import kotlin.reflect.KClass
76
import kotlin.reflect.KProperty
87

@@ -11,13 +10,17 @@ class StoryParameterDelegate<T>(
1110
private val type: KClass<*>,
1211
private val defaultValue: T,
1312
) {
14-
@Composable
13+
@Suppress("UNCHECKED_CAST")
1514
operator fun getValue(thisRef: Any?, property: KProperty<*>): T = story.nameToParameterMapping.getValue(property.name).state.value as T
1615

17-
@Composable
16+
@Suppress("UNCHECKED_CAST")
17+
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
18+
(story.nameToParameterMapping.getValue(property.name).state as MutableState<T>).value = value
19+
}
20+
1821
operator fun provideDelegate(thisRef: Any?, property: KProperty<*>) = also {
1922
story.nameToParameterMapping.getOrPut(property.name) {
20-
StoryParameter(property.name, type) { remember { mutableStateOf(defaultValue) } }
23+
StoryParameter(property.name, type) { mutableStateOf(defaultValue) }
2124
}
2225
}
2326
}

0 commit comments

Comments
 (0)