Upgrade to OPENRNDR 0.4 snapshot
This commit is contained in:
1
orx-jvm/orx-rabbit-control/.gitignore
vendored
Normal file
1
orx-jvm/orx-rabbit-control/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.DS_Store
|
||||
19
orx-jvm/orx-rabbit-control/README.md
Normal file
19
orx-jvm/orx-rabbit-control/README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# orx-rabbit-control
|
||||
|
||||
Automatically creates a remote UI to control your OPENRNDR program from a mobile device or a different computer. Alternative to `orx-gui`.
|
||||
|
||||
`orx-rabbit-control` uses `orx-parameters` annotations to generate a control interface, just like `orx-gui`.
|
||||
|
||||
<a href="http://rabbitcontrol.cc">
|
||||
<img src="http://rabbitcontrol.cc/carrot-sketch-c-trans.png" width="50px">
|
||||
</a>
|
||||
|
||||
For examples, check out the [demo](./src/demo/kotlin) folder.
|
||||
|
||||
|
||||
|
||||
### Using the web client
|
||||
|
||||
Go to [client.rabbitcontrol.cc](http://client.rabbitcontrol.cc) and enter your IP-address and port.
|
||||
|
||||
More Info about the web client: [rabbitcontrol.cc/apps/webclient/](http://rabbitcontrol.cc/apps/webclient/)
|
||||
25
orx-jvm/orx-rabbit-control/build.gradle
Normal file
25
orx-jvm/orx-rabbit-control/build.gradle
Normal file
@@ -0,0 +1,25 @@
|
||||
sourceSets {
|
||||
demo {
|
||||
java {
|
||||
srcDirs = ["src/demo/kotlin"]
|
||||
compileClasspath += main.getCompileClasspath()
|
||||
runtimeClasspath += main.getRuntimeClasspath()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api project(":orx-parameters")
|
||||
api project(":orx-compositor")
|
||||
api project(":orx-image-fit")
|
||||
|
||||
implementation "cc.rabbitcontrol:rcp:0.3.26"
|
||||
implementation "com.google.zxing:core:3.4.0"
|
||||
implementation "com.google.zxing:javase:3.4.0"
|
||||
implementation "io.ktor:ktor-server-netty:1.3.2"
|
||||
|
||||
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
|
||||
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
|
||||
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
|
||||
demoImplementation(sourceSets.getByName("main").output)
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import org.openrndr.application
|
||||
import org.openrndr.color.ColorRGBa
|
||||
import org.openrndr.draw.loadFont
|
||||
import org.openrndr.extensions.SingleScreenshot
|
||||
import org.openrndr.extra.parameters.*
|
||||
import org.openrndr.math.Vector2
|
||||
import org.openrndr.math.Vector3
|
||||
import org.openrndr.math.Vector4
|
||||
|
||||
|
||||
suspend fun main() = application {
|
||||
configure {
|
||||
width = 800
|
||||
height = 800
|
||||
}
|
||||
|
||||
program {
|
||||
// -- this block is for automation purposes only
|
||||
if (System.getProperty("takeScreenshot") == "true") {
|
||||
extend(SingleScreenshot()) {
|
||||
this.outputFile = System.getProperty("screenshotPath")
|
||||
}
|
||||
}
|
||||
|
||||
val rabbit = RabbitControlServer()
|
||||
val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0)
|
||||
val settings = object {
|
||||
@TextParameter("A string")
|
||||
var s: String = "Hello"
|
||||
|
||||
@DoubleParameter("A double", 0.0, 10.0)
|
||||
var d: Double = 10.0
|
||||
|
||||
@BooleanParameter("A bool")
|
||||
var b: Boolean = true
|
||||
|
||||
@ColorParameter("A fill color")
|
||||
var fill = ColorRGBa.PINK
|
||||
|
||||
@ColorParameter("A stroke color")
|
||||
var stroke = ColorRGBa.WHITE
|
||||
|
||||
@Vector2Parameter("A vector2")
|
||||
var v2 = Vector2(200.0,200.0)
|
||||
|
||||
@Vector3Parameter("A vector3")
|
||||
var v3 = Vector3(200.0, 200.0, 200.0)
|
||||
|
||||
@Vector4Parameter("A vector4")
|
||||
var v4 = Vector4(200.0, 200.0, 200.0, 200.0)
|
||||
|
||||
@ActionParameter("Action test")
|
||||
fun clicked() {
|
||||
println("Clicked from RabbitControl")
|
||||
}
|
||||
}
|
||||
|
||||
rabbit.add(settings)
|
||||
extend(rabbit)
|
||||
extend {
|
||||
drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK)
|
||||
drawer.fontMap = font
|
||||
drawer.fill = settings.fill
|
||||
drawer.stroke = settings.stroke
|
||||
drawer.circle(settings.v2, settings.d)
|
||||
drawer.text(settings.s, 10.0, 20.0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
import org.openrndr.KEY_HOME
|
||||
import org.openrndr.application
|
||||
import org.openrndr.color.ColorRGBa
|
||||
import org.openrndr.extensions.SingleScreenshot
|
||||
import org.openrndr.extra.parameters.*
|
||||
|
||||
|
||||
suspend fun main() = application {
|
||||
configure {
|
||||
width = 800
|
||||
height = 800
|
||||
}
|
||||
|
||||
program {
|
||||
// -- this block is for automation purposes only
|
||||
if (System.getProperty("takeScreenshot") == "true") {
|
||||
extend(SingleScreenshot()) {
|
||||
this.outputFile = System.getProperty("screenshotPath")
|
||||
}
|
||||
}
|
||||
|
||||
val rabbit = RabbitControlServer(showQRUntilClientConnects = false)
|
||||
|
||||
val settings = object {
|
||||
@BooleanParameter("White on black")
|
||||
var whiteOnBlack: Boolean = true
|
||||
}
|
||||
|
||||
rabbit.add(settings)
|
||||
extend(rabbit)
|
||||
|
||||
/**
|
||||
* Example: only show the QR code when the [KEY_HOME] button is pressed
|
||||
*/
|
||||
keyboard.keyDown.listen {
|
||||
when (it.key) {
|
||||
KEY_HOME -> rabbit.showQRCode = true
|
||||
}
|
||||
}
|
||||
|
||||
keyboard.keyUp.listen {
|
||||
when (it.key) {
|
||||
KEY_HOME -> rabbit.showQRCode = false
|
||||
}
|
||||
}
|
||||
|
||||
extend {
|
||||
drawer.clear(if (settings.whiteOnBlack) ColorRGBa.BLACK else ColorRGBa.WHITE)
|
||||
drawer.fill = if (settings.whiteOnBlack) ColorRGBa.WHITE else ColorRGBa.BLACK
|
||||
drawer.circle(drawer.bounds.center, 250.0)
|
||||
}
|
||||
}
|
||||
}
|
||||
76
orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt
Normal file
76
orx-jvm/orx-rabbit-control/src/demo/kotlin/DemoRabbitHole.kt
Normal file
@@ -0,0 +1,76 @@
|
||||
import org.openrndr.application
|
||||
import org.openrndr.color.ColorRGBa
|
||||
import org.openrndr.draw.loadFont
|
||||
import org.openrndr.extensions.SingleScreenshot
|
||||
import org.openrndr.extra.parameters.*
|
||||
import org.openrndr.math.Vector2
|
||||
import org.openrndr.math.Vector3
|
||||
import org.openrndr.math.Vector4
|
||||
|
||||
|
||||
suspend fun main() = application {
|
||||
configure {
|
||||
width = 800
|
||||
height = 800
|
||||
}
|
||||
|
||||
program {
|
||||
// -- this block is for automation purposes only
|
||||
if (System.getProperty("takeScreenshot") == "true") {
|
||||
extend(SingleScreenshot()) {
|
||||
this.outputFile = System.getProperty("screenshotPath")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start RabbitControlServer with a Rabbithole with key 'orxtest'
|
||||
* Please visit https://rabbithole.rabbitcontrol.cc for more information.
|
||||
*
|
||||
* Rabbithole allows you to access your exposed parameter from the internet.
|
||||
* To use it with this example just use 'orxtest' as tunnel-name on the main page.
|
||||
*/
|
||||
val rabbit = RabbitControlServer(false, 10000, 8080, "wss://rabbithole.rabbitcontrol.cc/public/rcpserver/connect?key=orxtest")
|
||||
val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 20.0)
|
||||
val settings = object {
|
||||
@TextParameter("A string")
|
||||
var s: String = "Hello"
|
||||
|
||||
@DoubleParameter("A double", 0.0, 10.0)
|
||||
var d: Double = 10.0
|
||||
|
||||
@BooleanParameter("A bool")
|
||||
var b: Boolean = true
|
||||
|
||||
@ColorParameter("A fill color")
|
||||
var fill = ColorRGBa.PINK
|
||||
|
||||
@ColorParameter("A stroke color")
|
||||
var stroke = ColorRGBa.WHITE
|
||||
|
||||
@Vector2Parameter("A vector2")
|
||||
var v2 = Vector2(200.0,200.0)
|
||||
|
||||
@Vector3Parameter("A vector3")
|
||||
var v3 = Vector3(200.0, 200.0, 200.0)
|
||||
|
||||
@Vector4Parameter("A vector4")
|
||||
var v4 = Vector4(200.0, 200.0, 200.0, 200.0)
|
||||
|
||||
@ActionParameter("Action test")
|
||||
fun clicked() {
|
||||
println("Clicked from RabbitControl")
|
||||
}
|
||||
}
|
||||
|
||||
rabbit.add(settings)
|
||||
extend(rabbit)
|
||||
extend {
|
||||
drawer.clear(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK)
|
||||
drawer.fontMap = font
|
||||
drawer.fill = settings.fill
|
||||
drawer.stroke = settings.stroke
|
||||
drawer.circle(settings.v2, settings.d)
|
||||
drawer.text(settings.s, 10.0, 20.0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,291 @@
|
||||
import com.google.zxing.BarcodeFormat
|
||||
import com.google.zxing.qrcode.QRCodeWriter
|
||||
import io.ktor.http.content.resources
|
||||
import io.ktor.http.content.static
|
||||
import io.ktor.routing.routing
|
||||
import io.ktor.server.engine.*
|
||||
import io.ktor.server.netty.*
|
||||
import org.openrndr.Extension
|
||||
import org.openrndr.Program
|
||||
import org.openrndr.color.ColorRGBa
|
||||
import org.openrndr.draw.*
|
||||
import org.openrndr.extra.compositor.*
|
||||
import org.openrndr.extra.fx.blend.Darken
|
||||
import org.openrndr.extra.parameters.Parameter
|
||||
import org.openrndr.extra.parameters.ParameterType
|
||||
import org.openrndr.extra.parameters.listParameters
|
||||
import org.openrndr.extras.imageFit.FitMethod
|
||||
import org.openrndr.extras.imageFit.imageFit
|
||||
import org.openrndr.math.Vector2
|
||||
import org.openrndr.math.Vector3
|
||||
import org.openrndr.math.Vector4
|
||||
import org.openrndr.math.mix
|
||||
import org.rabbitcontrol.rcp.RCPServer
|
||||
import org.rabbitcontrol.rcp.model.interfaces.IParameter
|
||||
import org.rabbitcontrol.rcp.model.parameter.*
|
||||
import org.rabbitcontrol.rcp.transport.websocket.server.RabbitHoleWsServerTransporterNetty
|
||||
import org.rabbitcontrol.rcp.transport.websocket.server.WebsocketServerTransporterNetty
|
||||
import java.awt.Color
|
||||
import java.net.InetSocketAddress
|
||||
import java.net.Socket
|
||||
import java.net.URI
|
||||
import java.net.URISyntaxException
|
||||
import kotlin.reflect.KMutableProperty1
|
||||
|
||||
|
||||
class RabbitControlServer(private val showQRUntilClientConnects: Boolean = true, rcpPort: Int =
|
||||
10000, staticFilesPort: Int = 8080, rabbithole: String = "") : Extension {
|
||||
private val rabbitServer = RCPServer()
|
||||
private val transporter = WebsocketServerTransporterNetty()
|
||||
private var rabbitholeTransporter: RabbitHoleWsServerTransporterNetty? = null
|
||||
private var webServer: NettyApplicationEngine? = null
|
||||
|
||||
private var parameterMap = mutableMapOf<IParameter, Pair<Any, Parameter>>()
|
||||
|
||||
private var qrCodeImage: ColorBuffer? = null
|
||||
private var qrOverlayComposition: Composite? = null
|
||||
|
||||
|
||||
/**
|
||||
* Animate the opacity to make it look smooooth
|
||||
*/
|
||||
private var currentOpacity = 0.0
|
||||
|
||||
private val targetOpacity: Double
|
||||
get() = if (shouldShowQR) 0.8 else 0.0
|
||||
|
||||
private val shouldShowQR
|
||||
get() = (rabbitServer.connectionCount == 0 && showQRUntilClientConnects) || showQRCode
|
||||
|
||||
|
||||
/**
|
||||
* Used to manually show and hide the QR code and override the default
|
||||
* behaviour of (only) showing the code when no clients are connected
|
||||
*/
|
||||
var showQRCode = false
|
||||
|
||||
init {
|
||||
rabbitServer.addTransporter(transporter)
|
||||
transporter.bind(rcpPort)
|
||||
|
||||
/**
|
||||
* add rabbithole transporter
|
||||
*/
|
||||
if (rabbithole.isNotEmpty()) {
|
||||
try {
|
||||
val rhlTransporter = RabbitHoleWsServerTransporterNetty(URI(rabbithole))
|
||||
rabbitServer.addTransporter(rhlTransporter)
|
||||
rhlTransporter.bind(0)
|
||||
rabbitholeTransporter = rhlTransporter
|
||||
} catch (e: URISyntaxException) {
|
||||
//
|
||||
println("invalid URI for rabbithole: $rabbithole")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start KTOR to serve the static files of the RabbitControl client
|
||||
*/
|
||||
val server = embeddedServer(Netty, port = staticFilesPort) {
|
||||
routing {
|
||||
static("/rabbit-client") {
|
||||
resources("rabbit-client")
|
||||
}
|
||||
}
|
||||
}
|
||||
server.start()
|
||||
webServer = server
|
||||
|
||||
/**
|
||||
* Print the address
|
||||
*/
|
||||
val socket = Socket()
|
||||
socket.connect(InetSocketAddress("google.com", 80))
|
||||
val ip = socket.localAddress.toString().replace("/", "")
|
||||
val clientUrlWithHash = "http://$ip:$staticFilesPort/rabbit-client/index.html/#$ip:$rcpPort"
|
||||
qrCodeImage = getQRCodeImage(barcodeText = clientUrlWithHash)
|
||||
println("RabbitControl Web Client: $clientUrlWithHash")
|
||||
|
||||
/**
|
||||
* Update the object when it has been updated in RabbitControl
|
||||
*/
|
||||
rabbitServer.setUpdateListener {
|
||||
val (obj, orxParameter) = parameterMap[it]!!
|
||||
when(it) {
|
||||
is Int32Parameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, v)
|
||||
}
|
||||
is Float64Parameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, v)
|
||||
}
|
||||
is BooleanParameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, v)
|
||||
}
|
||||
is StringParameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, v)
|
||||
}
|
||||
is RGBAParameter -> {
|
||||
val c = it.value
|
||||
val cc = ColorRGBa(c.red.toDouble() / 255.0, c.green.toDouble() / 255.0, c.blue.toDouble() / 255.0, c.alpha.toDouble() / 255.0)
|
||||
orxParameter.property.qset(obj, cc)
|
||||
}
|
||||
is Vector2Float32Parameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, Vector2(v.x.toDouble(), v.y.toDouble()))
|
||||
}
|
||||
is Vector3Float32Parameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, Vector3(v.x.toDouble(), v.y.toDouble(), v.z.toDouble()))
|
||||
}
|
||||
is Vector4Float32Parameter -> {
|
||||
val v = it.value
|
||||
orxParameter.property.qset(obj, Vector4(v.x.toDouble(), v.y.toDouble(), v.z.toDouble(), v.t.toDouble()))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun setup(program: Program) {
|
||||
/**
|
||||
* Creating the Composite for the overlay needs to happen in setup(),
|
||||
* as we need access to [Program.drawer]
|
||||
*/
|
||||
qrOverlayComposition = compose {
|
||||
layer {
|
||||
draw {
|
||||
program.drawer.isolated {
|
||||
fill = ColorRGBa.WHITE.opacify(currentOpacity)
|
||||
stroke = null
|
||||
rectangle(0.0,0.0, width.toDouble(), height.toDouble())
|
||||
}
|
||||
}
|
||||
|
||||
layer {
|
||||
blend(Darken()) {
|
||||
clip = true
|
||||
}
|
||||
|
||||
draw {
|
||||
qrCodeImage?.let {
|
||||
program.drawer.imageFit(it, program.width / 4.0,program.height / 4.0, program.width * .5, program.height * .5, 0.0,0.0, FitMethod.Contain)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun add(objectWithParameters: Any) {
|
||||
val parameters = objectWithParameters.listParameters()
|
||||
|
||||
parameters.forEach {
|
||||
val rabbitParam = when (it.parameterType) {
|
||||
ParameterType.Int -> {
|
||||
val param = rabbitServer.createInt32Parameter(it.label)
|
||||
param.value = (it.property as KMutableProperty1<Any, Int>).get(objectWithParameters)
|
||||
param
|
||||
}
|
||||
ParameterType.Double -> {
|
||||
val param = rabbitServer.createFloat64Parameter(it.label)
|
||||
param.value = (it.property as KMutableProperty1<Any, Double>).get(objectWithParameters)
|
||||
param
|
||||
}
|
||||
ParameterType.Action -> {
|
||||
val param = rabbitServer.createBangParameter(it.label)
|
||||
param.setFunction {
|
||||
it.function!!.call(objectWithParameters)
|
||||
}
|
||||
param
|
||||
}
|
||||
ParameterType.Boolean -> {
|
||||
val param = rabbitServer.createBooleanParameter(it.label)
|
||||
param.value = (it.property as KMutableProperty1<Any, Boolean>).get(objectWithParameters)
|
||||
param
|
||||
}
|
||||
ParameterType.Text -> {
|
||||
val param =rabbitServer.createStringParameter(it.label)
|
||||
param.value = (it.property as KMutableProperty1<Any, String>).get(objectWithParameters)
|
||||
param
|
||||
}
|
||||
ParameterType.Color -> {
|
||||
val param = rabbitServer.createRGBAParameter(it.label)
|
||||
val c = (it.property as KMutableProperty1<Any, ColorRGBa>).get(objectWithParameters)
|
||||
param.value = Color(c.r.toFloat(), c.g.toFloat(), c.b.toFloat(), c.a.toFloat())
|
||||
param
|
||||
}
|
||||
ParameterType.Vector2 -> {
|
||||
val param = rabbitServer.createVector2Float32Parameter(it.label)
|
||||
val v2 = (it.property as KMutableProperty1<Any, Vector2>).get(objectWithParameters)
|
||||
param.value = org.rabbitcontrol.rcp.model.types.Vector2(v2.x.toFloat(), v2.y.toFloat())
|
||||
param
|
||||
}
|
||||
ParameterType.Vector3 -> {
|
||||
val param = rabbitServer.createVector3Float32Parameter(it.label)
|
||||
val v3 = (it.property as KMutableProperty1<Any, Vector3>).get(objectWithParameters)
|
||||
param.value = org.rabbitcontrol.rcp.model.types.Vector3(v3.x.toFloat(), v3.y.toFloat(), v3.z.toFloat())
|
||||
param
|
||||
}
|
||||
ParameterType.Vector4 -> {
|
||||
val param = rabbitServer.createVector4Float32Parameter(it.label)
|
||||
val v4 = (it.property as KMutableProperty1<Any, Vector4>).get(objectWithParameters)
|
||||
param.value = org.rabbitcontrol.rcp.model.types.Vector4(v4.x.toFloat(), v4.y.toFloat(), v4.z.toFloat(), v4.w.toFloat())
|
||||
param
|
||||
}
|
||||
else -> rabbitServer.createBangParameter(it.label)
|
||||
}
|
||||
|
||||
// We need to store a mapping from Rabbit parameter to target object + orx parameter
|
||||
// so we can update the object later
|
||||
parameterMap[rabbitParam] = Pair(objectWithParameters, it)
|
||||
}
|
||||
|
||||
rabbitServer.update()
|
||||
}
|
||||
|
||||
override var enabled = true
|
||||
|
||||
override fun shutdown(program: Program) {
|
||||
transporter.dispose()
|
||||
rabbitholeTransporter?.dispose()
|
||||
webServer?.stop(0, 0)
|
||||
}
|
||||
|
||||
private fun getQRCodeImage(barcodeText: String): ColorBuffer {
|
||||
val qrCodeWriter = QRCodeWriter()
|
||||
val bitMatrix = qrCodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 30, 30)
|
||||
val cb = colorBuffer(bitMatrix.width, bitMatrix.height)
|
||||
cb.filterMag = MagnifyingFilter.NEAREST
|
||||
val shad = cb.shadow
|
||||
|
||||
|
||||
for (y in 0 until bitMatrix.width) {
|
||||
for (x in 0 until bitMatrix.height) {
|
||||
shad[x, y] = if (bitMatrix[x, y]) ColorRGBa.BLACK else ColorRGBa.WHITE
|
||||
}
|
||||
}
|
||||
|
||||
shad.upload()
|
||||
return cb
|
||||
}
|
||||
|
||||
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||
currentOpacity = mix(targetOpacity, currentOpacity, 0.8)
|
||||
|
||||
// Don't draw if it isn't necessary
|
||||
if (currentOpacity > 0.0) {
|
||||
qrOverlayComposition?.draw(drawer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> KMutableProperty1<out Any, Any?>?.qset(obj: Any, value: T) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return (this as KMutableProperty1<Any, T>).set(obj, value)
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"main.css": "./static/css/main.6b57d6a6.chunk.css",
|
||||
"main.js": "./static/js/main.3c08e7ef.chunk.js",
|
||||
"main.js.map": "./static/js/main.3c08e7ef.chunk.js.map",
|
||||
"static/css/1.a970d4a6.chunk.css": "./static/css/1.a970d4a6.chunk.css",
|
||||
"static/js/1.ab137fd1.chunk.js": "./static/js/1.ab137fd1.chunk.js",
|
||||
"static/js/1.ab137fd1.chunk.js.map": "./static/js/1.ab137fd1.chunk.js.map",
|
||||
"runtime~main.js": "./static/js/runtime~main.4a686d48.js",
|
||||
"runtime~main.js.map": "./static/js/runtime~main.4a686d48.js.map",
|
||||
"static/media/blueprint-icons.css": "./static/media/icons-20.cef8cdbb.woff",
|
||||
"static/css/main.6b57d6a6.chunk.css.map": "./static/css/main.6b57d6a6.chunk.css.map",
|
||||
"static/css/1.a970d4a6.chunk.css.map": "./static/css/1.a970d4a6.chunk.css.map",
|
||||
"index.html": "./index.html",
|
||||
"precache-manifest.8b50f7152eba97a8a3a748d36319a411.js": "./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js",
|
||||
"service-worker.js": "./service-worker.js"
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><link rel="shortcut icon" href="./favicon.ico"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><link rel="manifest" href="./manifest.json"><title>RabbitControl Web Carrot</title><link href="./static/css/1.a970d4a6.chunk.css" rel="stylesheet"><link href="./static/css/main.6b57d6a6.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(l){function e(e){for(var r,t,n=e[0],o=e[1],u=e[2],f=0,i=[];f<n.length;f++)t=n[f],p[t]&&i.push(p[t][0]),p[t]=0;for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(l[r]=o[r]);for(s&&s(e);i.length;)i.shift()();return c.push.apply(c,u||[]),a()}function a(){for(var e,r=0;r<c.length;r++){for(var t=c[r],n=!0,o=1;o<t.length;o++){var u=t[o];0!==p[u]&&(n=!1)}n&&(c.splice(r--,1),e=f(f.s=t[0]))}return e}var t={},p={2:0},c=[];function f(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return l[e].call(r.exports,r,r.exports,f),r.l=!0,r.exports}f.m=l,f.c=t,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(r,e){if(1&e&&(r=f(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)f.d(t,n,function(e){return r[e]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var r=window.webpackJsonp=window.webpackJsonp||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var o=0;o<r.length;o++)e(r[o]);var s=n;a()}([])</script><script src="./static/js/1.ab137fd1.chunk.js"></script><script src="./static/js/main.3c08e7ef.chunk.js"></script></body></html>
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"short_name": "RCP Web Client",
|
||||
"name": "RabbitControl Web Client",
|
||||
"icons": [
|
||||
{
|
||||
"src": "favicon.ico",
|
||||
"sizes": "64x64 32x32 24x24 16x16",
|
||||
"type": "image/x-icon"
|
||||
}
|
||||
],
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#ffffff"
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
self.__precacheManifest = [
|
||||
{
|
||||
"revision": "3c08e7ef80fee0668771",
|
||||
"url": "./static/css/main.6b57d6a6.chunk.css"
|
||||
},
|
||||
{
|
||||
"revision": "3c08e7ef80fee0668771",
|
||||
"url": "./static/js/main.3c08e7ef.chunk.js"
|
||||
},
|
||||
{
|
||||
"revision": "ab137fd189140783fea3",
|
||||
"url": "./static/css/1.a970d4a6.chunk.css"
|
||||
},
|
||||
{
|
||||
"revision": "ab137fd189140783fea3",
|
||||
"url": "./static/js/1.ab137fd1.chunk.js"
|
||||
},
|
||||
{
|
||||
"revision": "4a686d48d5a089750c49",
|
||||
"url": "./static/js/runtime~main.4a686d48.js"
|
||||
},
|
||||
{
|
||||
"revision": "3cde8748332d1de6b1ae1c2dc5850754",
|
||||
"url": "./static/media/icons-16.3cde8748.ttf"
|
||||
},
|
||||
{
|
||||
"revision": "05f1cdadfe476395f60e233b15c22155",
|
||||
"url": "./static/media/icons-16.05f1cdad.eot"
|
||||
},
|
||||
{
|
||||
"revision": "3c1c220e7a18286503fb431c7a7fe183",
|
||||
"url": "./static/media/icons-16.3c1c220e.woff"
|
||||
},
|
||||
{
|
||||
"revision": "0a5c76518a68c185baa2c6744456918c",
|
||||
"url": "./static/media/icons-20.0a5c7651.eot"
|
||||
},
|
||||
{
|
||||
"revision": "51ec31f302d0072808e1f83f85fea4cd",
|
||||
"url": "./static/media/icons-20.51ec31f3.ttf"
|
||||
},
|
||||
{
|
||||
"revision": "cef8cdbb9d0ba82e6e19fb0eeba2ac3d",
|
||||
"url": "./static/media/icons-20.cef8cdbb.woff"
|
||||
},
|
||||
{
|
||||
"revision": "a84699318edf0b28678797d32740ca67",
|
||||
"url": "./index.html"
|
||||
}
|
||||
];
|
||||
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Welcome to your Workbox-powered service worker!
|
||||
*
|
||||
* You'll need to register this file in your web app and you should
|
||||
* disable HTTP caching for this file too.
|
||||
* See https://goo.gl/nhQhGp
|
||||
*
|
||||
* The rest of the code is auto-generated. Please don't update this file
|
||||
* directly; instead, make changes to your Workbox build configuration
|
||||
* and re-run your build process.
|
||||
* See https://goo.gl/2aRDsh
|
||||
*/
|
||||
|
||||
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
|
||||
|
||||
importScripts(
|
||||
"./precache-manifest.8b50f7152eba97a8a3a748d36319a411.js"
|
||||
);
|
||||
|
||||
workbox.clientsClaim();
|
||||
|
||||
/**
|
||||
* The workboxSW.precacheAndRoute() method efficiently caches and responds to
|
||||
* requests for URLs in the manifest.
|
||||
* See https://goo.gl/S9QRab
|
||||
*/
|
||||
self.__precacheManifest = [].concat(self.__precacheManifest || []);
|
||||
workbox.precaching.suppressWarnings();
|
||||
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
|
||||
|
||||
workbox.routing.registerNavigationRoute("./index.html", {
|
||||
|
||||
blacklist: [/^\/_/,/\/[^/]+\.[^/]+$/],
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
body{margin:0;padding:0;font-family:sans-serif;background-color:#232a2f}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}.bp3-slider-handle:focus{outline:0}.App{text-align:left;margin:4px 4px -30px;display:flex;flex-direction:column;justify-content:center}.bp3-slider-label{transform:translateY(20px)}.bp3-slider-axis :nth-child(2),.bp3-slider-axis :nth-child(3){transform:translate(-100%,20px)}.bp3-slider-axis :nth-child(3){right:0 px}.bp3-slider-handle .bp3-slider-label{transform:translate(-50%,-20px)}.bp3-tab-list{flex-flow:row wrap}.bp3-overlay{pointer-events:none}.parameter-label{white-space:nowrap;color:grey;font-size:16;margin-bottom:4px}.parameter-wrapper{padding-top:4px;padding-bottom:0}.parameter-wrapper .inner{padding:5px;border-radius:4px}.rootgroup-wrapper{padding:0 5px 4px;border-radius:4px;border:1px solid #454545}.serverid{font-size:.8em;margin-top:5px;margin-left:2px}.credits{margin-top:20;margin-bottom:5;width:100%;text-align:center;font-size:.8em}
|
||||
/*# sourceMappingURL=main.6b57d6a6.chunk.css.map */
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/index.css","main.6b57d6a6.chunk.css","/Users/inx/Documents/_rabbitControl/_src/rcp-ts-client/src/App.css"],"names":[],"mappings":"AAAA,KACE,SAAU,AACV,UAAW,AACX,uBAAwB,AAMxB,wBAAkC,CACnC,AAED,KACE,uEACY,CACb,AAED,GACE,cAAe,AACf,WAAY,AACZ,SAAU,AACV,0BAA2B,AAC3B,aAAc,AACd,SAAW,CACZ,AAED,yBACE,SAAW,CCCZ,AC5BD,KACE,gBAAiB,AAEjB,qBAAqB,AACrB,aAAc,AACd,sBAAuB,AACvB,sBAAwB,CACzB,AAGD,kBAEU,0BAA8B,CACvC,AAOD,8DAHU,+BAAiC,CAQ1C,AALD,+BAIE,UAAY,CACb,AAED,qCAEU,+BAAiC,CAC1C,AAED,cACE,kBAAoB,CACrB,AAED,aACE,mBAAqB,CACtB,AAGD,iBACE,mBAAoB,AACpB,WAAY,AACZ,aAAc,AACd,iBAAmB,CACpB,AAED,mBACE,gBAAiB,AACjB,gBAAoB,CACrB,AAED,0BACE,YAAa,AACb,iBAAmB,CACpB,AAED,mBAGE,kBAAoB,AACpB,kBAAmB,AACnB,wBAA0B,CAC3B,AAED,UACE,eAAiB,AACjB,eAAgB,AAChB,eAAiB,CAClB,AAED,SAEE,cAAe,AACf,gBAAiB,AACjB,WAAY,AACZ,kBAAmB,AACnB,cAAiB,CD0BlB","file":"main.6b57d6a6.chunk.css","sourcesContent":["body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}","body {\n margin: 0;\n padding: 0;\n font-family: sans-serif;\n /* font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif; */\n /* -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; */\n background-color: rgb(35, 42, 47);\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n\nhr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n padding: 0; \n}\n\n.bp3-slider-handle:focus {\n outline: 0;\n}\n.App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}\n",".App {\n text-align: left;\n margin: 4px;\n margin-bottom: -30px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n/* bluepring style overwrites*/\n.bp3-slider-label{\n -webkit-transform:translate(0%, 20px);\n transform:translate(0%, 20px);\n}\n\n.bp3-slider-axis :nth-child(2){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n}\n\n.bp3-slider-axis :nth-child(3){\n -webkit-transform:translate(-100%, 20px);\n transform:translate(-100%, 20px);\n\n right: 0 px;\n}\n\n.bp3-slider-handle .bp3-slider-label{\n -webkit-transform:translate(-50%, -20px);\n transform:translate(-50%, -20px);\n}\n\n.bp3-tab-list {\n flex-flow: row wrap;\n}\n\n.bp3-overlay {\n pointer-events: none;\n}\n\n/* gui styles */\n.parameter-label {\n white-space: nowrap;\n color: gray;\n font-size: 16; \n margin-bottom: 4px;\n}\n\n.parameter-wrapper {\n padding-top: 4px;\n padding-bottom: 0px; \n}\n\n.parameter-wrapper .inner{\n padding: 5px;\n border-radius: 4px;\n}\n\n.rootgroup-wrapper {\n padding: 5px;\n padding-top: 0px;\n padding-bottom: 4px;\n border-radius: 4px;\n border: 1px solid #454545;\n}\n\n.serverid {\n font-size: 0.8em;\n margin-top: 5px;\n margin-left: 2px;\n}\n\n.credits {\n font-size: 0.8em;\n margin-top: 20;\n margin-bottom: 5;\n width: 100%;\n text-align: center;\n font-size: 0.8em;\n}"]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
!function(e){function r(r){for(var n,f,i=r[0],l=r[1],a=r[2],c=0,s=[];c<i.length;c++)f=i[c],o[f]&&s.push(o[f][0]),o[f]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=f(f.s=t[0]))}return e}var n={},o={2:0},u=[];function f(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.m=e,f.c=n,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,r){if(1&r&&(e=f(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)f.d(t,n,function(r){return e[r]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="./";var i=window.webpackJsonp=window.webpackJsonp||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var p=l;t()}([]);
|
||||
//# sourceMappingURL=runtime~main.4a686d48.js.map
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user