@thewtex/vtk.js-esm
Version:
Visualization Toolkit for the Web
321 lines (255 loc) • 11.9 kB
JavaScript
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import macro from '../../../macro.js';
import { u as squaredDistance, h as distance } from '../../../vendor/gl-matrix/esm/vec3.js';
function widgetBehavior(publicAPI, model) {
model.classHierarchy.push('vtkSplineWidgetProp');
model.keysDown = {};
model.moveHandle = model.widgetState.getMoveHandle(); // --------------------------------------------------------------------------
// Private methods
// --------------------------------------------------------------------------
var updateHandlesSize = function updateHandlesSize() {
if (model.handleSizeInPixels != null) {
var scale = model.handleSizeInPixels * distance(model.apiSpecificRenderWindow.displayToWorld(0, 0, 0, model.renderer), model.apiSpecificRenderWindow.displayToWorld(1, 0, 0, model.renderer));
model.moveHandle.setScale1(scale);
model.widgetState.getHandleList().forEach(function (handle) {
handle.setScale1(scale);
});
}
}; // --------------------------------------------------------------------------
var addPoint = function addPoint() {
// Commit handle to location
if (!model.lastHandle || model.keysDown.Control || !model.freeHand || squaredDistance(model.moveHandle.getOrigin(), model.lastHandle.getOrigin()) > model.freehandMinDistance * model.freehandMinDistance) {
var _model$lastHandle;
model.lastHandle = model.widgetState.addHandle();
(_model$lastHandle = model.lastHandle).setOrigin.apply(_model$lastHandle, _toConsumableArray(model.moveHandle.getOrigin()));
model.lastHandle.setColor(model.moveHandle.getColor());
model.lastHandle.setScale1(model.moveHandle.getScale1());
if (!model.firstHandle) {
model.firstHandle = model.lastHandle;
}
model.apiSpecificRenderWindow.setCursor('grabbing');
}
}; // --------------------------------------------------------------------------
var getHoveredHandle = function getHoveredHandle() {
var handles = model.widgetState.getHandleList();
return handles.reduce(function (_ref, handle) {
var closestHandle = _ref.closestHandle,
closestDistance = _ref.closestDistance;
var distance = squaredDistance(model.moveHandle.getOrigin(), handle.getOrigin());
if (handle !== model.moveHandle) {
return {
closestHandle: distance < closestDistance ? handle : closestHandle,
closestDistance: distance < closestDistance ? distance : closestDistance
};
}
return {
closestHandle: closestHandle,
closestDistance: closestDistance
};
}, {
closestHandle: null,
closestDistance: model.moveHandle.getScale1() * model.moveHandle.getScale1()
}).closestHandle;
}; // --------------------------------------------------------------------------
// Display 2D
// --------------------------------------------------------------------------
publicAPI.setDisplayCallback = function (callback) {
return model.representations[0].setDisplayCallback(callback);
}; // --------------------------------------------------------------------------
// Public methods
// --------------------------------------------------------------------------
macro.setGet(publicAPI, model, ['freehandMinDistance', 'allowFreehand', 'resolution', 'defaultCursor', 'handleSizeInPixels']); // --------------------------------------------------------------------------
publicAPI.setHandleSizeInPixels = function (size) {
model.factory.setHandleSizeInPixels(size);
updateHandlesSize();
};
publicAPI.setHandleSizeInPixels(model.factory.getHandleSizeInPixels()); // set initial value
// --------------------------------------------------------------------------
publicAPI.setResolution = function (resolution) {
model.factory.setResolution(resolution);
model.representations[1].setResolution(resolution);
};
publicAPI.setResolution(model.factory.getResolution()); // set initial value
// --------------------------------------------------------------------------
publicAPI.getPoints = function () {
return model.representations[1].getOutputData().getPoints().getData();
}; // --------------------------------------------------------------------------
publicAPI.reset = function () {
model.widgetState.clearHandleList();
model.lastHandle = null;
model.firstHandle = null;
}; // --------------------------------------------------------------------------
// Right click: Delete handle
// --------------------------------------------------------------------------
publicAPI.handleRightButtonPress = function (e) {
if (!model.activeState || !model.activeState.getActive() || !model.pickable) {
return macro.VOID;
}
if (model.activeState !== model.moveHandle) {
model.interactor.requestAnimation(publicAPI);
model.activeState.deactivate();
model.widgetState.removeHandle(model.activeState);
model.activeState = null;
model.interactor.cancelAnimation(publicAPI);
} else {
var handle = getHoveredHandle();
if (handle) {
model.widgetState.removeHandle(handle);
} else if (model.lastHandle) {
model.widgetState.removeHandle(model.lastHandle);
var handles = model.widgetState.getHandleList();
model.lastHandle = handles[handles.length - 1];
}
}
publicAPI.invokeInteractionEvent();
return macro.EVENT_ABORT;
}; // --------------------------------------------------------------------------
// Left press: Add new point
// --------------------------------------------------------------------------
publicAPI.handleLeftButtonPress = function (e) {
if (!model.activeState || !model.activeState.getActive() || !model.pickable) {
return macro.VOID;
}
if (model.activeState === model.moveHandle) {
if (model.widgetState.getHandleList().length === 0) {
publicAPI.invokeStartInteractionEvent();
addPoint();
} else {
var hoveredHandle = getHoveredHandle();
if (hoveredHandle && !model.keysDown.Control) {
model.moveHandle.deactivate();
model.moveHandle.setVisible(false);
model.activeState = hoveredHandle;
hoveredHandle.activate();
model.isDragging = true;
model.lastHandle.setVisible(true);
} else {
addPoint();
}
}
model.freeHand = model.allowFreehand && !model.isDragging;
} else {
model.isDragging = true;
model.apiSpecificRenderWindow.setCursor('grabbing');
model.interactor.requestAnimation(publicAPI);
publicAPI.invokeStartInteractionEvent();
}
return macro.EVENT_ABORT;
}; // --------------------------------------------------------------------------
// Left release
// --------------------------------------------------------------------------
publicAPI.handleLeftButtonRelease = function (e) {
if (model.isDragging) {
if (!model.hasFocus) {
model.apiSpecificRenderWindow.setCursor(model.defaultCursor);
model.widgetState.deactivate();
model.interactor.cancelAnimation(publicAPI);
publicAPI.invokeEndInteractionEvent();
} else {
var _model$moveHandle;
(_model$moveHandle = model.moveHandle).setOrigin.apply(_model$moveHandle, _toConsumableArray(model.activeState.getOrigin()));
model.activeState.deactivate();
model.moveHandle.activate();
model.activeState = model.moveHandle;
if (!model.draggedPoint) {
if (squaredDistance(model.moveHandle.getOrigin(), model.lastHandle.getOrigin()) < model.moveHandle.getScale1() * model.moveHandle.getScale1() || squaredDistance(model.moveHandle.getOrigin(), model.firstHandle.getOrigin()) < model.moveHandle.getScale1() * model.moveHandle.getScale1()) {
model.lastHandle.setVisible(true);
publicAPI.loseFocus();
}
}
model.interactor.render();
}
} else if (model.activeState !== model.moveHandle) {
model.widgetState.deactivate();
}
model.freeHand = false;
model.isDragging = false;
model.draggedPoint = false;
return model.hasFocus ? macro.EVENT_ABORT : macro.VOID;
}; // --------------------------------------------------------------------------
// Mouse move: Drag selected handle / Handle follow the mouse
// --------------------------------------------------------------------------
publicAPI.handleMouseMove = function (callData) {
if (!model.activeState || !model.activeState.getActive() || !model.pickable || !model.manipulator) {
return macro.VOID;
}
model.manipulator.setNormal(model.camera.getDirectionOfProjection());
var worldCoords = model.manipulator.handleEvent(callData, model.apiSpecificRenderWindow);
var hoveredHandle = getHoveredHandle();
if (hoveredHandle) {
model.moveHandle.setVisible(false);
if (hoveredHandle !== model.firstHandle) {
model.apiSpecificRenderWindow.setCursor('grabbing');
}
} else if (!model.isDragging && model.hasFocus) {
model.moveHandle.setVisible(true);
model.apiSpecificRenderWindow.setCursor(model.defaultCursor);
}
if (model.lastHandle) {
model.lastHandle.setVisible(true);
}
if (worldCoords.length && (model.isDragging || model.activeState === model.moveHandle)) {
model.activeState.setOrigin(worldCoords);
if (model.isDragging) {
model.draggedPoint = true;
}
if (model.freeHand && model.activeState === model.moveHandle) {
addPoint();
}
}
return model.hasFocus ? macro.EVENT_ABORT : macro.VOID;
}; // --------------------------------------------------------------------------
// Mofifier keys
// --------------------------------------------------------------------------
publicAPI.handleKeyDown = function (_ref2) {
var key = _ref2.key;
model.keysDown[key] = true;
if (!model.hasFocus) {
return;
}
if (key === 'Enter') {
if (model.widgetState.getHandleList().length > 0) {
publicAPI.loseFocus();
}
} else if (key === 'Escape') {
publicAPI.reset();
publicAPI.loseFocus();
} else if (key === 'Delete' || key === 'Backspace') {
if (model.lastHandle) {
model.widgetState.removeHandle(model.lastHandle);
var handleList = model.widgetState.getHandleList();
model.lastHandle = handleList[handleList.length - 1];
}
}
}; // --------------------------------------------------------------------------
publicAPI.handleKeyUp = function (_ref3) {
var key = _ref3.key;
model.keysDown[key] = false;
}; // --------------------------------------------------------------------------
// Focus API - modeHandle follow mouse when widget has focus
// --------------------------------------------------------------------------
publicAPI.grabFocus = function () {
if (!model.hasFocus) {
model.activeState = model.moveHandle;
model.activeState.activate();
model.activeState.setVisible(true);
model.interactor.requestAnimation(publicAPI);
publicAPI.invokeStartInteractionEvent();
updateHandlesSize();
}
model.hasFocus = true;
}; // --------------------------------------------------------------------------
publicAPI.loseFocus = function () {
if (model.hasFocus) {
model.interactor.cancelAnimation(publicAPI);
publicAPI.invokeEndInteractionEvent();
}
model.widgetState.deactivate();
model.moveHandle.deactivate();
model.moveHandle.setVisible(false);
model.activeState = null;
model.interactor.render();
model.hasFocus = false;
};
}
export default widgetBehavior;