awv3
Version:
⚡ AWV3 embedded CAD
265 lines (219 loc) • 10.1 kB
JavaScript
'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;