diff --git a/orx-olive/src/main/kotlin/Olive.kt b/orx-olive/src/main/kotlin/Olive.kt index b9c673e8..f916d765 100644 --- a/orx-olive/src/main/kotlin/Olive.kt +++ b/orx-olive/src/main/kotlin/Olive.kt @@ -4,29 +4,42 @@ import org.openrndr.Extension import org.openrndr.Program import org.openrndr.draw.Session import org.openrndr.events.Event +import org.operndr.extras.filewatcher.stop import org.operndr.extras.filewatcher.watchFile import java.io.File - fun Event.saveListeners(store: MutableMap, List<(Any) -> Unit>>) { + @Suppress("UNCHECKED_CAST") store[this] = listeners.map { it } as List<(Any) -> Unit> } fun Event.restoreListeners(store: Map, List<(Any) -> Unit>>) { - listeners.retainAll(store[this]?: emptyList()) + listeners.retainAll(store[this] ?: emptyList()) } class Olive

: Extension { override var enabled: Boolean = true var session: Session? = null + + + var running = false + + internal var scriptChange: (String)->Unit = {} + var script = "src/main/kotlin/live.kts" + set(value) { + scriptChange(value) + field = value + } override fun setup(program: Program) { System.setProperty("idea.io.use.fallback", "true") System.setProperty("org.openrndr.ignoreShadeStyleErrors", "true") - val store = mutableMapOf,List<(Any)->Unit>>() + var watcher: (() -> Unit)? = null + + val store = mutableMapOf, List<(Any) -> Unit>>() val originalExtensions = program.extensions.map { it } @@ -48,15 +61,16 @@ class Olive

: Extension { 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.parentFile.mkdirs() - var className = program.javaClass.name - if (className.contains("$")) - className = "Program" - - f.writeText(""" + f.writeText(""" @file:Suppress("UNUSED_LAMBDA_EXPRESSION") import org.openrndr.Program import org.openrndr.draw.* @@ -69,27 +83,30 @@ class Olive

: Extension { } } """.trimIndent()) - } + } - program.watchFile(File(script)) { - try { + watcher = program.watchFile(File(script)) { + try { + val script = it.readText() + val func = KtsObjectLoader().load Unit>(script) - val script = it.readText() - val func = KtsObjectLoader().load Unit>(script) + program.extensions.clear() + program.extensions.addAll(originalExtensions) - program.extensions.clear() - program.extensions.addAll(originalExtensions) + trackedListeners.forEach { l -> l.restoreListeners(store) } + session?.end() - trackedListeners.forEach { it.restoreListeners(store) } - session?.end() + session = Session() + session?.start() - session = Session() - session?.start() - - func(program as P) - } catch (e: Throwable) { - e.printStackTrace() + @Suppress("UNCHECKED_CAST") + func(program as P) + } catch (e: Throwable) { + e.printStackTrace() + } } } + setupScript(script) + scriptChange = ::setupScript } } \ No newline at end of file