UNPKG

awv3

Version:
265 lines (219 loc) 10.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends3 = require('babel-runtime/helpers/extends'); var _extends4 = _interopRequireDefault(_extends3); var _error = require('./error'); var Error = _interopRequireWildcard(_error); var _events = require('./events'); var _events2 = _interopRequireDefault(_events); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function createStates(dom, events, listener) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined; return events.reduce(function (prev, name) { dom.addEventListener(name, listener, options); return (0, _extends4.default)({}, prev, (0, _defineProperty3.default)({}, name, { type: name, fulfilled: false, detach: function detach() { return dom.removeEventListener(name, listener); } })); }, {}); } var Dom = function () { function Dom() { var view = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Error.log('View undefined'); var handlers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (0, _classCallCheck3.default)(this, Dom); this.view = view; this.canvas = view.canvas; this.renderer = view.renderer; this.dom = view.dom; this.recent = []; this.enabled = true; this.debounce = true; // Mix in event generic handler _events2.default.mixin(this, handlers); // Add internal dom event handlers this.eventHandler = this.handleEvent.bind(this); this.eventHandlerDefault = this.handleEventDefault.bind(this); var passiveStates = createStates(this.dom, ['mousedown', 'mouseup', 'mousemove', 'mouseout'], this.eventHandler, { passive: true }); var standardStates = createStates(this.dom, ['touchstart', 'touchmove', 'touchend', 'wheel'], this.eventHandlerDefault, { passive: false }); var globalStates = createStates(document, ['keydown', 'keyup'], this.eventHandler, { passive: true }); this.states = (0, _extends4.default)({}, passiveStates, standardStates, globalStates); // Common last-state-data can be accessed here this.mouse = {}; this.wheel = {}; this.touch = {}; this.keys = {}; // Array of changes to be called on next update this.changes = []; } // This seems to be buggy, doesn't detach mouse event handlers for some weird reason (0, _createClass3.default)(Dom, [{ key: 'detach', value: function detach() { for (var key in this.states) { this.states[key].detach(); } } }, { key: 'update', value: function update() { if (this.changes.length > 0) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(this.changes), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var change = _step.value; this.emit(change.type, change); change.fulfilled = false; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } this.changes = []; } } }, { key: 'handleEventDefault', value: function handleEventDefault(event) { event.preventDefault(); this.handleEvent(event); } }, { key: 'handleEvent', value: function handleEvent(event) { if (!this.enabled) return; var type = event.type, pageX = event.pageX, pageY = event.pageY, clientX = event.clientX, clientY = event.clientY, button = event.button, which = event.which, deltaMode = event.deltaMode, deltaY = event.deltaY; var state = this.states[type]; if (this.debounce && state.fulfilled) return; // Wheel state.delta = deltaY * (deltaMode ? -1 : -0.03); // Generic state.fulfilled = true; state.pageX = pageX; state.pageY = pageY; state.clientX = clientX; state.clientY = clientY; state.offsetX = pageX - this.renderer.offset.left - this.view.left; state.offsetY = pageY - this.renderer.offset.top - this.view.top; // Touch state.touches = []; if (!!event.touches) { var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)([].slice.call(event.touches)), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var item = _step2.value; pageX = item.pageX; pageY = item.pageY; clientX = item.clientX; clientY = item.clientY; state.touches.push({ clientX: clientX, clientY: clientY, offsetX: pageX - this.renderer.offset.left - this.view.left, offsetY: pageY - this.renderer.offset.top - this.view.top, pageX: pageX, pageY: pageY }); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } state.touch = true; state.multitouch = state.touches.length > 1; if (state.touches.length > 0) { state.offsetX = this.touch.offsetX = state.touches[0].offsetX; state.offsetY = this.touch.offsetX = state.touches[0].offsetY; } else { state.offsetX = this.touch.offsetX; state.offsetY = this.touch.offsetX; } } state.button = button; state.which = which; state.event = event; this.changes.push(state); var keyToName = { 16: "shift", 17: "control", 18: "alt" }; if (type === 'mousedown') { this.mouse.down = true; this.mouse.button = button; document.addEventListener('mouseup', this.eventHandlerDefault, false); document.addEventListener('mousemove', this.eventHandlerDefault, false); } else if (type === 'mouseup') { this.mouse.down = false; this.mouse.button = button; document.removeEventListener('mouseup', this.eventHandlerDefault); document.removeEventListener('mousemove', this.eventHandlerDefault); } else if (type === 'touchstart') { this.touch.down = true; document.addEventListener('touchend', this.eventHandlerDefault, false); document.addEventListener('touchmove', this.eventHandlerDefault, false); } else if (type === 'touchend') { this.touch.down = false; document.removeEventListener('touchend', this.eventHandlerDefault); document.removeEventListener('touchmove', this.eventHandlerDefault); } else if (type === 'keydown') { var name = keyToName[which]; if (name) this.keys[name] = true; } else if (type === 'keyup') { var _name = keyToName[which]; if (_name) this.keys[_name] = false; } this.recent[state.type] = state; if (!this.debounce) this.update(); } }]); return Dom; }(); exports.default = Dom;