Add option to change the script file (such that orx-olive can be combined with file drag/drop)

This commit is contained in:
Edwin Jakobs
2019-09-08 19:49:24 +02:00
parent f40655e113
commit 0e16b1f743

View File

@@ -4,29 +4,42 @@ import org.openrndr.Extension
import org.openrndr.Program import org.openrndr.Program
import org.openrndr.draw.Session import org.openrndr.draw.Session
import org.openrndr.events.Event import org.openrndr.events.Event
import org.operndr.extras.filewatcher.stop
import org.operndr.extras.filewatcher.watchFile import org.operndr.extras.filewatcher.watchFile
import java.io.File import java.io.File
fun <T> Event<T>.saveListeners(store: MutableMap<Event<*>, List<(Any) -> Unit>>) { fun <T> Event<T>.saveListeners(store: MutableMap<Event<*>, List<(Any) -> Unit>>) {
@Suppress("UNCHECKED_CAST")
store[this] = listeners.map { it } as List<(Any) -> Unit> store[this] = listeners.map { it } as List<(Any) -> Unit>
} }
fun <T> Event<T>.restoreListeners(store: Map<Event<*>, List<(Any) -> Unit>>) { fun <T> Event<T>.restoreListeners(store: Map<Event<*>, List<(Any) -> Unit>>) {
listeners.retainAll(store[this]?: emptyList<T>()) listeners.retainAll(store[this] ?: emptyList<T>())
} }
class Olive<P : Program> : Extension { class Olive<P : Program> : Extension {
override var enabled: Boolean = true override var enabled: Boolean = true
var session: Session? = null var session: Session? = null
var running = false
internal var scriptChange: (String)->Unit = {}
var script = "src/main/kotlin/live.kts" var script = "src/main/kotlin/live.kts"
set(value) {
scriptChange(value)
field = value
}
override fun setup(program: Program) { override fun setup(program: Program) {
System.setProperty("idea.io.use.fallback", "true") System.setProperty("idea.io.use.fallback", "true")
System.setProperty("org.openrndr.ignoreShadeStyleErrors", "true") System.setProperty("org.openrndr.ignoreShadeStyleErrors", "true")
val store = mutableMapOf<Event<*>,List<(Any)->Unit>>() var watcher: (() -> Unit)? = null
val store = mutableMapOf<Event<*>, List<(Any) -> Unit>>()
val originalExtensions = program.extensions.map { it } val originalExtensions = program.extensions.map { it }
@@ -48,15 +61,16 @@ class Olive<P : Program> : Extension {
trackedListeners.forEach { it.saveListeners(store) } trackedListeners.forEach { it.saveListeners(store) }
val f = File(script) fun setupScript(scriptFile:String) {
watcher?.stop()
val f = File(scriptFile)
if (!f.exists()) {
f.parentFile.mkdirs()
var className = program.javaClass.name
if (className.contains("$"))
className = "Program"
if (!f.exists()) { f.writeText("""
f.parentFile.mkdirs()
var className = program.javaClass.name
if (className.contains("$"))
className = "Program"
f.writeText("""
@file:Suppress("UNUSED_LAMBDA_EXPRESSION") @file:Suppress("UNUSED_LAMBDA_EXPRESSION")
import org.openrndr.Program import org.openrndr.Program
import org.openrndr.draw.* import org.openrndr.draw.*
@@ -69,27 +83,30 @@ class Olive<P : Program> : Extension {
} }
} }
""".trimIndent()) """.trimIndent())
} }
program.watchFile(File(script)) { watcher = program.watchFile(File(script)) {
try { try {
val script = it.readText()
val func = KtsObjectLoader().load<P.() -> Unit>(script)
val script = it.readText() program.extensions.clear()
val func = KtsObjectLoader().load<P.() -> Unit>(script) program.extensions.addAll(originalExtensions)
program.extensions.clear() trackedListeners.forEach { l -> l.restoreListeners(store) }
program.extensions.addAll(originalExtensions) session?.end()
trackedListeners.forEach { it.restoreListeners(store) } session = Session()
session?.end() session?.start()
session = Session() @Suppress("UNCHECKED_CAST")
session?.start() func(program as P)
} catch (e: Throwable) {
func(program as P) e.printStackTrace()
} catch (e: Throwable) { }
e.printStackTrace()
} }
} }
setupScript(script)
scriptChange = ::setupScript
} }
} }