Jörg Rade
02/06/2022, 10:56 AMJörg Rade
02/06/2022, 10:57 AMRobert Jaros
02/06/2022, 11:24 AMroot("kvapp") {
canvas(800, 600) {
addAfterInsertHook {
chordViz().bindRendererOn(this.getElement().unsafeCast<HTMLCanvasElement>())
}
}
}
Seems to work fine (had to remove d2v-contour
dependency, because it couldn't be found).Jörg Rade
02/06/2022, 6:41 PMRobert Jaros
02/06/2022, 7:40 PMJörg Rade
02/06/2022, 7:47 PMRobert Jaros
02/06/2022, 7:49 PM<canvas>
tag, you can put it wherever you needJörg Rade
02/10/2022, 6:28 PMimport io.data2viz.color.Colors
import io.data2viz.geom.size
import io.data2viz.scale.Scales
import io.data2viz.viz.TextHAlign
import io.data2viz.viz.TextVAlign
import io.data2viz.viz.bindRendererOn
import io.data2viz.viz.viz
import io.kvision.html.Canvas
import kotlinx.browser.document
import kotlinx.dom.appendElement
import org.apache.isis.client.kroviz.core.event.LogEntry
import org.apache.isis.client.kroviz.ui.core.RoDialog
import org.w3c.dom.ElementCreationOptions
class ChartDialog(
private val expectedEvents: List<LogEntry>,
canvasId: String
) : Controller() {
init {
dialog = RoDialog(
caption = canvasId,
items = mutableListOf(),
controller = this,
defaultAction = "OK",
widthPerc = 60,
heightPerc = 70,
customButtons = mutableListOf()
)
val options = ElementCreationOptions("HTMLCanvasElement")
val element = document.createElement(canvasId, options)
document.body!!.appendElement(canvasId, {element})
val canvasWidth = 100
val canvasHeight = 200
val cssClassName: String? = null
val canvas = Canvas(canvasWidth, canvasHeight, cssClassName, { barchartExample(canvasId) })
dialog.add(canvas)
}
private fun Canvas.barchartExample(canvasId: String) {
val vizSize = 500.0
val barHeight = 14.0
val cPadding = 2.0
val data = listOf(4, 8, 15, 16, 23, 42)
val xScale = Scales.Continuous.linear {
domain = listOf(.0, data.maxOrNull()!!.toDouble())
range = listOf(.0, vizSize - 2 * cPadding)
}
val viz = viz {
size = size(vizSize, vizSize)
data.forEachIndexed { index, datum ->
group {
transform {
translate(
x = cPadding,
y = cPadding + index * (cPadding + barHeight)
)
}
rect {
width = xScale(datum.toDouble())
height = barHeight
fill = Colors.Web.steelblue
}
text {
textContent = datum.toString()
hAlign = TextHAlign.RIGHT
vAlign = TextVAlign.HANGING
x = xScale(datum.toDouble()) - 2.0
y = 1.5
textColor = Colors.Web.white
fontSize = 10.0
}
}
}
}
viz.bindRendererOn(canvasId)
}
}
Robert Jaros
02/10/2022, 6:37 PMJörg Rade
02/10/2022, 7:19 PMJörg Rade
02/10/2022, 10:29 PMdocument.body!!.appendElement(canvasId, {})
val canvas = Canvas(200, 200)
canvas.addAfterInsertHook {
val htmlCanvas = document.getElementById(canvasId).unsafeCast<HTMLCanvasElement>()
viz().bindRendererOn(htmlCanvas)
}
dialog.add(canvas)
Robert Jaros
02/11/2022, 5:40 AMJörg Rade
02/11/2022, 6:32 AMRobert Jaros
02/11/2022, 6:39 AMRoDialog
is inherited from 'Modal' or 'Window'?Robert Jaros
02/11/2022, 7:14 AMclass CanvasWindow: Window("Let's draw") {
init {
canvas(800, 600) {
barchartExample()
}
}
}
private fun Canvas.barchartExample() {
val vizSize = 500.0
val barHeight = 14.0
val cPadding = 2.0
val data = listOf(4, 8, 15, 16, 23, 42)
val xScale = Scales.Continuous.linear {
domain = listOf(.0, data.maxOrNull()!!.toDouble())
range = listOf(.0, vizSize - 2 * cPadding)
}
val viz = viz {
size = size(vizSize, vizSize)
data.forEachIndexed { index, datum ->
group {
transform {
translate(
x = cPadding,
y = cPadding + index * (cPadding + barHeight)
)
}
rect {
width = xScale(datum.toDouble())
height = barHeight
fill = Colors.Web.steelblue
}
text {
textContent = datum.toString()
hAlign = TextHAlign.RIGHT
vAlign = TextVAlign.HANGING
x = xScale(datum.toDouble()) - 2.0
y = 1.5
textColor = Colors.Web.white
fontSize = 10.0
}
}
}
}
addAfterInsertHook {
viz.bindRendererOn(this.getElement().unsafeCast<HTMLCanvasElement>())
}
}
Robert Jaros
02/11/2022, 7:18 AMWindow
. Here you can see how canvas is resized to dynamically match window size.
https://github.com/rjaros/kvision-examples/blob/master/desktop/src/main/kotlin/com/example/Paint.kt#L156Jörg Rade
02/11/2022, 7:35 AMJörg Rade
02/11/2022, 8:20 AMinit {
dialog = RoDialog(
caption = canvasId,
items = mutableListOf(),
controller = this,
defaultAction = "OK",
widthPerc = 50,
heightPerc = 50,
customButtons = mutableListOf()
)
val canvas = Canvas(200, 200)
canvas.addAfterInsertHook {
val htmlCanvas = canvas.unsafeCast<HTMLCanvasElement>()
viz().bindRendererOn(htmlCanvas)
}
dialog.add(canvas)
}
leads to restrictions when moving windows.Jörg Rade
02/11/2022, 8:22 AMRobert Jaros
02/11/2022, 8:46 AMJörg Rade
02/11/2022, 8:51 AMJörg Rade
02/11/2022, 9:07 AMRobert Jaros
02/11/2022, 9:18 AMRobert Jaros
02/11/2022, 9:18 AMval htmlCanvas = canvas.getElement().unsafeCast<HTMLCanvasElement>()
Jörg Rade
02/11/2022, 9:29 AM