pathFeature.js

var inherit = require('./inherit');
var feature = require('./feature');

/**
 * Specification for pathFeature.
 *
 * @typedef {geo.feature.spec} geo.pathFeature.spec
 * @extends {geo.feature.spec}
 * @property {geo.geoPosition|function} [position] Position of the data.
 *   Default is (data).
 */

/**
 * Style specification for a path feature.
 *
 * The style for components of the stroke are passed `(dataElement,
 * dataIndex)`, where the result applies to the stroke between that data
 * element and the following element (at index `dataIndex + `).
 *
 * @typedef {geo.feature.styleSpec} geo.pathFeature.styleSpec
 * @extends geo.feature.styleSpec
 * @property {boolean|function} [stroke=true] True to stroke the path.
 * @property {geo.geoColor|function} [strokeColor='white'] Color to stroke each
 *   path.
 * @property {number|function} [strokeOpacity=1] Opacity for each path's
 *   stroke.  Opacity is on a [0-1] scale.
 * @property {number|function} [strokeWidth=1] The weight of the path's stroke
 *   in pixels.
 */

/**
 * Create a new instance of class pathFeature.
 *
 * @class
 * @alias geo.pathFeature
 * @extends geo.feature
 * @param {geo.pathFeature.spec} arg
 * @returns {geo.pathFeature}
 */
var pathFeature = function (arg) {
  'use strict';
  if (!(this instanceof pathFeature)) {
    return new pathFeature(arg);
  }
  arg = arg || {};
  feature.call(this, arg);

  var m_this = this,
      s_init = this._init;

  this.featureType = 'path';

  /**
   * Get/Set position.
   *
   * @param {function|geo.geoPosition} [val] If not specified, return the
   *    position accessor.  Otherwise, change the position accessor.
   * @returns {this|function}
   */
  this.position = function (val) {
    if (val === undefined) {
      return m_this.style('position');
    }
    if (val !== m_this.style('position')) {
      m_this.style('position', val);
      m_this.dataTime().modified();
      m_this.modified();
    }
    return m_this;
  };

  /**
   * Initialize.
   *
   * @param {geo.pathFeature.spec} arg The feature specification.
   * @returns {this}
   */
  this._init = function (arg) {
    s_init.call(m_this, arg);

    var defaultStyle = Object.assign(
      {},
      {
        strokeWidth: 1,
        strokeColor: {r: 1.0, g: 1.0, b: 1.0},
        position: (d) => Array.isArray(d) ? {x: d[0], y: d[1], z: d[2] || 0} : d
      },
      arg.style === undefined ? {} : arg.style
    );

    if (arg.position !== undefined) {
      defaultStyle.position = arg.position;
    }
    m_this.style(defaultStyle);
    if (defaultStyle.position) {
      m_this.position(defaultStyle.position);
    }
    m_this.dataTime().modified();
    return m_this;
  };

  this._init(arg);
  return this;
};

inherit(pathFeature, feature);
module.exports = pathFeature;