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