From b48d6f3acac9ed81792508764e56f07c5a25d029 Mon Sep 17 00:00:00 2001 From: rnentjes Date: Fri, 6 Jun 2025 19:25:50 +0200 Subject: [PATCH] Add dynamic keyboard dimensions and integrate adjustable knob Introduced adjustable `keyboardWidth` and `keyboardHeight` for `KeyboardComponent`, making dimensions dynamic. Added a knob component to control keyboard width in `MainView`. Enhanced layouts for flexibility and customization. --- .../vst/ui/components/BaseKnobComponent.kt | 3 +- .../vst/ui/components/KeyboardComponent.kt | 6 ++-- .../nl/astraeus/vst/ui/view/MainView.kt | 28 ++++++++++++++++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/jsMain/kotlin/nl/astraeus/vst/ui/components/BaseKnobComponent.kt b/src/jsMain/kotlin/nl/astraeus/vst/ui/components/BaseKnobComponent.kt index ebe358f..4c76ff4 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/ui/components/BaseKnobComponent.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/ui/components/BaseKnobComponent.kt @@ -1,6 +1,7 @@ package nl.astraeus.vst.ui.components import kotlinx.html.classes +import kotlinx.html.div import kotlinx.html.js.onMouseDownFunction import kotlinx.html.js.onMouseLeaveFunction import kotlinx.html.js.onMouseMoveFunction @@ -87,7 +88,7 @@ open class BaseKnobComponent( private fun getRadius() = min(getMiddleX(), getMiddleY() - 16) - 5 override fun HtmlBuilder.render() { - span(KnobCls.name) { + div(KnobCls.name) { style = "width: ${width}px; height: ${height}px" knobElement = currentElement() diff --git a/src/jsMain/kotlin/nl/astraeus/vst/ui/components/KeyboardComponent.kt b/src/jsMain/kotlin/nl/astraeus/vst/ui/components/KeyboardComponent.kt index d4e7cb8..5800313 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/ui/components/KeyboardComponent.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/ui/components/KeyboardComponent.kt @@ -29,6 +29,8 @@ import org.w3c.dom.events.MouseEvent class KeyboardComponent( val title: String = "Keyboard", val octave: Int = 4, + val keyboardWidth: Int = 210, + val keyboardHeight: Int = keyboardWidth / 2, val onNoteDown: (Int) -> Unit = {}, val onNoteUp: (Int) -> Unit = {} ) : Komponent() { @@ -41,10 +43,8 @@ class KeyboardComponent( private val blackKeys = listOf(61, 63, 66, 68, 70) // Key dimensions - private val keyboardWidth = 210 - private val keyboardHeight = 100 private val whiteKeyWidth = keyboardWidth / 7 - private val blackKeyWidth = whiteKeyWidth * 3 / 2 + private val blackKeyWidth = (keyboardWidth / 9) private val blackKeyHeight = keyboardHeight * 60 / 100 // Calculate positions for black keys diff --git a/test-app/src/jsMain/kotlin/nl/astraeus/vst/ui/view/MainView.kt b/test-app/src/jsMain/kotlin/nl/astraeus/vst/ui/view/MainView.kt index ee39569..f91dde1 100644 --- a/test-app/src/jsMain/kotlin/nl/astraeus/vst/ui/view/MainView.kt +++ b/test-app/src/jsMain/kotlin/nl/astraeus/vst/ui/view/MainView.kt @@ -4,10 +4,12 @@ package nl.astraeus.vst.ui.view import kotlinx.html.div import kotlinx.html.h1 +import kotlinx.html.hr import kotlinx.html.js.onClickFunction import kotlinx.html.option import kotlinx.html.select import kotlinx.html.span +import kotlinx.html.style import nl.astraeus.css.properties.AlignItems import nl.astraeus.css.properties.BoxSizing import nl.astraeus.css.properties.Display @@ -39,6 +41,7 @@ import nl.astraeus.vst.ui.css.hover class MainView : Komponent() { private var messages: MutableList = ArrayList() var started = true + var keyboardWidth = 500 fun addMessage(message: String) { messages.add(message) @@ -113,7 +116,30 @@ class MainView : Komponent() { } } div { - include(KeyboardComponent()) + style = "height: 150px;" + include( + KnobComponent( + value = keyboardWidth.toDouble(), + label = "Keyboard", + minValue = 100.0, + maxValue = 2000.0, + step = 5.0, + width = 100, + height = 120, + ) { value -> + keyboardWidth = value.toInt() + requestUpdate() + } + ) + } + hr {} + div { + include(KeyboardComponent( + keyboardWidth = keyboardWidth, + keyboardHeight = keyboardWidth / 2, + onNoteDown = { println("Note down: $it") }, + onNoteUp = { println("Note up: $it") }, + )) } /* div {