@kitware/vtk.js
Version:
Visualization Toolkit for the Web
194 lines (141 loc) • 7.28 kB
JavaScript
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 };