Upgrade knob interaction logic and dependency versions.

Reworked knob value adjustment to use precise mouse coordinates via `setValueByMouseCoords`. Improved user interaction by enhancing activation handling and CSS styling. Updated project dependencies, removed unused packages, and set version to 1.2.0 for compatibility and feature stability.
This commit is contained in:
2024-12-23 12:17:18 +01:00
parent 20e06b8fb9
commit 618dd52865
6 changed files with 65 additions and 27 deletions

View File

@@ -9,7 +9,7 @@ plugins {
} }
group = "nl.astraeus" group = "nl.astraeus"
version = "1.1.3" version = "1.2.0"
repositories { repositories {
mavenCentral() mavenCentral()
@@ -37,7 +37,6 @@ kotlin {
val commonMain by getting { val commonMain by getting {
dependencies { dependencies {
implementation("nl.astraeus:kotlin-css-generator:1.0.10") implementation("nl.astraeus:kotlin-css-generator:1.0.10")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0")
} }
} }
val jsMain by getting { val jsMain by getting {
@@ -52,7 +51,8 @@ kotlin {
} }
val jvmMain by getting { val jvmMain by getting {
dependencies { dependencies {
//base implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0")
implementation("io.undertow:undertow-core:2.3.14.Final") implementation("io.undertow:undertow-core:2.3.14.Final")
implementation("io.undertow:undertow-websockets-jsr:2.3.14.Final") implementation("io.undertow:undertow-websockets-jsr:2.3.14.Final")
implementation("org.jboss.xnio:xnio-nio:3.8.16.Final") implementation("org.jboss.xnio:xnio-nio:3.8.16.Final")
@@ -149,4 +149,8 @@ signing {
tasks.withType<PublishToMavenRepository> { tasks.withType<PublishToMavenRepository> {
dependsOn(tasks.withType<Sign>()) dependsOn(tasks.withType<Sign>())
}
tasks.withType<PublishToMavenLocal> {
dependsOn(tasks.withType<Sign>())
} }

View File

@@ -52,11 +52,6 @@
"@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/sourcemap-codec" "^1.4.14"
"@js-joda/core@3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273"
integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg==
"@socket.io/component-emitter@~3.1.0": "@socket.io/component-emitter@~3.1.0":
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"

View File

@@ -2,6 +2,8 @@ package nl.astraeus.vst.ui.components
import kotlinx.html.classes import kotlinx.html.classes
import kotlinx.html.js.onMouseDownFunction import kotlinx.html.js.onMouseDownFunction
import kotlinx.html.js.onMouseLeaveFunction
import kotlinx.html.js.onMouseMoveFunction
import kotlinx.html.js.onMouseUpFunction import kotlinx.html.js.onMouseUpFunction
import kotlinx.html.js.onWheelFunction import kotlinx.html.js.onWheelFunction
import kotlinx.html.org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
@@ -12,11 +14,14 @@ import nl.astraeus.css.properties.Color
import nl.astraeus.css.properties.Position import nl.astraeus.css.properties.Position
import nl.astraeus.css.properties.TextAlign import nl.astraeus.css.properties.TextAlign
import nl.astraeus.css.properties.em import nl.astraeus.css.properties.em
import nl.astraeus.css.properties.hsla
import nl.astraeus.css.properties.prc import nl.astraeus.css.properties.prc
import nl.astraeus.css.properties.px import nl.astraeus.css.properties.px
import nl.astraeus.css.properties.rem
import nl.astraeus.css.style.cls import nl.astraeus.css.style.cls
import nl.astraeus.komp.HtmlBuilder import nl.astraeus.komp.HtmlBuilder
import nl.astraeus.komp.Komponent import nl.astraeus.komp.Komponent
import nl.astraeus.komp.currentElement
import nl.astraeus.vst.ui.css.ActiveCls import nl.astraeus.vst.ui.css.ActiveCls
import nl.astraeus.vst.ui.css.Css import nl.astraeus.vst.ui.css.Css
import nl.astraeus.vst.ui.css.Css.defineCss import nl.astraeus.vst.ui.css.Css.defineCss
@@ -25,6 +30,8 @@ import nl.astraeus.vst.ui.css.CssName
import nl.astraeus.vst.ui.util.arc import nl.astraeus.vst.ui.util.arc
import nl.astraeus.vst.ui.util.height import nl.astraeus.vst.ui.util.height
import nl.astraeus.vst.ui.util.width import nl.astraeus.vst.ui.util.width
import org.w3c.dom.Element
import org.w3c.dom.HTMLElement
import org.w3c.dom.events.MouseEvent import org.w3c.dom.events.MouseEvent
import org.w3c.dom.events.WheelEvent import org.w3c.dom.events.WheelEvent
import kotlin.math.PI import kotlin.math.PI
@@ -65,10 +72,15 @@ open class BaseKnobComponent(
val actualMaximumValue = valueToActual(maxValue) val actualMaximumValue = valueToActual(maxValue)
var actualValue = valueToActual(value) var actualValue = valueToActual(value)
var activated = false var activated: Boolean = false
set(value) {
field = value
requestUpdate()
}
var mouseX = 0.0 var mouseX = 0.0
var mouseY = 0.0 var mouseY = 0.0
var startValue = 0.0 var startValue = 0.0
var knobElement: Element? = null
private fun getMiddleX() = width / 2 private fun getMiddleX() = width / 2
private fun getMiddleY() = ((height - 16) / 2) + 16 private fun getMiddleY() = ((height - 16) / 2) + 16
@@ -77,6 +89,11 @@ open class BaseKnobComponent(
override fun HtmlBuilder.render() { override fun HtmlBuilder.render() {
span(KnobCls.name) { span(KnobCls.name) {
style = "width: ${width}px; height: ${height}px" style = "width: ${width}px; height: ${height}px"
knobElement = currentElement()
if (activated) {
classes += ActiveCls.name
}
svg(KnobSvgCls.name) { svg(KnobSvgCls.name) {
if (activated) { if (activated) {
@@ -87,7 +104,7 @@ open class BaseKnobComponent(
height(height) height(height)
val actToVal = actualToValue(actualValue) val actToVal = actualToValue(actualValue)
console.log("actualValue", actualValue, "actToVal", actToVal)
val middle = ( val middle = (
((ANGLE_RANGE_DEG.toFloat() * ((ANGLE_RANGE_DEG.toFloat() *
(actToVal - minValue)) / (actToVal - minValue)) /
@@ -159,17 +176,27 @@ open class BaseKnobComponent(
onMouseDownFunction = { onMouseDownFunction = {
if (it is MouseEvent) { if (it is MouseEvent) {
activated = true activated = true
setValueByMouseCoords(it, minValue, maxValue, callback) setValueByMouseCoords(it, callback)
}
}
onMouseMoveFunction = {
if (activated && it is MouseEvent) {
setValueByMouseCoords(it, callback)
} }
} }
onMouseUpFunction = { onMouseUpFunction = {
if (it is MouseEvent) { if (it is MouseEvent) {
activated = false activated = false
requestUpdate()
} }
} }
onMouseLeaveFunction = {
if (it is MouseEvent) {
activated = false
}
}
} }
} }
@@ -200,12 +227,15 @@ open class BaseKnobComponent(
private fun setValueByMouseCoords( private fun setValueByMouseCoords(
it: MouseEvent, it: MouseEvent,
minValue: Double = 0.0,
maxValue: Double = 5.0,
callback: (value: Double) -> Unit callback: (value: Double) -> Unit
) { ) {
val deltaX = it.offsetX - getMiddleX() val target = knobElement as? HTMLElement ?: error("Not in an HTMLElement?")
val deltaY = it.offsetY - getMiddleY() val rect = target.getBoundingClientRect();
val mouseX = it.clientX - rect.left;
val mouseY = it.clientY - rect.top;
val deltaX = mouseX - getMiddleX()
val deltaY = mouseY - getMiddleY()
var angle = atan2(deltaX, deltaY) var angle = atan2(deltaX, deltaY)
@@ -236,9 +266,9 @@ open class BaseKnobComponent(
angle < PI / 2.0 -> newValue = maxValue angle < PI / 2.0 -> newValue = maxValue
} }
actualValue = newValue actualValue = valueToActual(newValue)
callback(newValue.toDouble()) callback(newValue)
requestUpdate() requestUpdate()
@@ -290,7 +320,10 @@ open class BaseKnobComponent(
position(Position.relative) position(Position.relative)
margin(5.px) margin(5.px)
and(cls(ActiveCls)) {} and(cls(ActiveCls)) {
backgroundColor(hsla(178, 70, 55, 0.1))
borderRadius(0.5.rem)
}
select(cls(KnobSvgCls)) { select(cls(KnobSvgCls)) {
plain("stroke", "none") plain("stroke", "none")

View File

@@ -7,7 +7,7 @@ import io.undertow.server.handlers.PathHandler
import io.undertow.server.handlers.resource.PathResourceManager import io.undertow.server.handlers.resource.PathResourceManager
import io.undertow.server.handlers.resource.ResourceHandler import io.undertow.server.handlers.resource.ResourceHandler
import io.undertow.server.session.Session import io.undertow.server.session.Session
import io.undertow.server.session.SessionConfig import io.undertow.server.session.SessionCookieConfig
import io.undertow.server.session.SessionManager import io.undertow.server.session.SessionManager
import io.undertow.util.Headers import io.undertow.util.Headers
import io.undertow.websockets.WebSocketConnectionCallback import io.undertow.websockets.WebSocketConnectionCallback
@@ -22,6 +22,14 @@ import nl.astraeus.vst.base.db.PatchDao
import nl.astraeus.vst.base.db.PatchEntity import nl.astraeus.vst.base.db.PatchEntity
import java.nio.file.Paths import java.nio.file.Paths
object VstSessionConfig {
val config = SessionCookieConfig()
init {
config.setCookieName("VstCookie")
}
}
class WebsocketHandler( class WebsocketHandler(
val session: Session? val session: Session?
) : AbstractReceiveListener(), WebSocketConnectionCallback { ) : AbstractReceiveListener(), WebSocketConnectionCallback {
@@ -81,9 +89,8 @@ class WebsocketHandler(
object WebsocketConnectHandler : HttpHandler { object WebsocketConnectHandler : HttpHandler {
override fun handleRequest(exchange: HttpServerExchange) { override fun handleRequest(exchange: HttpServerExchange) {
val sessionManager = exchange.getAttachment(SessionManager.ATTACHMENT_KEY) val sessionManager = exchange.getAttachment(SessionManager.ATTACHMENT_KEY)
val sessionConfig = exchange.getAttachment(SessionConfig.ATTACHMENT_KEY)
val httpSession: Session? = sessionManager.getSession(exchange, sessionConfig) val httpSession: Session? = sessionManager.getSession(exchange, VstSessionConfig.config)
websocket(WebsocketHandler(httpSession)).handleRequest(exchange) websocket(WebsocketHandler(httpSession)).handleRequest(exchange)
} }
@@ -98,11 +105,10 @@ class PatchHandler(
if (exchange.requestPath.startsWith("/patch/")) { if (exchange.requestPath.startsWith("/patch/")) {
val patchId = exchange.requestPath.substring(7) val patchId = exchange.requestPath.substring(7)
val sessionManager = exchange.getAttachment(SessionManager.ATTACHMENT_KEY) val sessionManager = exchange.getAttachment(SessionManager.ATTACHMENT_KEY)
val sessionConfig = exchange.getAttachment(SessionConfig.ATTACHMENT_KEY) var httpSession: Session? = sessionManager.getSession(exchange, VstSessionConfig.config)
var httpSession: Session? = sessionManager.getSession(exchange, sessionConfig)
if (httpSession == null) { if (httpSession == null) {
httpSession = sessionManager.createSession(exchange, sessionConfig) httpSession = sessionManager.createSession(exchange, VstSessionConfig.config)
} }
httpSession?.setAttribute("html-session", VstSession(patchId)) httpSession?.setAttribute("html-session", VstSession(patchId))

View File

@@ -32,4 +32,4 @@ object UndertowServer {
server?.start() server?.start()
} }
} }

View File

@@ -80,7 +80,7 @@ open class BaseKnobComponent(
height(height) height(height)
val actToVal = actualToValue(actualValue) val actToVal = actualToValue(actualValue)
println("actualValue: $actualValue, actToVal: $actToVal")
val middle = ( val middle = (
((ANGLE_RANGE_DEG.toFloat() * ((ANGLE_RANGE_DEG.toFloat() *
(actToVal - minValue)) / (actToVal - minValue)) /