Add orx-file-monitor
This commit is contained in:
@@ -39,4 +39,4 @@ For example if you want to use the `orx-no-clear` artifact one would use:
|
|||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.github.openrndr.orx:orx-no-clear:v0.0.20'
|
compile 'com.github.openrndr.orx:orx-no-clear:v0.0.20'
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
132
build.gradle
132
build.gradle
@@ -1,67 +1,67 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'org.jetbrains.kotlin.jvm' version '1.3.10'
|
id 'org.jetbrains.kotlin.jvm' version '1.3.10'
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
group 'org.openrndr.extra'
|
group 'org.openrndr.extra'
|
||||||
version '0.0.20'
|
version '0.0.22'
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
openrndrVersion = "0.3.32-rc4"
|
openrndrVersion = "0.3.33-rc1"
|
||||||
}
|
}
|
||||||
|
|
||||||
subprojects {
|
subprojects {
|
||||||
|
|
||||||
apply plugin: 'kotlin'
|
apply plugin: 'kotlin'
|
||||||
apply plugin: 'maven'
|
apply plugin: 'maven'
|
||||||
apply plugin: 'maven-publish'
|
apply plugin: 'maven-publish'
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven {
|
maven {
|
||||||
url = "https://dl.bintray.com/openrndr/openrndr"
|
url = "https://dl.bintray.com/openrndr/openrndr"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile "org.openrndr:openrndr-core:$openrndrVersion"
|
compile "org.openrndr:openrndr-core:$openrndrVersion"
|
||||||
compile "org.openrndr:openrndr-filter:$openrndrVersion"
|
compile "org.openrndr:openrndr-filter:$openrndrVersion"
|
||||||
compile "org.openrndr:openrndr-shape:$openrndrVersion"
|
compile "org.openrndr:openrndr-shape:$openrndrVersion"
|
||||||
compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: '1.0.1'
|
compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: '1.0.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
publications {
|
publications {
|
||||||
mavenJava(MavenPublication) {
|
mavenJava(MavenPublication) {
|
||||||
from components.java
|
from components.java
|
||||||
|
|
||||||
artifact sourceJar
|
artifact sourceJar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task sourceJar(type: Jar) {
|
task sourceJar(type: Jar) {
|
||||||
classifier = 'sources'
|
classifier = 'sources'
|
||||||
from sourceSets.main.kotlin
|
from sourceSets.main.kotlin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
||||||
}
|
}
|
||||||
|
|
||||||
compileKotlin {
|
compileKotlin {
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
kotlinOptions.jvmTarget = "1.8"
|
||||||
}
|
}
|
||||||
compileTestKotlin {
|
compileTestKotlin {
|
||||||
kotlinOptions.jvmTarget = "1.8"
|
kotlinOptions.jvmTarget = "1.8"
|
||||||
}
|
}
|
||||||
37
orx-file-watcher/README.md
Normal file
37
orx-file-watcher/README.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# orx-file-watcher
|
||||||
|
|
||||||
|
A file watcher for OPENRNDR
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Monitoring a single file.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
application {
|
||||||
|
program {
|
||||||
|
val watchedText = watchFile(File("someFile.txt")) {
|
||||||
|
it.readText()
|
||||||
|
}
|
||||||
|
extend {
|
||||||
|
val theText = watchedText()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Making a map of monitored files.
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
application {
|
||||||
|
program {
|
||||||
|
val watchedTexts = mutableMap<String, ()->String>()
|
||||||
|
watchedTexts["text"] = watchFile(File("someFile.txt")) {
|
||||||
|
it.readText()
|
||||||
|
}
|
||||||
|
|
||||||
|
extend {
|
||||||
|
val theText = watchedTexts.getValue("text")()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
93
orx-file-watcher/src/main/kotlin/FileWatcher.kt
Normal file
93
orx-file-watcher/src/main/kotlin/FileWatcher.kt
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package org.operndr.extras.filewatcher
|
||||||
|
|
||||||
|
import com.sun.nio.file.SensitivityWatchEventModifier
|
||||||
|
import org.openrndr.Program
|
||||||
|
import org.openrndr.launch
|
||||||
|
import java.io.File
|
||||||
|
import java.nio.file.FileSystems
|
||||||
|
import java.nio.file.Path
|
||||||
|
import java.nio.file.StandardWatchEventKinds
|
||||||
|
import java.nio.file.WatchKey
|
||||||
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
|
class FileWatcher(private val program: Program, val file: File, private val onChange: (File) -> Unit) {
|
||||||
|
init {
|
||||||
|
watchThread
|
||||||
|
val path = file.absoluteFile.toPath()
|
||||||
|
val parent = path.parent
|
||||||
|
val key = pathKeys.getOrPut(parent) {
|
||||||
|
parent.register(
|
||||||
|
watchService, arrayOf(StandardWatchEventKinds.ENTRY_MODIFY),
|
||||||
|
SensitivityWatchEventModifier.HIGH
|
||||||
|
)
|
||||||
|
}
|
||||||
|
watching.getOrPut(path) {
|
||||||
|
mutableListOf()
|
||||||
|
}.add(this)
|
||||||
|
keyPaths.getOrPut(key) { parent }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun triggerChange() {
|
||||||
|
program.launch {
|
||||||
|
onChange(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> watchFile(program: Program, file: File, transducer: (File) -> T): () -> T {
|
||||||
|
var result = transducer(file)
|
||||||
|
FileWatcher(program, file) {
|
||||||
|
try {
|
||||||
|
result = transducer(file)
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmName("programWatchFile")
|
||||||
|
fun <T> Program.watchFile(file: File, transducer: (File) -> T): () -> T = watchFile(this, file, transducer)
|
||||||
|
|
||||||
|
private val watching = mutableMapOf<Path, MutableList<FileWatcher>>()
|
||||||
|
private val pathKeys = mutableMapOf<Path, WatchKey>()
|
||||||
|
private val keyPaths = mutableMapOf<WatchKey, Path>()
|
||||||
|
|
||||||
|
private val watchService by lazy {
|
||||||
|
FileSystems.getDefault().newWatchService()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val watchThread by lazy {
|
||||||
|
thread(isDaemon = true) {
|
||||||
|
while (true) {
|
||||||
|
val key = watchService.take()
|
||||||
|
val path = keyPaths[key]
|
||||||
|
key.pollEvents().forEach {
|
||||||
|
val contextPath = it.context() as Path
|
||||||
|
val fullPath = path?.resolve(contextPath)
|
||||||
|
watching[fullPath]?.forEach {
|
||||||
|
|
||||||
|
it.triggerChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
key.reset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
val a = watchFile(Program(), File("README.md")) {
|
||||||
|
it.readText()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
println(a())
|
||||||
|
Thread.sleep(2000)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -2,6 +2,7 @@ rootProject.name = 'orx'
|
|||||||
|
|
||||||
include 'orx-camera',
|
include 'orx-camera',
|
||||||
'orx-compositor',
|
'orx-compositor',
|
||||||
|
'orx-file-watcher',
|
||||||
'orx-filter-extension',
|
'orx-filter-extension',
|
||||||
'orx-integral-image',
|
'orx-integral-image',
|
||||||
'orx-jumpflood',
|
'orx-jumpflood',
|
||||||
@@ -13,3 +14,4 @@ include 'orx-camera',
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user