Source: ui/pressemitter.js

var _ = require("lodash");
var GestureEmitter = require("./gestureemitter");
var DecksEvent = require("../events/decksevent");

/**
 * Gesture emitter that monitors a single element for press (long-touch/hold) events.
 *
 * @class
 * @extends GestureEmitter
 * @param {!Object} options - Additional options
 * @param {?(Emitter|Object)} [options.emitter={}] - Emitter instance or options on which to emit events
 * @param {!Element} options.element - Element for which to bind events
 * @param {!Hammer} options.hammer - Hammer instance for the element (required by base class)
 * @param {?boolean} [options.enabled=false] - Whether to enable this emitter
 */
function PressEmitter(options) {
  if (!(this instanceof PressEmitter)) {
    return new PressEmitter(options);
  }

  options = _.merge({}, this.defaultOptions, options);

  GestureEmitter.call(this, options);

  this.threshold = options.threshold;
  this.time = options.time;

  this.hammer.get("press").set({
    threshold: this.threshold,
    time: this.time
  });

  this.bind();
}

PressEmitter.prototype = _.create(GestureEmitter.prototype, /** @lends PressEmitter.prototype */ {
  constructor: PressEmitter,

  /**
   * Default options
   */
  defaultOptions: _.merge({}, GestureEmitter.prototype.defaultOptions, {
    threshold: 5,
    time: 1000
  }),

  /**
   * Gets a map of hammer events to monitor for press-related gestures.
   */
  getHammerEvents: function getHammerEvents() {
    return {
      "press": "onPress"
    };
  },

  /**
   * Called when a Hammer.js press event occurs
   *
   * @param e - Hammer.js event Object
   * @fires PressEmitter#gesture:press
   */
  onPress: function onPress(e) {
    /**
     * Event for a press (long-touch/hold) gesture.
     *
     * @event PressEmitter#gesture:press
     * @type {DecksEvent}
     * @property {String} type - The event type string
     * @property {PressEmitter} sender - The PressEmitter instance sending the event.
     * @property {*} data - The Hammer.js press event object.
     */
    this.emit(DecksEvent("gesture:press", this, e));
  }
});

module.exports = PressEmitter;