Map/DragPoints.js

/*global require*/
"use strict";

var defined = require("terriajs-cesium/Source/Core/defined").default;
var CesiumDragPoints = require("../Map/CesiumDragPoints");
var LeafletDragPoints = require("../Map/LeafletDragPoints");
var ViewerMode = require("../Models/ViewerMode");

/**
 * Callback for when a point is moved.
 * @callback PointMovedCallback
 * @param {CustomDataSource} customDataSource Contains all point entities that user has selected so far
 */

/**
 * For letting user drag existing points, altering their position without creating or destroying them. Works for all
 *
 * @alias DragPoints
 * @constructor
 *
 * ViewerModes.
 * @param {Terria} terria The Terria instance.
 * @param {PointMovedCallback} pointMovedCallback A function that is called when a point is moved.
 */
var DragPoints = function(terria, pointMovedCallback) {
  this._terria = terria;
  this._createDragPointsHelper(pointMovedCallback);

  var that = this;
  // It's possible to change viewerMode while mid-drawing, but in that case we need to change the dragPoints helper.
  this._terria.afterViewerChanged.addEventListener(function() {
    that._createDragPointsHelper(pointMovedCallback);
    that.setUp();
  });
};

/**
 * Set up the drag point helper. Note that this might happen when a drawing exists if the user has changed viewerMode.
 */
DragPoints.prototype.setUp = function() {
  this._dragPointsHelper.setUp();
  if (defined(this._entities)) {
    this._dragPointsHelper.updateDraggableObjects(this._entities);
  }
};

/**
 * The drag count is an indication of how long the user dragged for. If it's really small, perhaps the user clicked,
 * but a mousedown/mousemove/mouseup event trio was triggered anyway. It solves a problem where in leaflet the click
 * event triggers even if the point has been dragged because it lets us determine whether the point was really dragged.
 */
DragPoints.prototype.getDragCount = function() {
  return this._dragPointsHelper.dragCount;
};

/**
 * Reset drag count to 0, to indicate the user hasn't dragged.
 */
DragPoints.prototype.resetDragCount = function() {
  this._dragPointsHelper.dragCount = 0;
};

/**
 * Update the list of draggable objects with a new list of entities that are able to be dragged. We are only interested
 * in entities that the user has drawn.
 *
 * @param {CustomDataSource} entities Entities that user has drawn on the map.
 */
DragPoints.prototype.updateDraggableObjects = function(entities) {
  this._entities = entities;
  this._dragPointsHelper.updateDraggableObjects(entities);
};

/**
 * Create the drag point helper based on which viewerMode is active.
 * @param {PointMovedCallback} pointMovedCallback A function that is called when a point is moved.
 * @private
 */
DragPoints.prototype._createDragPointsHelper = function(pointMovedCallback) {
  if (defined(this._dragPointsHelper)) {
    this._dragPointsHelper.destroy();
  }
  if (this._terria.viewerMode === ViewerMode.Leaflet) {
    this._dragPointsHelper = new LeafletDragPoints(
      this._terria,
      pointMovedCallback
    );
  } else {
    this._dragPointsHelper = new CesiumDragPoints(
      this._terria,
      pointMovedCallback
    );
  }
};

module.exports = DragPoints;