Bug fix for dygraph point selection touch event.
[dygraphs.git] / tests / drawing.html
CommitLineData
8c5fe59e
DV
1<!DOCTYPE html>
2<html>
3 <head>
fd6b8dad 4 <link rel="stylesheet" href="../dist/dygraph.css">
8c5fe59e 5 <title>Dygraphs Drawing Demo</title>
fbd6834a 6 <script type="text/javascript" src="../dist/dygraph.js"></script>
7e5ddc94 7
fc7d0ef1 8 <script>
8c5fe59e
DV
9 var start_date = new Date("2002/12/29").getTime();
10 var end_date = new Date().getTime();
11 data = [];
12 for (var d = start_date; d < end_date; d += 604800 * 1000) {
13 var millis = d + 2 * 3600 * 1000;
fc7d0ef1
DV
14 var date = new Date(millis);
15 var yyyy = date.getFullYear(),
16 mm = date.getMonth(),
17 dd = date.getDate();
18 data.push( [ new Date(Date.UTC(yyyy, mm, dd)), 50 ]);
8c5fe59e
DV
19 }
20 </script>
fc7d0ef1
DV
21
22 <style>
8c5fe59e
DV
23 #tool_zoom {
24 background: url('drawing/tool-palette.png');
86cf5a64 25 background-position: 0px 0px;
8c5fe59e
DV
26 width: 32px;
27 height: 33px;
28 margin-left: 50px;
29 display: inline-block;
30 }
31 #tool_pencil {
32 background: url('drawing/tool-palette.png');
86cf5a64 33 background-position: -32px 0px;
8c5fe59e
DV
34 width: 32px;
35 height: 33px;
36 display: inline-block;
37 }
38 #tool_eraser {
39 background: url('drawing/tool-palette.png');
86cf5a64 40 background-position: -64px 0px;
8c5fe59e
DV
41 width: 33px;
42 height: 33px;
43 display: inline-block;
44 }
45 #toolbar {
46 display: inline-block;
47 }
48 </style>
49</head>
50<body>
51 <h2>Time Series Drawing Demo</h2>
52 <div id='toolbar'>
53 <div id="tool_zoom" onClick='change_tool(this)'></div><div id="tool_pencil" onClick='change_tool(this)'></div><div id="tool_eraser" onClick='change_tool(this)'></div>
54 </div>
55 <div id="draw_div" style="width: 800px; height: 400px;"></div>
56
57 <script type="text/javascript">
58 var isDrawing = false;
59 var lastDrawRow = null, lastDrawValue = null;
60 var tool = 'pencil';
61 var valueRange = [0, 100];
62
63 function setPoint(event, g, context) {
fc7d0ef1
DV
64 var pos = Dygraph.findPos(g.graphDiv);
65 var canvasx = Dygraph.pageX(event) - pos.x;
66 var canvasy = Dygraph.pageY(event) - pos.y;
8c5fe59e
DV
67 var xy = g.toDataCoords(canvasx, canvasy);
68 var x = xy[0], value = xy[1];
69 var rows = g.numRows();
70 var closest_row = -1;
71 var smallest_diff = -1;
72 // TODO(danvk): binary search
73 for (var row = 0; row < rows; row++) {
74 var date = g.getValue(row, 0); // millis
75 var diff = Math.abs(date - x);
76 if (smallest_diff < 0 || diff < smallest_diff) {
77 smallest_diff = diff;
78 closest_row = row;
79 }
80 }
81
82 if (closest_row != -1) {
83 if (lastDrawRow === null) {
84 lastDrawRow = closest_row;
85 lastDrawValue = value;
86 }
87 var coeff = (value - lastDrawValue) / (closest_row - lastDrawRow);
88 if (closest_row == lastDrawRow) coeff = 0.0;
89 var minRow = Math.min(lastDrawRow, closest_row);
90 var maxRow = Math.max(lastDrawRow, closest_row);
91 for (var row = minRow; row <= maxRow; row++) {
92 if (tool == 'pencil') {
93 var val = lastDrawValue + coeff * (row - lastDrawRow);
94 val = Math.max(valueRange[0], Math.min(val, valueRange[1]));
95 data[row][1] = val;
96 if (val == null || isNaN(val)) console.log(val);
97 } else if (tool == 'eraser') {
98 data[row][1] = null;
99 }
100 }
101 lastDrawRow = closest_row;
102 lastDrawValue = value;
103 g.updateOptions({ file: data });
104 g.setSelection(closest_row); // prevents the dot from being finnicky.
105 }
106 }
107
108 function finishDraw() {
109 isDrawing = false;
110 lastDrawRow = null;
111 lastDrawValue = null;
112 }
113
114 function change_tool(tool_div) {
86cf5a64 115 var ids = ['tool_zoom', 'tool_pencil', 'tool_eraser'];
8c5fe59e 116 for (var i = 0; i < ids.length; i++) {
86cf5a64
DV
117 var div = document.getElementById(ids[i]);
118 if (div == tool_div) {
119 div.style.backgroundPosition = -(i * 32) + 'px -32px';
120 } else {
121 div.style.backgroundPosition = -(i * 32) + 'px 0px';
122 }
8c5fe59e 123 }
8c5fe59e
DV
124 tool = tool_div.id.replace('tool_', '');
125
126 var dg_div = document.getElementById("draw_div");
127 if (tool == 'pencil') {
128 dg_div.style.cursor = 'url(drawing/cursor-pencil.png) 2 30, auto';
129 } else if (tool == 'eraser') {
130 dg_div.style.cursor = 'url(drawing/cursor-eraser.png) 10 30, auto';
131 } else if (tool == 'zoom') {
132 dg_div.style.cursor = 'crosshair';
133 }
134 }
135 change_tool(document.getElementById("tool_pencil"));
136
137 g = new Dygraph(document.getElementById("draw_div"), data,
138 {
139 valueRange: valueRange,
140 labels: [ 'Date', 'Value' ],
fc7d0ef1 141 labelsUTC: true,
8c5fe59e
DV
142 interactionModel: {
143 mousedown: function (event, g, context) {
144 if (tool == 'zoom') {
145 Dygraph.defaultInteractionModel.mousedown(event, g, context);
146 } else {
178b1e0a 147 event.preventDefault(); // Firefox, Chrome, etc.
8c5fe59e
DV
148 isDrawing = true;
149 setPoint(event, g, context);
150 }
151 },
152 mousemove: function (event, g, context) {
153 if (tool == 'zoom') {
8c5fe59e
DV
154 } else {
155 if (!isDrawing) return;
156 setPoint(event, g, context);
157 }
158 },
159 mouseup: function(event, g, context) {
160 if (tool == 'zoom') {
8c5fe59e
DV
161 } else {
162 finishDraw();
163 }
164 },
165 mouseout: function(event, g, context) {
166 if (tool == 'zoom') {
8c5fe59e
DV
167 }
168 },
169 dblclick: function(event, g, context) {
170 Dygraph.defaultInteractionModel.dblclick(event, g, context);
171 },
172 mousewheel: function(event, g, context) {
173 var normal = event.detail ? event.detail * -1 : event.wheelDelta / 40;
174 var percentage = normal / 50;
175 var axis = g.xAxisRange();
176 var xOffset = g.toDomCoords(axis[0], null)[0];
177 var x = event.offsetX - xOffset;
178 var w = g.toDomCoords(axis[1], null)[0] - xOffset;
179 var xPct = w == 0 ? 0 : (x / w);
180
181 var delta = axis[1] - axis[0];
182 var increment = delta * percentage;
183 var foo = [increment * xPct, increment * (1 - xPct)];
184 var dateWindow = [ axis[0] + foo[0], axis[1] - foo[1] ];
185
186 g.updateOptions({
187 dateWindow: dateWindow
188 });
178b1e0a 189 event.preventDefault();
8c5fe59e
DV
190 }
191 },
192 strokeWidth: 1.5,
193 gridLineColor: 'rgb(196, 196, 196)',
fc7d0ef1
DV
194 axes: {
195 y: {
196 drawAxis: false,
197 drawGrid: false
198 }
199 }
8c5fe59e
DV
200 });
201 window.onmouseup = finishDraw;
202 </script>
203
204 <p style='font-size: 10pt'>Toolbar/cursor icons are CC-licensed from <a
205 href="http://www.fatcow.com/free-icons">FatCow</a>.</p>
206</body>
207</html>