UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

194 lines (141 loc) 7.28 kB
import macro from '../../../macros.js'; function widgetBehavior(publicAPI, model) { model.classHierarchy.push('vtkPolyLineWidgetProp'); model._isDragging = false; // -------------------------------------------------------------------------- // Display 2D // -------------------------------------------------------------------------- publicAPI.setDisplayCallback = function (callback) { return model.representations[0].setDisplayCallback(callback); }; // -------------------------------------------------------------------------- // Interactor events // -------------------------------------------------------------------------- function ignoreKey(e) { return e.altKey || e.controlKey || e.shiftKey; } function updateMoveHandle(callData) { var _model$activeState$ge, _model$activeState, _model$activeState$ge2; var manipulator = (_model$activeState$ge = (_model$activeState = model.activeState) === null || _model$activeState === void 0 ? void 0 : (_model$activeState$ge2 = _model$activeState.getManipulator) === null || _model$activeState$ge2 === void 0 ? void 0 : _model$activeState$ge2.call(_model$activeState)) !== null && _model$activeState$ge !== void 0 ? _model$activeState$ge : model.manipulator; if (!manipulator) { return macro.VOID; } var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow); if (worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || model._isDragging) && model.activeState.setOrigin // e.g. the line is pickable but not draggable ) { model.activeState.setOrigin(worldCoords); publicAPI.invokeInteractionEvent(); return macro.EVENT_ABORT; } return macro.VOID; } // -------------------------------------------------------------------------- // Right click: Delete handle // -------------------------------------------------------------------------- publicAPI.handleRightButtonPress = function (e) { if (!model.activeState || !model.activeState.getActive() || !model.pickable || ignoreKey(e)) { return macro.VOID; } if (model.activeState !== model.widgetState.getMoveHandle()) { model._interactor.requestAnimation(publicAPI); model.activeState.deactivate(); model.widgetState.removeHandle(model.activeState); model.activeState = null; model._interactor.cancelAnimation(publicAPI); } publicAPI.invokeStartInteractionEvent(); publicAPI.invokeInteractionEvent(); publicAPI.invokeEndInteractionEvent(); return macro.EVENT_ABORT; }; // -------------------------------------------------------------------------- // Left press: Select handle to drag // -------------------------------------------------------------------------- publicAPI.handleLeftButtonPress = function (e) { var _model$activeState$ge3, _model$activeState2, _model$activeState2$g; if (!model.activeState || !model.activeState.getActive() || !model.pickable || ignoreKey(e)) { return macro.VOID; } var manipulator = (_model$activeState$ge3 = (_model$activeState2 = model.activeState) === null || _model$activeState2 === void 0 ? void 0 : (_model$activeState2$g = _model$activeState2.getManipulator) === null || _model$activeState2$g === void 0 ? void 0 : _model$activeState2$g.call(_model$activeState2)) !== null && _model$activeState$ge3 !== void 0 ? _model$activeState$ge3 : model.manipulator; if (model.activeState === model.widgetState.getMoveHandle() && manipulator) { updateMoveHandle(e); var moveHandle = model.widgetState.getMoveHandle(); var newHandle = model.widgetState.addHandle(); newHandle.setOrigin(moveHandle.getOrigin()); newHandle.setColor(moveHandle.getColor()); newHandle.setScale1(moveHandle.getScale1()); newHandle.setManipulator(manipulator); } else if (model.dragable) { model._isDragging = true; model._apiSpecificRenderWindow.setCursor('grabbing'); model._interactor.requestAnimation(publicAPI); } publicAPI.invokeStartInteractionEvent(); return macro.EVENT_ABORT; }; // -------------------------------------------------------------------------- // Mouse move: Drag selected handle / Handle follow the mouse // -------------------------------------------------------------------------- publicAPI.handleMouseMove = function (callData) { if (model.pickable && model.dragable && model.activeState && model.activeState.getActive() && !ignoreKey(callData)) { if (updateMoveHandle(callData) === macro.EVENT_ABORT) { return macro.EVENT_ABORT; } } if (model.hasFocus) { model._widgetManager.disablePicking(); } return macro.VOID; }; // -------------------------------------------------------------------------- // Left release: Finish drag / Create new handle // -------------------------------------------------------------------------- publicAPI.handleLeftButtonRelease = function () { if (!model.activeState || !model.activeState.getActive() || !model.pickable) { return macro.VOID; } if (model._isDragging) { model._apiSpecificRenderWindow.setCursor('pointer'); model.widgetState.deactivate(); model._interactor.cancelAnimation(publicAPI); model._isDragging = false; } else if (model.activeState !== model.widgetState.getMoveHandle()) { model.widgetState.deactivate(); } if (model.hasFocus && !model.activeState || model.activeState && !model.activeState.getActive()) { model._widgetManager.enablePicking(); model._interactor.render(); } publicAPI.invokeEndInteractionEvent(); return macro.EVENT_ABORT; }; // -------------------------------------------------------------------------- // Escape key: Release focus to switch to drag mode // -------------------------------------------------------------------------- publicAPI.handleKeyDown = function (_ref) { var key = _ref.key; if (key === 'Escape') { publicAPI.loseFocus(); } }; // -------------------------------------------------------------------------- // Focus API - modeHandle follow mouse when widget has focus // -------------------------------------------------------------------------- publicAPI.grabFocus = function () { if (!model.hasFocus) { model.activeState = model.widgetState.getMoveHandle(); model.activeState.activate(); model.activeState.setVisible(true); model._interactor.requestAnimation(publicAPI); publicAPI.invokeStartInteractionEvent(); } model.hasFocus = true; }; // -------------------------------------------------------------------------- publicAPI.loseFocus = function () { if (model.hasFocus) { model._interactor.cancelAnimation(publicAPI); publicAPI.invokeEndInteractionEvent(); } model.widgetState.deactivate(); model.widgetState.getMoveHandle().deactivate(); model.widgetState.getMoveHandle().setVisible(false); model.widgetState.getMoveHandle().setOrigin(null); model.activeState = null; model.hasFocus = false; model._widgetManager.enablePicking(); model._interactor.render(); }; } export { widgetBehavior as default };