@kitware/vtk.js
Version:
Visualization Toolkit for the Web
222 lines (174 loc) • 8.73 kB
JavaScript
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import macro from '../../macros.js';
import vtkAbstractWidget from './AbstractWidget.js';
import { extractRenderingComponents } from './WidgetManager.js';
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function NoOp() {} // ----------------------------------------------------------------------------
function vtkAbstractWidgetFactory(publicAPI, model) {
model.classHierarchy.push('vtkAbstractWidgetFactory'); // DO NOT share on the model ------------------------------------------------
var viewToWidget = {}; // DO NOT share on the model ------------------------------------------------
// Can be called with just ViewId after the widget has been registered
publicAPI.getWidgetForView = function (_ref) {
var viewId = _ref.viewId,
renderer = _ref.renderer,
viewType = _ref.viewType,
initialValues = _ref.initialValues;
if (!viewToWidget[viewId]) {
if (!renderer) {
return null;
}
var _extractRenderingComp = extractRenderingComponents(renderer),
interactor = _extractRenderingComp.interactor,
apiSpecificRenderWindow = _extractRenderingComp.apiSpecificRenderWindow,
camera = _extractRenderingComp.camera;
var widgetModel = {};
var widgetPublicAPI = {};
macro.obj(widgetPublicAPI, widgetModel);
Object.assign(widgetPublicAPI, {
onWidgetChange: publicAPI.onWidgetChange
});
Object.assign(widgetModel, {
widgetState: model.widgetState,
manipulator: model.manipulator,
viewType: viewType,
renderer: renderer,
camera: camera,
apiSpecificRenderWindow: apiSpecificRenderWindow,
factory: publicAPI
});
macro.moveToProtected(widgetPublicAPI, widgetModel, ['renderer', 'camera', 'apiSpecificRenderWindow', 'factory']);
macro.get(widgetPublicAPI, widgetModel, ['viewType']);
macro.safeArrays(widgetModel);
vtkAbstractWidget.extend(widgetPublicAPI, widgetModel, initialValues); // Create representations for that view
/* eslint-disable no-shadow */
var widgetInitialValues = initialValues; // Avoid shadowing
widgetModel.representations = publicAPI.getRepresentationsForViewType(viewType).map(function (_ref2) {
var builder = _ref2.builder,
labels = _ref2.labels,
initialValues = _ref2.initialValues;
return builder.newInstance(_objectSpread(_objectSpread({
_parentProp: widgetPublicAPI,
labels: labels
}, initialValues), widgetInitialValues));
});
/* eslint-enable no-shadow */
widgetModel.representations.forEach(function (r) {
r.setInputData(widgetModel.widgetState);
r.getActors().forEach(function (actor) {
widgetModel.actorToRepresentationMap.set(actor, r);
});
});
model.behavior(widgetPublicAPI, widgetModel); // Forward representation methods
['coincidentTopologyParameters'].concat(_toConsumableArray(model.methodsToLink || [])).forEach(function (methodName) {
var _methods;
var set = "set".concat(macro.capitalize(methodName));
var get = "get".concat(macro.capitalize(methodName));
var methods = (_methods = {}, _defineProperty(_methods, methodName, []), _defineProperty(_methods, set, []), _defineProperty(_methods, get, []), _methods);
widgetModel.representations.forEach(function (representation) {
if (representation[methodName]) {
methods[methodName].push(representation[methodName]);
}
if (representation[set]) {
methods[set].push(representation[set]);
}
if (representation[get]) {
methods[get].push(representation[get]);
}
});
Object.keys(methods).forEach(function (name) {
var calls = methods[name];
if (calls.length === 1) {
widgetPublicAPI[name] = calls[0];
} else if (calls.length > 1) {
widgetPublicAPI[name] = macro.chain.apply(macro, _toConsumableArray(calls));
}
});
}); // Custom delete to detach from parent
widgetPublicAPI.delete = macro.chain(function () {
delete viewToWidget[viewId];
}, widgetPublicAPI.delete);
widgetPublicAPI.setInteractor(interactor);
var viewWidget = Object.freeze(widgetPublicAPI);
viewToWidget[viewId] = viewWidget;
return viewWidget;
}
return viewToWidget[viewId];
}; // List of all the views the widget has been registered to.
publicAPI.getViewIds = function () {
return Object.keys(viewToWidget);
};
publicAPI.getViewWidgets = function () {
return Object.values(viewToWidget);
}; // --------------------------------------------------------------------------
// Widget visibility / enable
// --------------------------------------------------------------------------
// Call methods on all its view widgets
publicAPI.setVisibility = function (value) {
var viewIds = Object.keys(viewToWidget);
for (var i = 0; i < viewIds.length; i++) {
viewToWidget[viewIds[i]].setVisibility(value);
}
};
publicAPI.setPickable = function (value) {
var viewIds = Object.keys(viewToWidget);
for (var i = 0; i < viewIds.length; i++) {
viewToWidget[viewIds[i]].setPickable(value);
}
};
publicAPI.setDragable = function (value) {
var viewIds = Object.keys(viewToWidget);
for (var i = 0; i < viewIds.length; i++) {
viewToWidget[viewIds[i]].setDragable(value);
}
};
publicAPI.setContextVisibility = function (value) {
var viewIds = Object.keys(viewToWidget);
for (var i = 0; i < viewIds.length; i++) {
viewToWidget[viewIds[i]].setContextVisibility(value);
}
};
publicAPI.setHandleVisibility = function (value) {
var viewIds = Object.keys(viewToWidget);
for (var i = 0; i < viewIds.length; i++) {
viewToWidget[viewIds[i]].setHandleVisibility(value);
}
}; // --------------------------------------------------------------------------
// Place Widget API
// --------------------------------------------------------------------------
publicAPI.placeWidget = function (bounds) {
return model.widgetState.placeWidget(bounds);
};
publicAPI.getPlaceFactor = function () {
return model.widgetState.getPlaceFactor();
};
publicAPI.setPlaceFactor = function (factor) {
return model.widgetState.setPlaceFactor(factor);
}; // --------------------------------------------------------------------------
// Event Widget API
// --------------------------------------------------------------------------
var unsubscribe = NoOp;
publicAPI.delete = macro.chain(publicAPI.delete, function () {
return unsubscribe();
});
if (model.widgetState) {
unsubscribe = model.widgetState.onModified(function () {
return publicAPI.invokeWidgetChange(model.widgetState);
}).unsubscribe;
}
} // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, initialValues);
macro.obj(publicAPI, model);
macro.get(publicAPI, model, ['widgetState']);
macro.event(publicAPI, model, 'WidgetChange');
vtkAbstractWidgetFactory(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkAbstractWidget'); // ----------------------------------------------------------------------------
var vtkAbstractWidgetFactory$1 = {
newInstance: newInstance,
extend: extend
};
export { vtkAbstractWidgetFactory$1 as default, extend, newInstance };