Rift.IO OSM R1 Initial Submission
[osm/UI.git] / skyquake / plugins / composer / src / src / libraries / graph / PathBuilder.js
diff --git a/skyquake/plugins/composer/src/src/libraries/graph/PathBuilder.js b/skyquake/plugins/composer/src/src/libraries/graph/PathBuilder.js
new file mode 100644 (file)
index 0000000..70e9be7
--- /dev/null
@@ -0,0 +1,177 @@
+
+/**
+ * Created by onvelocity on 2/10/16.
+ */
+
+export default class PathBuilder {
+
+       constructor() {
+               this.path = [];
+       }
+
+       static archFlags(override) {
+               return Object.assign({xAxisRotation: 0, largeArcFlag: 0, sweepFlag: 0}, override);
+       }
+
+       M(x, y, info = {}) {
+               this.path.push({x: x, y: y, cmd: 'M', info: info});
+               return this;
+       }
+
+       m(dx, dy, info = {}) {
+               this.path.push({dx: dx, dy: dy, cmd: 'm', info: info});
+               return this;
+       }
+
+       L(x, y, info = {}) {
+               this.path.push({x: x, y: y, cmd: 'L', info: info});
+               return this;
+       }
+
+       l(dx, dy, info = {}) {
+               this.path.push({dx: dx, dy: dy, cmd: 'l', info: info});
+               return this;
+       }
+
+       H(x, info = {}) {
+               this.path.push({x: x, cmd: 'H', info: info});
+               return this;
+       }
+
+       h(dx, info = {}) {
+               this.path.push({dx: dx, cmd: 'h', info: info});
+               return this;
+       }
+
+       V(y, info = {}) {
+               this.path.push({y: y, cmd: 'V', info: info});
+               return this;
+       }
+
+       v(dy, info = {}) {
+               this.path.push({dy: dy, cmd: 'v', info: info});
+               return this;
+       }
+
+       C(x1, y1, x2, y2, x, y, info = {}) {
+               this.path.push({x1: x1, y1: y1, x2: x2, y2: y2, x: x, y: y, cmd: 'C', info: info});
+               return this;
+       }
+
+       c(dx1, dy1, dx2, dy2, dx, dy, info = {}) {
+               this.path.push({dx1: dx1, dy1: dy1, dx2: dx2, dy2: dy2, dx: dx, dy: dy, cmd: 'c', info: info});
+               return this;
+       }
+
+       Q(x1, y1, x, y, info = {}) {
+               this.path.push({x1: x1, y1: y1, x: x, y: y, cmd: 'Q', info: info});
+               return this;
+       }
+
+       q(x1, y1, x, y, info = {}) {
+               this.path.push({x1: x1, y1: y1, x: x, y: y, cmd: 'q', info: info});
+               return this;
+       }
+
+       T(x, y, info = {}) {
+               this.path.push({x: x, y: y, cmd: 'T', info: info});
+               return this;
+       }
+
+       A (rx, ry, x, y, info = {xAxisRotation: 0, largeArcFlag: 0, sweepFlag: 0}) {
+               info = PathBuilder.archFlags(info);
+               this.path.push({rx: rx, ry: ry, 'x-axis-rotation': info.xAxisRotation,  'large-arc-flag': info.largeArcFlag, 'sweep-flag': info.sweepFlag, x: x, y: y, cmd: 'A', info: info});
+               return this;
+       }
+
+       S(x2, y2, x, y, info = {}) {
+               this.path.push({x2: x2, y2: y2, x: x, y: y, cmd: 'S', info: info});
+               return this;
+       }
+
+       H(x, info = {}) {
+               this.path.push({x: x, info: info});
+               return this;
+       }
+
+       h(dx, info = {}) {
+               this.path.push({dx: dx, info: info});
+               return this;
+       }
+
+       V(y, info = {}) {
+               this.path.push({y: y, info: info});
+               return this;
+       }
+
+       v(dy, info = {}) {
+               this.path.push({dy: dy, info: info});
+               return this;
+       }
+
+       get Z() {
+               this.path.push({cmd: 'Z'});
+               return this;
+       }
+
+       last() {
+               return this.path[this.path.length - 1];
+       }
+
+       findPrevious(filter) {
+               return this.path.splice().reverse().reduce((r, d) => {
+                       if (r) {
+                               return r;
+                       }
+                       if (filter(d)) {
+                               return d
+                       }
+               }, null);
+       }
+
+       insertBeforeLast() {
+               if (this.path.length < 3) {
+                       return this;
+               }
+               const last = this.path.pop();
+               this.path.splice(this.length - 2, 0, last);
+               return this;
+       }
+
+       concat(pathBuilder) {
+               this.path = this.path.filter(d => d.cmd !== 'Z').concat(pathBuilder);
+               return this;
+       }
+
+       toString() {
+               return this.path.reduce((r, d) => {
+                       return r + ' ' + d.cmd + ' ' + Object.keys(d).filter(k => !(k == 'cmd' || k === 'info')).map(k => d[k]).reduce((r, val) => r + ' ' + val, '');
+               }, '').replace(/\s+/g, ' ').trim();
+       }
+
+       get length() {
+               return this.path.length;
+       }
+
+       static descriptorPath(borderRadius = 20, height = 55, width = 250) {
+               const path = new PathBuilder();
+               borderRadius = Math.max(0, borderRadius);
+               width = Math.max(borderRadius, width) - borderRadius;
+               height = Math.max(borderRadius, height) - (borderRadius);
+               const iconWidthHeight = 40;
+               return path.M(0, 0)
+                       // top
+                       .L(width, 0).C(width, 0, width + borderRadius, 0, width + borderRadius, borderRadius)
+                       // right
+                       .L(width + borderRadius, height).C(width + borderRadius, height, width + borderRadius, height + borderRadius, width, height + borderRadius)
+                       // bottom
+                       .L(0, height + borderRadius).C(0, height + borderRadius, 0 - borderRadius, height + borderRadius, 0 - borderRadius, height)
+                       // left
+                       .L(0 - borderRadius, 0 + borderRadius).C(0 - borderRadius, 0 + borderRadius, 0 - borderRadius, 0, 0, 0)
+                       // icon separator
+                       //.L(iconWidthHeight, 0).L(iconWidthHeight, iconWidthHeight + (borderRadius + height - iconWidthHeight))
+                       // label separator
+                       //.L(iconWidthHeight, iconWidthHeight).L(0 - borderRadius, iconWidthHeight);
+       }
+
+}