UNPKG

@acransac/vtk.js

Version:

Visualization Toolkit for the Web

182 lines (155 loc) 5.98 kB
import macro from 'vtk.js/Sources/macro'; export default function widgetBehavior(publicAPI, model) { model.classHierarchy.push('vtkPolyLineWidgetProp'); let isDragging = null; // -------------------------------------------------------------------------- // Display 2D // -------------------------------------------------------------------------- publicAPI.setDisplayCallback = (callback) => model.representations[0].setDisplayCallback(callback); // -------------------------------------------------------------------------- // Interactor events // -------------------------------------------------------------------------- function ignoreKey(e) { return e.altKey || e.controlKey || e.shiftKey; } // -------------------------------------------------------------------------- // Right click: Delete handle // -------------------------------------------------------------------------- publicAPI.handleRightButtonPress = (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 = (e) => { if ( !model.activeState || !model.activeState.getActive() || !model.pickable || ignoreKey(e) ) { return macro.VOID; } if (model.activeState === model.widgetState.getMoveHandle()) { // Commit handle to location const moveHandle = model.widgetState.getMoveHandle(); const newHandle = model.widgetState.addHandle(); newHandle.setOrigin(...moveHandle.getOrigin()); newHandle.setColor(moveHandle.getColor()); newHandle.setScale1(moveHandle.getScale1()); } else { isDragging = true; model.openGLRenderWindow.setCursor('grabbing'); model.interactor.requestAnimation(publicAPI); } publicAPI.invokeStartInteractionEvent(); return macro.EVENT_ABORT; }; // -------------------------------------------------------------------------- // Mouse move: Drag selected handle / Handle follow the mouse // -------------------------------------------------------------------------- publicAPI.handleMouseMove = (callData) => { if ( model.pickable && model.manipulator && model.activeState && model.activeState.getActive() && !ignoreKey(callData) ) { model.manipulator.setOrigin(model.activeState.getOrigin()); model.manipulator.setNormal(model.camera.getDirectionOfProjection()); const worldCoords = model.manipulator.handleEvent( callData, model.openGLRenderWindow ); if ( worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || isDragging) ) { model.activeState.setOrigin(worldCoords); publicAPI.invokeInteractionEvent(); return macro.EVENT_ABORT; } } if (model.hasFocus) { model.widgetManager.disablePicking(); } return macro.VOID; }; // -------------------------------------------------------------------------- // Left release: Finish drag / Create new handle // -------------------------------------------------------------------------- publicAPI.handleLeftButtonRelease = () => { if (isDragging && model.pickable) { model.openGLRenderWindow.setCursor('pointer'); model.widgetState.deactivate(); model.interactor.cancelAnimation(publicAPI); publicAPI.invokeEndInteractionEvent(); } else if (model.activeState !== model.widgetState.getMoveHandle()) { model.widgetState.deactivate(); } if ( (model.hasFocus && !model.activeState) || (model.activeState && !model.activeState.getActive()) ) { publicAPI.invokeEndInteractionEvent(); model.widgetManager.enablePicking(); model.interactor.render(); } isDragging = false; }; // -------------------------------------------------------------------------- // Escape key: Release focus to switch to drag mode // -------------------------------------------------------------------------- publicAPI.handleKeyDown = ({ key }) => { if (key === 'Escape') { publicAPI.loseFocus(); } }; // -------------------------------------------------------------------------- // Focus API - modeHandle follow mouse when widget has focus // -------------------------------------------------------------------------- publicAPI.grabFocus = () => { 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 = () => { if (model.hasFocus) { model.interactor.cancelAnimation(publicAPI); publicAPI.invokeEndInteractionEvent(); } model.widgetState.deactivate(); model.widgetState.getMoveHandle().deactivate(); model.widgetState.getMoveHandle().setVisible(false); model.activeState = null; model.hasFocus = false; model.widgetManager.enablePicking(); model.interactor.render(); }; }