Implement tick.label_v.
[dygraphs.git] / src / plugins / grid.js
CommitLineData
cbe41be1
DV
1/**
2 * @license
3 * Copyright 2012 Dan Vanderkam (danvdk@gmail.com)
4 * MIT-licensed (http://opensource.org/licenses/MIT)
5 */
0cd1ad15 6/*global Dygraph:false */
cbe41be1 7
cbe41be1
DV
8/*
9
10Current bits of jankiness:
a353dfe3
DV
11- Direct layout access
12- Direct area access
cbe41be1
DV
13
14*/
15
16"use strict";
17
18
19/**
20 * Draws the gridlines, i.e. the gray horizontal & vertical lines running the
21 * length of the chart.
22 *
23 * @constructor
24 */
25var grid = function() {
26};
27
28grid.prototype.toString = function() {
29 return "Gridline Plugin";
30};
31
32grid.prototype.activate = function(g) {
33 return {
98eb4713 34 willDrawChart: this.willDrawChart
cbe41be1
DV
35 };
36};
37
98eb4713 38grid.prototype.willDrawChart = function(e) {
cbe41be1
DV
39 // Draw the new X/Y grid. Lines appear crisper when pixels are rounded to
40 // half-integers. This prevents them from drawing in two rows/cols.
41 var g = e.dygraph;
42 var ctx = e.drawingContext;
43 var layout = g.layout_;
44 var area = e.dygraph.plotter_.area;
45
46 function halfUp(x) { return Math.round(x) + 0.5; }
47 function halfDown(y){ return Math.round(y) - 0.5; }
48
49 var x, y, i, ticks;
7f6a7190 50 if (g.getOptionForAxis('drawGrid', 'y')) {
e8b3c7b4
DE
51 var axes = ["y", "y2"];
52 var strokeStyles = [], lineWidths = [], drawGrid = [], stroking = [], strokePattern = [];
53 for (var i = 0; i < axes.length; i++) {
7f6a7190 54 drawGrid[i] = g.getOptionForAxis('drawGrid', axes[i]);
e8b3c7b4
DE
55 if (drawGrid[i]) {
56 strokeStyles[i] = g.getOptionForAxis('gridLineColor', axes[i]);
57 lineWidths[i] = g.getOptionForAxis('gridLineWidth', axes[i]);
58 strokePattern[i] = g.getOptionForAxis('gridLinePattern', axes[i]);
59 stroking[i] = strokePattern[i] && (strokePattern[i].length >= 2);
9e906ae6
DE
60 }
61 }
cbe41be1
DV
62 ticks = layout.yticks;
63 ctx.save();
e8b3c7b4 64 // draw grids for the different y axes
bd6ee5dc
DV
65 for (var tick of ticks) {
66 if (!tick.has_tick) continue;
67 var axis = tick.axis;
68 if (drawGrid[axis]) {
e8c70e4e 69 ctx.save();
9e906ae6 70 if (stroking[axis]) {
e8c70e4e 71 if (ctx.setLineDash) ctx.setLineDash(strokePattern[axis]);
9e906ae6
DE
72 }
73 ctx.strokeStyle = strokeStyles[axis];
74 ctx.lineWidth = lineWidths[axis];
75
76 x = halfUp(area.x);
bd6ee5dc 77 y = halfDown(area.y + tick.pos * area.h);
9e906ae6
DE
78 ctx.beginPath();
79 ctx.moveTo(x, y);
80 ctx.lineTo(x + area.w, y);
9e906ae6
DE
81 ctx.stroke();
82
e8c70e4e 83 ctx.restore();
97adf46b 84 }
cbe41be1
DV
85 }
86 ctx.restore();
87 }
88
e8b3c7b4 89 // draw grid for x axis
7f6a7190 90 if (g.getOptionForAxis('drawGrid', 'x')) {
cbe41be1
DV
91 ticks = layout.xticks;
92 ctx.save();
e8b3c7b4 93 var strokePattern = g.getOptionForAxis('gridLinePattern', 'x');
9e906ae6
DE
94 var stroking = strokePattern && (strokePattern.length >= 2);
95 if (stroking) {
e8c70e4e 96 if (ctx.setLineDash) ctx.setLineDash(strokePattern);
9e906ae6 97 }
e8b3c7b4
DE
98 ctx.strokeStyle = g.getOptionForAxis('gridLineColor', 'x');
99 ctx.lineWidth = g.getOptionForAxis('gridLineWidth', 'x');
bd6ee5dc
DV
100 for (var tick of ticks) {
101 if (!tick.has_tick) continue;
102 x = halfUp(area.x + tick.pos * area.w);
cbe41be1
DV
103 y = halfDown(area.y + area.h);
104 ctx.beginPath();
105 ctx.moveTo(x, y);
106 ctx.lineTo(x, area.y);
107 ctx.closePath();
108 ctx.stroke();
109 }
9e906ae6 110 if (stroking) {
e8c70e4e 111 if (ctx.setLineDash) ctx.setLineDash([]);
9e906ae6 112 }
cbe41be1
DV
113 ctx.restore();
114 }
42a9ebb8 115};
cbe41be1
DV
116
117grid.prototype.destroy = function() {
118};
119
6ecc0739 120export default grid;