UNPKG

@thewtex/vtk.js-esm

Version:

Visualization Toolkit for the Web

185 lines (142 loc) 6.47 kB
import _defineProperty from '@babel/runtime/helpers/defineProperty'; import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; import { obj, event, setGet, newInstance as newInstance$1 } from '../../macro.js'; import vtkCompositeMouseManipulator from './CompositeMouseManipulator.js'; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var OUTSIDE_BOUNDS = [-2, -1, -2, -1]; var DEFAULT_STYLE = { position: 'absolute', zIndex: 1, border: '2px solid #F44336', backgroundColor: 'rgba(0, 0, 0, 0.1)', borderRadius: '4px', boxSizing: 'border-box' }; function applyStyle(element, style) { Object.keys(style).forEach(function (name) { element.style[name] = style[name]; }); } // ---------------------------------------------------------------------------- // vtkMouseBoxSelectionManipulator methods // ---------------------------------------------------------------------------- function vtkMouseBoxSelectionManipulator(publicAPI, model) { // Set our className model.classHierarchy.push('vtkMouseBoxSelectionManipulator'); // Private variable var view = null; var container = null; var previousPosition = null; var currentPosition = null; var div = null; var inDOM = false; function getBounds() { if (!previousPosition || !currentPosition) { return OUTSIDE_BOUNDS; } return [Math.min(previousPosition.x, currentPosition.x), Math.max(previousPosition.x, currentPosition.x), Math.min(previousPosition.y, currentPosition.y), Math.max(previousPosition.y, currentPosition.y)]; } function applyStyleToDiv() { if (!view || !container) { return; } var _view$getSize = view.getSize(), _view$getSize2 = _slicedToArray(_view$getSize, 2), viewWidth = _view$getSize2[0], viewHeight = _view$getSize2[1]; var _container$getBoundin = container.getBoundingClientRect(), width = _container$getBoundin.width, height = _container$getBoundin.height; var _getBounds = getBounds(), _getBounds2 = _slicedToArray(_getBounds, 4), xMin = _getBounds2[0], xMax = _getBounds2[1], yMin = _getBounds2[2], yMax = _getBounds2[3]; div.style.left = "".concat(width * xMin / viewWidth, "px"); div.style.top = "".concat(height - height * yMax / viewHeight, "px"); div.style.width = "".concat(width * (xMax - xMin) / viewWidth, "px"); div.style.height = "".concat(height * (yMax - yMin) / viewHeight, "px"); } //------------------------------------------------------------------------- publicAPI.onButtonDown = function (interactor, renderer, position) { previousPosition = position; if (model.renderSelection) { // Need window size and location to convert to style if (!view) { view = interactor.getView(); } if (!container && view) { container = view.getContainer(); } if (!div) { div = document.createElement('div'); applyStyle(div, model.selectionStyle); } applyStyleToDiv(); if (container && !inDOM) { inDOM = true; container.appendChild(div); } } }; //------------------------------------------------------------------------- publicAPI.onMouseMove = function (interactor, renderer, position) { if (!previousPosition) { return; } if (!position) { return; } currentPosition = position; publicAPI.invokeBoxSelectInput({ view: view, container: container, selection: getBounds() }); if (model.renderSelection) { applyStyleToDiv(); } }; //------------------------------------------------------------------------- publicAPI.onButtonUp = function (interactor, renderer) { if (!previousPosition || !currentPosition) { return; } publicAPI.invokeBoxSelectChange({ view: view, container: container, selection: getBounds() }); if (inDOM) { div.parentElement.removeChild(div); inDOM = false; } // clear positions view = null; container = null; previousPosition = null; currentPosition = null; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- function DEFAULT_VALUES(initialValues) { return _objectSpread(_objectSpread({ renderSelection: true }, initialValues), {}, { selectionStyle: _objectSpread(_objectSpread({}, DEFAULT_STYLE), initialValues.selectionStyle) }); } // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES(initialValues)); // Inheritance obj(publicAPI, model); vtkCompositeMouseManipulator.extend(publicAPI, model, initialValues); event(publicAPI, model, 'BoxSelectChange'); // Trigger at release event(publicAPI, model, 'BoxSelectInput'); // Trigger while dragging setGet(publicAPI, model, ['renderSelection', 'selectionStyle']); // Object specific methods vtkMouseBoxSelectionManipulator(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = newInstance$1(extend, 'vtkMouseBoxSelectionManipulator'); // ---------------------------------------------------------------------------- var vtkMouseBoxSelectorManipulator = { newInstance: newInstance, extend: extend }; export default vtkMouseBoxSelectorManipulator; export { extend, newInstance };