UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

167 lines (155 loc) 4.83 kB
import { m as macro } from '../../macros2.js'; import vtkWidgetState from './WidgetState.js'; import bounds from './StateBuilder/boundsMixin.js'; import color from './StateBuilder/colorMixin.js'; import color3 from './StateBuilder/color3Mixin.js'; import corner from './StateBuilder/cornerMixin.js'; import direction from './StateBuilder/directionMixin.js'; import manipulator from './StateBuilder/manipulatorMixin.js'; import name from './StateBuilder/nameMixin.js'; import orientation from './StateBuilder/orientationMixin.js'; import origin from './StateBuilder/originMixin.js'; import scale1 from './StateBuilder/scale1Mixin.js'; import scale3 from './StateBuilder/scale3Mixin.js'; import text from './StateBuilder/textMixin.js'; import visible from './StateBuilder/visibleMixin.js'; import shape from './StateBuilder/shapeMixin.js'; const { vtkErrorMacro } = macro; // ---------------------------------------------------------------------------- // Global type lookup map // ---------------------------------------------------------------------------- const MIXINS = { bounds, color, color3, corner, direction, manipulator, name, orientation, origin, scale1, scale3, text, visible, shape }; // ---------------------------------------------------------------------------- function newInstance(mixins, initialValues, publicAPI = {}, model = {}, skipWidgetState = false) { if (!skipWidgetState) { vtkWidgetState.extend(publicAPI, model, initialValues); } for (let i = 0; i < mixins.length; i++) { const mixin = MIXINS[mixins[i]]; if (mixin) { mixin.extend(publicAPI, model, initialValues); } else { vtkErrorMacro('Invalid mixin name:', mixins[i]); } } macro.safeArrays(model); return Object.freeze(publicAPI); } // ---------------------------------------------------------------------------- class Builder { constructor() { this.publicAPI = {}; this.model = {}; vtkWidgetState.extend(this.publicAPI, this.model); // The root state should always have the bounds/placeWidget/widgetFactor bounds.extend(this.publicAPI, this.model); } /* eslint-disable no-shadow */ addDynamicMixinState({ labels, mixins, name, initialValues }) { const listName = `${name}List`; this.model[listName] = []; // Create new Instance method this.publicAPI[`add${macro.capitalize(name)}`] = values => { const instance = newInstance(mixins, { ...initialValues, ...values }); this.publicAPI.bindState(instance, labels); this.model[listName].push(instance); this.publicAPI.modified(); return instance; }; this.publicAPI[`remove${macro.capitalize(name)}`] = instanceOrIndex => { let removeIndex = this.model[listName].indexOf(instanceOrIndex); if (removeIndex === -1 && instanceOrIndex < this.model[listName].length) { removeIndex = instanceOrIndex; } const instance = this.model[listName][removeIndex]; if (instance) { this.publicAPI.unbindState(instance); } this.model[listName].splice(removeIndex, 1); this.publicAPI.modified(); }; this.publicAPI[`get${macro.capitalize(name)}List`] = () => this.model[listName].slice(); this.publicAPI[`clear${macro.capitalize(name)}List`] = () => { while (this.model[listName].length) { const instance = this.model[listName].pop(); if (instance) { this.publicAPI.unbindState(instance); } } this.publicAPI.modified(); }; return this; } addStateFromMixin({ labels, mixins, name, initialValues }) { const instance = newInstance(mixins, initialValues); this.model[name] = instance; this.publicAPI.bindState(instance, labels); macro.setGet(this.publicAPI, this.model, [name]); return this; } addStateFromInstance({ labels, name, instance }) { this.model[name] = instance; this.publicAPI.bindState(instance, labels); macro.setGet(this.publicAPI, this.model, [name]); return this; } addField({ name, initialValue }) { if (Array.isArray(initialValue)) { macro.setGetArray(this.publicAPI, this.model, [name], initialValue.length); } else { macro.setGet(this.publicAPI, this.model, [name]); } this.model[name] = initialValue; return this; } build(...mixins) { return newInstance(mixins, {}, this.publicAPI, this.model, true); } } // ---------------------------------------------------------------------------- // Public API // ---------------------------------------------------------------------------- function createBuilder() { return new Builder(); } var vtkStateBuilder = { createBuilder }; export { createBuilder, vtkStateBuilder as default };