UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

174 lines (129 loc) 5.51 kB
import macro from '../../macros.js'; var vtkErrorMacro = macro.vtkErrorMacro; // ---------------------------------------------------------------------------- // vtkCanvasView methods // ---------------------------------------------------------------------------- function vtkCanvasView(publicAPI, model) { // Set our className model.classHierarchy.push('vtkCanvasView'); // Auto update style function updateWindow() { // Canvas size if (model._renderable) { model.canvas.setAttribute('width', model.size[0]); model.canvas.setAttribute('height', model.size[1]); } // ImageStream size if (model.viewStream) { // If same size that's a NoOp model.viewStream.setSize(model.size[0], model.size[1]); } // Offscreen ? model.canvas.style.display = model.useOffScreen ? 'none' : 'block'; // Cursor type if (model.el) { model.el.style.cursor = model.cursorVisibility ? model.cursor : 'none'; } } publicAPI.onModified(updateWindow); publicAPI.setContainer = function (el) { if (model.el && model.el !== el) { if (model.canvas.parentNode !== model.el) { vtkErrorMacro('Error: canvas parent node does not match container'); } // Remove canvas from previous container model.el.removeChild(model.canvas); // If the renderer has previously added // a background image, remove it from the DOM. if (model.el.contains(model.bgImage)) { model.el.removeChild(model.bgImage); } } if (model.el !== el) { model.el = el; if (model.el) { model.el.appendChild(model.canvas); } // If the renderer is set to use a background // image, attach it to the DOM. if (model.useBackgroundImage) { model.el.appendChild(model.bgImage); } // Trigger modified() publicAPI.modified(); } }; publicAPI.setBackgroundImage = function (img) { model.bgImage.src = img.src; }; publicAPI.setUseBackgroundImage = function (value) { model.useBackgroundImage = value; // Add or remove the background image from the // DOM as specified. if (model.useBackgroundImage && model.el && !model.el.contains(model.bgImage)) { model.el.appendChild(model.bgImage); } else if (!model.useBackgroundImage && model.el && model.el.contains(model.bgImage)) { model.el.removeChild(model.bgImage); } }; publicAPI.setViewStream = function (stream) { if (model.viewStream === stream) { return false; } if (model.subscription) { model.subscription.unsubscribe(); model.subscription = null; } model.viewStream = stream; if (model.viewStream) { // Enable display of the background image publicAPI.setUseBackgroundImage(true); // Bind to remote stream model.subscription = model.viewStream.onImageReady(function (e) { return publicAPI.setBackgroundImage(e.image); }); model.viewStream.setSize(model.size[0], model.size[1]); model.viewStream.invalidateCache(); model.viewStream.render(); publicAPI.modified(); } return true; }; publicAPI.delete = macro.chain(publicAPI.setViewStream, publicAPI.delete); // -------------------------------------------------------------------------- // Make us look like a View (i.e.: vtkOpenGLRenderWindow) // -------------------------------------------------------------------------- model._renderable = publicAPI; model._renderers = [publicAPI]; publicAPI.traverseAllPasses = function () {}; publicAPI.isInViewport = function () { return true; }; publicAPI.getInteractive = function () { return true; }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- var DEFAULT_VALUES = { canvas: null, size: [300, 300], cursorVisibility: true, cursor: 'pointer', useOffScreen: false, useBackgroundImage: false }; // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES, initialValues); // Create internal instances model.canvas = document.createElement('canvas'); model.canvas.style.width = '100%'; // Create internal bgImage model.bgImage = new Image(); model.bgImage.style.position = 'absolute'; model.bgImage.style.left = '0'; model.bgImage.style.top = '0'; model.bgImage.style.width = '100%'; model.bgImage.style.height = '100%'; model.bgImage.style.zIndex = '-1'; // Inheritance macro.obj(publicAPI, model, initialValues); // Build VTK API macro.get(publicAPI, model, ['useBackgroundImage', '_renderable']); macro.setGet(publicAPI, model, ['canvas', 'cursor', 'useOffScreen', 'interactor']); macro.setGetArray(publicAPI, model, ['size'], 2); macro.getArray(publicAPI, model, ['_renderers']); macro.moveToProtected(publicAPI, model, ['renderable', 'renderers']); // Object methods vtkCanvasView(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = macro.newInstance(extend, 'vtkCanvasView'); // ---------------------------------------------------------------------------- var vtkCanvasView$1 = { newInstance: newInstance, extend: extend }; export { vtkCanvasView$1 as default, extend, newInstance };