conveyal/modeify

View on GitHub
client/components/conveyal/transitive.js/master/lib/renderer/wireframe-renderer.js

Summary

Maintainability
C
1 day
Test Coverage
var d3 = require('d3');
var augment = require('augment');
var debug = require('debug')('transitive:renderer');
var each = require('each');

var Renderer = require('./index');
var RenderedEdge = require('./renderededge');
var PathSegment = require('../core/pathsegment');
var RenderedSegment = require('./renderedsegment');
var Point = require('../point/index');

var interpolateLine = require('../util/interpolate-line');

/**
 * A Renderer subclass for drawing a simplified representation of the graph
 * itself, i.e. just the edges and vertices.
 *
 * @param {Object} the main Transitive object
 */

var WireframeRenderer = augment(Renderer, function(base) {

  this.constructor = function(transitive) {
    base.constructor.call(this, transitive);
  };

  this.render = function() {
    base.render.call(this);

    var graph = this.transitive.network.graph;

    var self = this;

    this.wireframeEdges = [];
    each(graph.edges, function(edge) {
      var wfEdge = new WireframeEdge(edge);
      wfEdge.render(self.transitive.display);
      self.wireframeEdges.push(wfEdge);
    });

    this.wireframeVertices = [];
    each(graph.vertices, function(vertex) {
      var wfVertex = new WireframeVertex(vertex);
      wfVertex.render(self.transitive.display);
      self.wireframeVertices.push(wfVertex);
    });

    this.transitive.refresh();
  };

  this.refresh = function(panning) {
    base.refresh.call(this, panning);
    var self = this;

    each(this.wireframeEdges, function(wfEdge) {
      wfEdge.refresh(self.transitive.display);
    });

    each(this.wireframeVertices, function(wfVertex) {
      wfVertex.refresh(self.transitive.display);
    });
  };

  /**
   * sortElements
   */

  this.sortElements = function() {};

});

/**
 * Expose `WireframeRenderer`
 */

module.exports = WireframeRenderer;

/**
 * WireframeVertex helper class
 */

var WireframeVertex = augment(Point, function(base) {

  this.constructor = function(vertex) {
    base.constructor.call(this, {
      vertex: vertex
    });
  };

  this.getType = function() {
    return "WIREFRAME_VERTEX";
  };

  /**
   * Draw the vertex
   *
   * @param {Display} display
   */

  this.render = function(display) {
    base.render.call(this, display);

    this.initSvg(display);
    this.svgGroup
      .attr('class', 'transitive-sortable')
      .datum({
        owner: this,
        sortableType: 'POINT_WIREFRAME_VERTEX'
      });

    // set up the marker
    this.marker = this.markerSvg.append('circle')
      .datum({
        owner: this
      })
      .attr('class', 'transitive-wireframe-vertex-circle');
  };

  /**
   * Refresh the vertex
   *
   * @param {Display} display
   */

  this.refresh = function(display) {
    var x = display.xScale(this.vertex.x);
    var y = display.yScale(this.vertex.y);
    var translate = 'translate(' + x + ', ' + y + ')';
    this.marker.attr('transform', translate);
    display.styler.styleWireframeVertex(display, this);
  };

});

/**
 * WireframeEdge helper class
 */

var WireframeEdge = augment(Object, function() {

  this.constructor = function(edge) {
    this.edge = edge;
  };

  this.render = function(display) {
    this.line = d3.svg.line() // the line translation function
    .x(function(data, i) {
      return data.x;
    })
      .y(function(data, i) {
        return data.y;
      })
      .interpolate(interpolateLine.bind({
        segment: this,
        display: display
      }));

    this.svgGroup = display.svg.append('g');

    this.lineSvg = this.svgGroup.append('g')
      .attr('class', 'transitive-sortable')
      .datum({
        owner: this,
        sortableType: 'WIREFRAME_EDGE'
      });

    this.lineGraph = this.lineSvg.append('path')
      .attr('class', 'transitive-wireframe-edge-line');
  };

  this.refresh = function(display) {
    this.renderData = this.edge.getRenderCoords(0, 0, display, true);
    var lineData = this.line(this.renderData);
    this.lineGraph.attr('d', lineData);
    display.styler.styleWireframeEdge(display, this);
  };
});