v / examples / js_dom_draw / draw.js.v
93 lines · 85 sloc · 2.16 KB · 8e35f4d9848f7ad35d857a187dddbfd2eca5e19d
Raw
1import js.dom
2
3fn get_canvas(elem JS.HTMLElement) JS.HTMLCanvasElement {
4 match elem {
5 JS.HTMLCanvasElement {
6 return elem
7 }
8 else {
9 panic('Not a canvas')
10 }
11 }
12}
13
14fn draw_line(mut context JS.CanvasRenderingContext2D, x1 int, y1 int, x2 int, y2 int) {
15 context.beginPath()
16 context.strokeStyle = 'black'.str
17 context.lineWidth = JS.Number(1)
18 context.moveTo(JS.Number(x1), JS.Number(y1))
19 context.lineTo(JS.Number(x2), JS.Number(y2))
20 context.stroke()
21 context.closePath()
22}
23
24struct DrawState {
25mut:
26 context JS.CanvasRenderingContext2D
27 drawing bool
28 x int
29 y int
30}
31
32fn main() {
33 window := dom.window()
34 document := dom.document
35 clear_btn := document.getElementById('clearButton'.str)?
36 canvas_elem := document.getElementById('canvas'.str)?
37 canvas := get_canvas(canvas_elem)
38 ctx := canvas.getContext('2d'.str, js_undefined())?
39 mut context := JS.CanvasRenderingContext2D{}
40 match ctx {
41 JS.CanvasRenderingContext2D {
42 context = ctx
43 }
44 else {
45 panic('can not get 2d context')
46 }
47 }
48
49 mut state := DrawState{context, false, 0, 0}
50
51 canvas.addEventListener('mousedown'.str, fn [mut state] (event JS.Event) {
52 state.drawing = true
53 match event {
54 JS.MouseEvent {
55 state.x = int(event.offsetX)
56 state.y = int(event.offsetY)
57 }
58 else {}
59 }
60 }, JS.EventListenerOptions{})
61 canvas.addEventListener('mousemove'.str, fn [mut state] (event JS.Event) {
62 if state.drawing {
63 match event {
64 JS.MouseEvent {
65 draw_line(mut state.context, state.x, state.y, int(event.offsetX),
66 int(event.offsetY))
67 state.x = int(event.offsetX)
68 state.y = int(event.offsetY)
69 }
70 else {}
71 }
72 }
73 }, JS.EventListenerOptions{})
74
75 window.addEventListener('mouseup'.str, fn [mut state] (event JS.Event) {
76 if state.drawing {
77 match event {
78 JS.MouseEvent {
79 draw_line(mut state.context, state.x, state.y, int(event.offsetX),
80 int(event.offsetY))
81 }
82 else {}
83 }
84
85 state.x = 0
86 state.y = 0
87 state.drawing = false
88 }
89 }, JS.EventListenerOptions{})
90 clear_btn.addEventListener('click'.str, fn [mut state, canvas] (_ JS.Event) {
91 state.context.clearRect(JS.Number(0), JS.Number(0), canvas.width, canvas.height)
92 }, JS.EventListenerOptions{})
93}
94