KotlinConf_2018
Porting D3JS to kotlin multiplaform
@imtam5 Pierre Mariac @gz_k Gaëtan Zoritchak
Porting D3JS to kotlin multiplaform Gatan Zoritchak Pierre Mariac - - PowerPoint PPT Presentation
KotlinConf_2018 Porting D3JS to kotlin multiplaform Gatan Zoritchak Pierre Mariac @gz_k @imtam5 KotlinConf_2018 The idea 2 The idea KotlinConf_2018 D3.js shape force data2viz JS JFx Android isomorphic, open source 3
KotlinConf_2018
@imtam5 Pierre Mariac @gz_k Gaëtan Zoritchak
KotlinConf_2018 2
KotlinConf_2018
The idea
3
D3.js force shape … data2viz JS JFx Android isomorphic, open source
KotlinConf_2018
The idea
4
platform code JS Android API Implementation common code interpolate timer JFx
KotlinConf_2018 5
KotlinConf_2018
zoom transition drag dispatch brush interpolate ease timer time-format time format array selection collection random voronoi quadtree geo hierarchy force chord contour axis scale-chromatic scale polygon shape path color zoom transition drag dispatch brush interpolate ease timer time-format time format array selection collection random voronoi quadtree geo hierarchy force chord contour axis scale-chromatic scale polygon shape path color
Kotlin standard library
10
zoom transition drag dispatch brush
KotlinConf_2018 11
KotlinConf_2018
Better code structure
12
viz { temperatures.forEach { group { circle { x = 10.0 radius = radiusScale(it.celsius) style.fill = 0xFFAA00.color } } } } d3.select("#viz") .selectAll("g") .data(temperatures) .enter().append("g") .append("circle") .attr("cx", 10) .attr("r", function(d) { return radiusScale(d.celsius); }) .attr("style", "fill: #FFAA00;")
KotlinConf_2018
Type everything
13
viz { temperatures.forEach { group { circle { x = 10.0 radius = radiusScale(it.celsius) style.fill = 0xFFAA00.color } } } } d3.select("#viz") .selectAll("g") .data(temperatures) .enter().append("g") .append("circle") .attr("cx", 10) .attr("r", function(d) { return radiusScale(d.celsius); }) .attr("style", "fill: #FFAA00;")
KotlinConf_2018
DSLs
14
viz { temperatures.forEachIndexed { index, temp -> group { transform { translate(.0, yScale(index)) } circle { x = 10.0 radius = radiusScale(temp.celsius) style.fill = 0xFFAA00.color } } } } d3.select("#viz") .selectAll("g") .data(temperatures) .enter().append("g") .attr("transform", function(d, i) { return "translate(0," + yScale(i) + ")"; }) .append("circle") .attr("cx", 10) .attr("r", function(d) { return radiusScale(d.celsius); }) .attr("style", "fill: #FFAA00;")
KotlinConf_2018
Bootstrapping
15
fun main(args: Array<String>) { viz { temperatures.forEachIndexed { index, temp -> group { transform { translate(.0, yScale(index)) } circle { x = 10.0 radius = radiusScale(temp.celsius) style.fill = 0xFFAA00.color } } } } }
KotlinConf_2018
Bootstrapping
16
Pure common code available on any platform
fun main(args: Array<String>) { viz { temperatures.forEachIndexed { index, temp -> group { transform { translate(.0, yScale(index)) } circle { x = 10.0 radius = radiusScale(temp.celsius) style.fill = 0xFFAA00.color } } } } }
KotlinConf_2018
Bootstrapping
17
This extension function is
Javascript platform Pure common code available on any platform
fun main(args: Array<String>) { viz { temperatures.forEachIndexed { index, temp -> group { transform { translate(.0, yScale(index)) } circle { x = 10.0 radius = radiusScale(temp.celsius) style.fill = 0xFFAA00.color } } } }.bindRendererOn("myCanvas") }
KotlinConf_2018 18
KotlinConf_2018
Architecture
19
D3JS DOM
document.createElement(“circle”) setAttribute(“r”,50) select(“#viz“) .append(“circle“) .attr(“r“, 50);
KotlinConf_2018
Architecture
20
Circle CircleDOM DOM
setAttribute(“r“, 50)
Common Platform
radius = 50.0 data2viz data2viz
KotlinConf_2018
Architecture
21
CircleJFx Circle
setRadius(50f)
CircleDOM DOM JS JFx
setAttribute(“r“, 50)
Platform Common Circle
data2viz data2viz radius = 50.0
KotlinConf_2018
Architecture
22
CircleJFx Circle CircleDOM DOM JS JFx
state
Platform Common Circle
data2viz data2viz
KotlinConf_2018
Architecture
23
CircleJFx Circle CircleDOM DOM
JS JFx
state
Platform Common Circle
data2viz data2viz
KotlinConf_2018
Architecture
24
CircleJFx Circle CircleDOM DOM CircleSVG Canvas JS JFx Android
state
Platform Common Circle
data2viz data2viz
KotlinConf_2018
Architecture
25
CircleJFx Circle CircleDOM DOM CircleSVG Canvas
state
JS JFx Android
state
Platform Common Circle
data2viz data2viz
KotlinConf_2018
Architecture
26
CircleJFx Circle CircleDOM DOM CircleSVG Canvas
state
JFx Renderer Android Renderer JS Renderer Canvas Canvas JS JFx Android Platform Common Circle
data2viz data2viz
KotlinConf_2018
Architecture
27
Viz Layer Common Platform JFx Renderer Android Renderer JS Renderer Group Circle Rect Path Text
data2viz data2viz
v 0.7
KotlinConf_2018 28
KotlinConf_2018 29
Y X Aligning platform APIs
KotlinConf_2018 30
Aligning platform APIs
KotlinConf_2018 31
Aligning platform APIs
KotlinConf_2018 32
degrees counterclockwise Y 45° X Aligning platform APIs
KotlinConf_2018
33
Aligning platform APIs
KotlinConf_2018
context.arc( x, y, r, startAngle, endAngle, counterclockwise);
34
Aligning platform APIs ∏ — 4 ∏ — 6
KotlinConf_2018
gc.arc( x, y, rx, ry, startAngle, sweepAngle)
context.arc( x, y, r, startAngle, endAngle, counterclockwise);
35
Aligning platform APIs ∏ — 4 ∏ — 6
85°
KotlinConf_2018
gc.arcTo( rectF, startAngle, sweepAngle)
gc.arc( x, y, rx, ry, startAngle, sweepAngle)
context.arc( x, y, r, startAngle, endAngle, counterclockwise);
36
Aligning platform APIs
∏ — 4 ∏ — 6
45°
KotlinConf_2018
Aligning platform APIs
37
KotlinConf_2018 38
KotlinConf_2018
Multiplatform tests
39
— common code
KotlinConf_2018
Multiplatform tests
40
— common code — specific platform code
KotlinConf_2018
Multiplatform tests
41
Viz image image image JsRenderer JFxRenderer AndroidRenderer
KotlinConf_2018
Multiplatform tests JS
42
Gradle puppeteer
rendering.html launch select screenshot
rendering.png Viz JsRenderer Canvas
KotlinConf_2018
Multiplatform tests JFx
43
Gradle rendering.png
JUnitTest snapshot()
Viz JfxRenderer Canvas
KotlinConf_2018
Multiplatform tests Android
44
Gradle rendering.png
adb pull adb instrument
Viz JfxRenderer Canvas
emulator
rendering.png
KotlinConf_2018
Multiplatform tests
45
JsRenderer JFxRenderer AndroidRenderer
KotlinConf_2018
Multiplatform tests
46
KotlinConf_2018
Current status
48
Some statistics
— 14k lines of code — 12k lines of tests — more than 95% of common code
KotlinConf_2018 49
data2viz V 0.7
— android support — new design with renderers for JS and JFx — 90% of D3 features now available
Current status
KotlinConf_2018 50
Version v0.8
— events API — more text features (fonts, multiline, …) — tutorials with online editable examples
Roadmap Idea Plugins data2viz-start: bootstrapping
KotlinConf_2018 51
charts.kt
KotlinConf_2018 52
KotlinConf_2018 53
charts.kt
54 KotlinConf_2018
charts.kt
55 KotlinConf_2018
charts.kt
KotlinConf_2018
charts.kt - android demo
56
charts.kt - early access program
57 KotlinConf_2018
charts.kt - early access program
58 KotlinConf_2018
KotlinConf_2018
@imtam5 Pierre Mariac @gz_k Gaëtan Zoritchak data2viz.io charts-kt.io @data2viz_io data2viz data2viz/data2viz Github