UNPKG

@acransac/vtk.js

Version:

Visualization Toolkit for the Web

156 lines (132 loc) 4.9 kB
import macro from 'vtk.js/Sources/macro'; const MAX_POINTS = 2; export default function widgetBehavior(publicAPI, model) { model.classHierarchy.push('vtkDistanceWidgetProp'); 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; } // -------------------------------------------------------------------------- // 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() && model.widgetState.getHandleList().length < MAX_POINTS ) { // 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.hasFocus && model.widgetState.getHandleList().length === MAX_POINTS ) { publicAPI.loseFocus(); return macro.VOID; } if ( model.pickable && model.manipulator && model.activeState && model.activeState.getActive() && !ignoreKey(callData) ) { 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; } } 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; }; // -------------------------------------------------------------------------- // Focus API - modeHandle follow mouse when widget has focus // -------------------------------------------------------------------------- publicAPI.grabFocus = () => { if ( !model.hasFocus && model.widgetState.getHandleList().length < MAX_POINTS ) { 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(); }; }