@kitware/vtk.js
Version:
Visualization Toolkit for the Web
154 lines (130 loc) • 5.28 kB
JavaScript
import { m as macro } from '../../macros2.js';
import { s as style } from './CornerAnnotation/CornerAnnotation.module.css.js';
function noOp() {}
const KEY_MAPPING = {
nw: 'northWestContainer',
n: 'northContainer',
ne: 'northEastContainer',
w: 'westContainer',
e: 'eastContainer',
sw: 'southWestContainer',
s: 'southContainer',
se: 'southEastContainer'
};
// ----------------------------------------------------------------------------
// Static helpers
// ----------------------------------------------------------------------------
function get(path, obj, fb = `$\{${path}}`) {
return path.split('.').reduce((res, key) => res[key] !== undefined ? res[key] : fb, obj);
}
/* from https://gist.github.com/smeijer/6580740a0ff468960a5257108af1384e */
function applyTemplate(template, map, fallback) {
return template.replace(/\${([^{]+)}/g, match => {
const path = match.substr(2, match.length - 3).trim();
return get(path, map, fallback);
});
}
// ----------------------------------------------------------------------------
// vtkCornerAnnotation methods
// ----------------------------------------------------------------------------
function vtkCornerAnnotation(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkCornerAnnotation');
// Create instance specific container
if (!model.templates) {
model.templates = {};
}
if (!model.metadata) {
model.metadata = {};
}
model.annotationContainer = document.createElement('div');
model.annotationContainer.setAttribute('class', style.container);
model.annotationContainer.innerHTML = `
<div class="${style.topRow}">
<div class="js-nw ${style.northWest}"></div>
<div class="js-n ${style.north}"></div>
<div class="js-ne ${style.northEast}"></div>
</div>
<div class="${style.middleRow}">
<div class="js-w ${style.west}"></div>
<div class="js-e ${style.east}"></div>
</div>
<div class="${style.bottomRow}">
<div class="js-sw ${style.southWest}"></div>
<div class="js-s ${style.south}"></div>
<div class="js-se ${style.southEast}"></div>
</div>`;
// Extract various containers
model.northWestContainer = model.annotationContainer.querySelector('.js-nw');
model.northContainer = model.annotationContainer.querySelector('.js-n');
model.northEastContainer = model.annotationContainer.querySelector('.js-ne');
model.westContainer = model.annotationContainer.querySelector('.js-w');
model.eastContainer = model.annotationContainer.querySelector('.js-e');
model.southWestContainer = model.annotationContainer.querySelector('.js-sw');
model.southContainer = model.annotationContainer.querySelector('.js-s');
model.southEastContainer = model.annotationContainer.querySelector('.js-se');
// --------------------------------------------------------------------------
// Private methods
// --------------------------------------------------------------------------
function updateAnnotations() {
const keys = Object.keys(model.templates);
let count = keys.length;
while (count--) {
const el = model[KEY_MAPPING[keys[count]]];
const fn = model.templates[keys[count]];
if (el && fn) {
el.innerHTML = fn(model.metadata);
}
}
}
// --------------------------------------------------------------------------
publicAPI.setContainer = el => {
if (model.container && model.container !== el) {
model.container.removeChild(model.annotationContainer);
}
if (model.container !== el) {
model.container = el;
if (model.container) {
model.container.appendChild(model.annotationContainer);
publicAPI.resize();
}
publicAPI.modified();
}
};
publicAPI.resize = noOp;
publicAPI.updateTemplates = templates => {
model.templates = Object.assign(model.templates, templates);
updateAnnotations();
publicAPI.modified();
};
publicAPI.updateMetadata = metadata => {
model.metadata = Object.assign(model.metadata, metadata);
updateAnnotations();
publicAPI.modified();
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
templates: null,
metadata: null
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Object methods
macro.obj(publicAPI, model);
macro.get(publicAPI, model, ['annotationContainer', 'northWestContainer', 'northContainer', 'northEastContainer', 'westContainer', 'eastContainer', 'southWestContainer', 'southContainer', 'southEastContainer', 'metadata']);
// Object specific methods
vtkCornerAnnotation(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkCornerAnnotation');
// ----------------------------------------------------------------------------
var vtkCornerAnnotation$1 = {
newInstance,
extend,
applyTemplate
};
export { vtkCornerAnnotation$1 as default, extend, newInstance };