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

: Extension { override var enabled: Boolean = true var session: Session? = null @@ -16,6 +26,28 @@ class Olive

: Extension { System.setProperty("idea.io.use.fallback", "true") System.setProperty("org.openrndr.ignoreShadeStyleErrors", "true") + val store = mutableMapOf,List<(Any)->Unit>>() + + val originalExtensions = program.extensions.map { it } + + val trackedListeners = listOf>(program.mouse.buttonDown, + program.mouse.buttonUp, + program.mouse.clicked, + program.mouse.dragged, + program.mouse.moved, + program.mouse.scrolled, + program.keyboard.keyUp, + program.keyboard.keyDown, + program.keyboard.keyRepeat, + program.window.drop, + program.window.focused, + program.window.minimized, + program.window.moved, + program.window.sized, + program.window.unfocused) + + trackedListeners.forEach { it.saveListeners(store) } + val f = File(script) if (!f.exists()) { @@ -46,22 +78,9 @@ class Olive

: Extension { val func = KtsObjectLoader().load Unit>(script) program.extensions.clear() + program.extensions.addAll(originalExtensions) - program.keyboard.keyDown.listeners.clear() - program.keyboard.keyUp.listeners.clear() - program.keyboard.character.listeners.clear() - program.keyboard.keyRepeat.listeners.clear() - program.mouse.clicked.listeners.clear() - program.mouse.buttonDown.listeners.clear() - program.mouse.dragged.listeners.clear() - program.mouse.buttonUp.listeners.clear() - program.mouse.moved.listeners.clear() - program.window.drop.listeners.clear() - program.window.focused.listeners.clear() - program.window.minimized.listeners.clear() - program.window.unfocused.listeners.clear() - program.window.restored.listeners.clear() - program.window.sized.listeners.clear() + trackedListeners.forEach { it.restoreListeners(store) } session?.end() session = Session() diff --git a/orx-olive/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory b/orx-olive/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory deleted file mode 100644 index f8f59003..00000000 --- a/orx-olive/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory +++ /dev/null @@ -1 +0,0 @@ -org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory \ No newline at end of file