Source: ui/mouseenterleaveemitter.js

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

/**
 * Class that emits or provides support for mouseover and mouseout 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
 * @param {?boolean} [options.horizontal=false] - Whether to monitor horizontal pan gestures.
 * @param {?boolean} [options.vertical=true] - Whether to monitor vertical pan gestures.
 * @param {?number} [options.threshold=0] - Threshold distance before pan gestures are detected.
 */
function MouseEnterLeaveEmitter(options) {
  if (!(this instanceof MouseEnterLeaveEmitter)) {
    return new MouseEnterLeaveEmitter(options);
  }

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

  this.enter = !!options.enter;
  this.leave = !!options.leave;

  this.bind();
}

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

  defaultOptions: _.merge({}, GestureEmitter.prototype.defaultOptions, {
    enter: true,
    out: true
  }),

  getElementEvents: function getElementEvents() {
    var map = {};
    if (this.enter) {
      map.mouseenter = "onMouseEnter";
    }
    if (this.leave) {
      map.mouseleave = "onMouseLeave";
    }
    return map;
  },

  onMouseEnter: function onMouseEnter(e) {
    this.emit(DecksEvent("gesture:mouse:enter", this, e));
  },

  onMouseLeave: function onMouseLeave(e) {
    this.emit(DecksEvent("gesture:mouse:leave", this, e));
  }
});

module.exports = MouseEnterLeaveEmitter;