diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt index 15eb93c1..32d9d129 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/ComposeVisionRenderer.kt @@ -25,4 +25,6 @@ public interface ComposeVisionRenderer: ElementVisionRenderer { render(client, name, vision, meta) } } + + public companion object } \ No newline at end of file diff --git a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt index 68899508..82277701 100644 --- a/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt +++ b/visionforge-compose-html/src/jsMain/kotlin/space/kscience/visionforge/compose/PropertyEditor.kt @@ -49,8 +49,8 @@ public fun PropertyEditor( initialExpanded: Boolean? = null, ) { var expanded: Boolean by remember { mutableStateOf(initialExpanded ?: true) } - val descriptor: MetaDescriptor? = remember(rootDescriptor, name) { rootDescriptor?.get(name) } - var property: MutableMeta by remember { mutableStateOf(rootMeta.getOrCreate(name)) } + val descriptor: MetaDescriptor? by derivedStateOf { rootDescriptor?.get(name) } + var displayedValue by remember { mutableStateOf(rootMeta.getValue(name)) } var editorPropertyState: EditorPropertyState by remember { mutableStateOf(getPropertyState(name)) } @@ -68,13 +68,13 @@ public fun PropertyEditor( val token = name.lastOrNull()?.toString() ?: "Properties" fun update() { - property = rootMeta.getOrCreate(name) + displayedValue = rootMeta.getValue(name) editorPropertyState = getPropertyState(name) } LaunchedEffect(rootMeta) { updates.collect { updatedName -> - if (updatedName == name) { + if (name.startsWith(updatedName)) { update() } } @@ -85,6 +85,7 @@ public fun PropertyEditor( alignItems(AlignItems.Center) } }) { + //if node has children if (keys.isNotEmpty()) { Span({ classes(TreeStyles.treeCaret) @@ -110,12 +111,14 @@ public fun PropertyEditor( marginAll(1.px, 5.px) } }) { - ValueChooser(descriptor, editorPropertyState, property.value) { - property.value = it - editorPropertyState = getPropertyState(name) + ValueChooser(descriptor, editorPropertyState, displayedValue) { + rootMeta.setValue(name, it) + update() } } + } + if (!name.isEmpty()) { CloseButton(editorPropertyState != EditorPropertyState.Defined) { rootMeta.remove(name) update() diff --git a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt index b7a66625..d607f706 100644 --- a/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt +++ b/visionforge-core/src/commonMain/kotlin/space/kscience/visionforge/VisionProperties.kt @@ -1,11 +1,9 @@ package space.kscience.visionforge -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.launch import kotlinx.serialization.Transient import space.kscience.dataforge.meta.* import space.kscience.dataforge.meta.descriptors.MetaDescriptor @@ -233,15 +231,12 @@ public abstract class AbstractVisionProperties( } @Transient - protected val changesInternal: MutableSharedFlow = MutableSharedFlow() + protected val changesInternal: MutableSharedFlow = MutableSharedFlow(500, onBufferOverflow = BufferOverflow.DROP_OLDEST) override val changes: SharedFlow get() = changesInternal override fun invalidate(propertyName: Name) { //send update signal - @OptIn(DelicateCoroutinesApi::class) - (vision.manager?.context ?: GlobalScope).launch { - changesInternal.emit(propertyName) - } + changesInternal.tryEmit(propertyName) //notify children if there are any if (vision is VisionGroup) { @@ -280,8 +275,8 @@ public operator fun VisionProperties.get( /** * The root property node with given inheritance and style flags - * @param inherit - inherit properties from the [Vision] parent. If null, infer from descriptor - * @param includeStyles - include style information. If null, infer from descriptor + * @param inherit inherit properties from the [Vision] parent. If null, infer from descriptor + * @param includeStyles include style information. If null, infer from descriptor */ public fun MutableVisionProperties.root( inherit: Boolean? = null, @@ -297,22 +292,3 @@ public operator fun MutableVisionProperties.get( inherit: Boolean? = null, includeStyles: Boolean? = null, ): MutableMeta = get(name.parseAsName(), inherit, includeStyles) - -// -//public operator fun MutableVisionProperties.set(name: Name, value: Number): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: Number): Unit = -// set(name.parseAsName(), value) -// -//public operator fun MutableVisionProperties.set(name: Name, value: Boolean): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: Boolean): Unit = -// set(name.parseAsName(), value) -// -//public operator fun MutableVisionProperties.set(name: Name, value: String): Unit = -// setValue(name, value.asValue()) -// -//public operator fun MutableVisionProperties.set(name: String, value: String): Unit = -// set(name.parseAsName(), value) \ No newline at end of file