Add option to change the script file (such that orx-olive can be combined with file drag/drop)
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user