From 3528d35cbf55f1c3d87ff39fca60ab4ddab021f3 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Mon, 6 Jul 2020 13:23:13 +0200 Subject: [PATCH] [orx-panel] Rename WatchDiv to WatchListDiv, add WatchPropertyDiv --- orx-panel/src/demo/kotlin/DemoWatchDiv01.kt | 4 +- .../elements/{WatchDiv.kt => WatchListDiv.kt} | 6 +- .../panel/elements/WatchPropertyDiv.kt | 75 +++++++++++++++++++ 3 files changed, 80 insertions(+), 5 deletions(-) rename orx-panel/src/main/kotlin/org/openrndr/panel/elements/{WatchDiv.kt => WatchListDiv.kt} (84%) create mode 100644 orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt diff --git a/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt b/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt index 83489a70..a4a3700b 100644 --- a/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt +++ b/orx-panel/src/demo/kotlin/DemoWatchDiv01.kt @@ -113,8 +113,8 @@ fun main() = application { } } - watchDiv("matrix", watchList = programState.matrix) { row -> - watchDiv("row", watchList = row) { item -> + watchListDiv("matrix", watchList = programState.matrix) { row -> + watchListDiv("row", watchList = row) { item -> this.id = "some-row" slider { label = "value" diff --git a/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchDiv.kt b/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt similarity index 84% rename from orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchDiv.kt rename to orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt index 46fd45e5..c52731ba 100644 --- a/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchDiv.kt +++ b/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchListDiv.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.yield import org.openrndr.draw.Drawer import org.openrndr.launch -class WatchDiv(private val watchList: List, private val builder: WatchDiv.(T) -> Unit) : Div(), DisposableElement { +class WatchListDiv(private val watchList: List, private val builder: WatchListDiv.(T) -> Unit) : Div(), DisposableElement { override var disposed: Boolean = false private var listState = emptyList() private var watchJob: Job? = null @@ -62,8 +62,8 @@ class WatchDiv(private val watchList: List, private val builder: Wat } } -fun Element.watchDiv(vararg classes: String, watchList: List, builder: WatchDiv.(T) -> Unit) { - val wd = WatchDiv(watchList, builder) +fun Element.watchListDiv(vararg classes: String, watchList: List, builder: WatchListDiv.(T) -> Unit) { + val wd = WatchListDiv(watchList, builder) wd.classes.addAll(classes.map { ElementClass(it) }) this.append(wd) wd.regenerate() diff --git a/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt b/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt new file mode 100644 index 00000000..b890dd78 --- /dev/null +++ b/orx-panel/src/main/kotlin/org/openrndr/panel/elements/WatchPropertyDiv.kt @@ -0,0 +1,75 @@ +package org.openrndr.panel.elements + +import kotlinx.coroutines.Job +import kotlinx.coroutines.yield +import org.openrndr.draw.Drawer +import org.openrndr.launch +import org.openrndr.panel.elements.* +import kotlin.reflect.KMutableProperty0 + +class WatchPropertyDiv( + private val watchProperty: KMutableProperty0, + private val builder: WatchPropertyDiv.(T) -> Unit +) : Div(), + DisposableElement { + override var disposed: Boolean = false + private var propertyState = watchProperty.get() + private var watchJob: Job? = null + + + override fun dispose() { + super.dispose() + for (child in children) { + child.parent = null + (child as? DisposableElement)?.dispose() + } + children.clear() + } + + fun regenerate(force: Boolean = false) { + var regenerate = force + if (watchProperty.get() != propertyState) { + regenerate = true + } + + if (regenerate) { + for (child in children) { + child.parent = null + (child as? DisposableElement)?.dispose() + } + propertyState = watchProperty.get() + children.clear() + builder(propertyState) + + requestRedraw() + } + } + + fun checkJob() { + if (watchJob == null) { + watchJob = (root() as? Body)?.controlManager?.program?.launch { + while (!disposed) { + regenerate() + yield() + } + } + } + } + + override fun draw(drawer: Drawer) { + checkJob() + super.draw(drawer) + } +} + +fun Element.watchPropertyDiv( + vararg classes: String, + watchProperty: KMutableProperty0, + builder: WatchPropertyDiv.(T) -> Unit +) { + val wd = WatchPropertyDiv(watchProperty, builder) + wd.classes.addAll(classes.map { ElementClass(it) }) + this.append(wd) + wd.regenerate(true) + wd.checkJob() +}