Allow separate line and dot colors
[capillary:capillary-js.git] / lib / capillary / formatters / raphael.js
1 /* encoding: utf-8
2  *--
3  *   Copyright (C) 2011 Gitorious AS
4  *
5  *   This program is free software: you can redistribute it and/or modify
6  *   it under the terms of the GNU Affero General Public License as published by
7  *   the Free Software Foundation, either version 3 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *   GNU Affero General Public License for more details.
14  *
15  *   You should have received a copy of the GNU Affero General Public License
16  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *++
18  */
19 var capillary = this.capillary || {};
20 capillary.formatters = capillary.formatters || {};
21
22 capillary.formatters.raphael = {
23     bindGraph: function (emitter, options) {
24         options = options || {};
25         var formatter = buster.create(this);
26         formatter.dotRadius = options.dotRadius || 5;
27         formatter.canvas = options.canvas;
28         formatter.dotColors = options.dotColors;
29         formatter.lineColors = options.lineColors || ["#aaa"];
30         formatter.positions = {};
31
32         emitter.bind(formatter, {
33             "graph:dot": "graphDot",
34             "graph:line": "graphLine"
35         });
36
37         return formatter;
38     },
39
40     graphDot: function (svgData, commit, branch) {
41         if (this.isMergeCommit(svgData.cx, svgData.cy)) return;
42         var circle = this.drawCircleAt(svgData.cx, svgData.cy);
43
44         if (this.dotColors && typeof branch.id == "number") {
45             var c = this.dotColors[branch.id % this.dotColors.length];
46             circle.attr({ "fill": c, "stroke": c });
47         }
48     },
49
50     graphLine: function (svgPath, branch) {
51         var path = this.canvas.path(svgPath.path);
52         path.attr({ "stroke": this.lineColors[branch.id % this.lineColors.length] });
53     },
54
55     isMergeCommit: function (x, y) {
56         return !!this.positions[x + "," + y];
57     },
58
59     drawCircleAt: function (x, y) {
60         this.positions[x + "," + y] = true;
61         return this.canvas.circle(x, y, this.dotRadius);
62     }
63 };
64
65 if (typeof module == "object" && typeof require == "function") {
66     var buster = require("buster-core");
67     module.exports = capillary.formatters.raphael;
68 }