From a8a5a07dbc5c78a28e223aa4d452ceeb201e2575 Mon Sep 17 00:00:00 2001 From: Ricardo Matias Date: Tue, 19 Nov 2019 15:28:41 +0100 Subject: [PATCH] Add watching to resources folder --- orx-olive/src/main/kotlin/Olive.kt | 23 +++++++++++++++++++- orx-olive/src/main/kotlin/Resources.kt | 29 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 orx-olive/src/main/kotlin/Resources.kt diff --git a/orx-olive/src/main/kotlin/Olive.kt b/orx-olive/src/main/kotlin/Olive.kt index ba35d555..6c3da4cd 100644 --- a/orx-olive/src/main/kotlin/Olive.kt +++ b/orx-olive/src/main/kotlin/Olive.kt @@ -18,7 +18,7 @@ private fun Event.restoreListeners(store: Map, List<(Any) -> Uni listeners.retainAll(store[this] ?: emptyList()) } -class Olive

: Extension { +class Olive

(val resources: Resources? = null) : Extension { override var enabled: Boolean = true var session: Session? = null @@ -110,5 +110,26 @@ class Olive

: Extension { } setupScript(script) scriptChange = ::setupScript + + if (resources != null) { + val srcPath = "src/main/resources" + var src = File(srcPath) + + resources.watch(src) { file -> + val dest = "build/resources/main" + val filePath = file.path.split(Regex(srcPath), 2).getOrNull(1) + + val destFile = File("$dest/${filePath}").absoluteFile + + program.watchFile(file) { + if (resources[file]!! && filePath != null) { + file.copyTo(destFile, overwrite = true) + reload() + } else { + resources[file] = true + } + } + } + } } } \ No newline at end of file diff --git a/orx-olive/src/main/kotlin/Resources.kt b/orx-olive/src/main/kotlin/Resources.kt new file mode 100644 index 00000000..c64bc3fd --- /dev/null +++ b/orx-olive/src/main/kotlin/Resources.kt @@ -0,0 +1,29 @@ +package org.openrndr.extra.olive + +import java.io.File + +class Resources(val filterOutExtensions: List = listOf()) { + private val watchedResources = mutableMapOf() + + fun watch(src: File, watchFn: (file: File) -> Unit) { + src.listFiles()!!.forEach {file -> + if (file.isFile && !filterOutExtensions.contains(file.extension)) { + watchedResources[file] = false + + watchFn(file) + } else if (file.isDirectory) { + watch(file, watchFn) + } + } + } + + operator fun get(file: File): Boolean? { + return watchedResources[file] + } + + operator fun set(file: File, value: Boolean) { + if (watchedResources.containsKey(file)) { + watchedResources[file] = value + } + } +} \ No newline at end of file