webglimpse
Version:
Webglimpse is a data visualization library for the web.
102 lines • 15.2 kB
JavaScript
/*
* Copyright (c) 2014, Metron, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import { Pane } from '../core';
import { newBackgroundPainter } from '../misc';
import { hasval } from '../util/util';
export function newInsets(...insets) {
switch (insets.length) {
case 1:
return {
top: insets[0],
right: insets[0],
bottom: insets[0],
left: insets[0]
};
case 2:
return {
top: insets[0],
right: insets[1],
bottom: insets[0],
left: insets[1]
};
case 3:
return {
top: insets[0],
right: insets[1],
bottom: insets[2],
left: insets[1]
};
case 4:
return {
top: insets[0],
right: insets[1],
bottom: insets[2],
left: insets[3]
};
default:
throw new Error('Expected 1, 2, 3, or 4 args, but found ' + insets.length);
}
}
export function newInsetLayout(insets) {
return {
updatePrefSize: function (parentPrefSize, children) {
if (children.length === 0) {
parentPrefSize.w = insets.left + insets.right;
parentPrefSize.h = insets.top + insets.bottom;
}
else if (children.length === 1) {
const childPrefSize = children[0].prefSize;
parentPrefSize.w = (hasval(childPrefSize.w) ? childPrefSize.w + insets.left + insets.right : null);
parentPrefSize.h = (hasval(childPrefSize.h) ? childPrefSize.h + insets.top + insets.bottom : null);
}
else if (children.length > 1) {
throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children');
}
},
updateChildViewports: function (children, parentViewport) {
if (children.length === 1) {
const childViewport = children[0].viewport;
childViewport.setEdges(parentViewport.iStart + insets.left, parentViewport.iEnd - insets.right, parentViewport.jStart + insets.bottom, parentViewport.jEnd - insets.top);
}
else if (children.length > 1) {
throw new Error('Inset layout works with at most 1 child, but pane has ' + this.children.length + ' children');
}
}
};
}
export function newInsetPane(pane, insets, bgColor = null, consumeInputEvents = true) {
const insetPane = new Pane(newInsetLayout(insets), consumeInputEvents);
if (hasval(bgColor)) {
insetPane.addPainter(newBackgroundPainter(bgColor));
}
insetPane.addPane(pane);
return insetPane;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zZXRfbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3dlYmdsaW1wc2UvbGF5b3V0L2luc2V0X2xheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE9BQU8sRUFBdUIsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBV3RDLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBRyxNQUFnQjtJQUN6QyxRQUFRLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFFbkIsS0FBSyxDQUFDO1lBQ0YsT0FBTztnQkFDSCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDZCxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQ2xCLENBQUM7UUFFTixLQUFLLENBQUM7WUFDRixPQUFPO2dCQUNILEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNkLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDbEIsQ0FBQztRQUVOLEtBQUssQ0FBQztZQUNGLE9BQU87Z0JBQ0gsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLENB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Q2pCLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUN2RDtJQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgTWV0cm9uLCBJbmMuXHJcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sXHJcbiAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcclxuICpcclxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzXHJcbiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxyXG4gKlxyXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXHJcbiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cclxuICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXHJcbiAqXHJcbiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXIgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzXHJcbiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0XHJcbiAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCIgQU5EXHJcbiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXHJcbiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcclxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1JcclxuICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXHJcbiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcclxuICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OXHJcbiAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXHJcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXHJcbiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxyXG4gKi9cclxuaW1wb3J0IHsgTGF5b3V0LCBMYXlvdXRFbnRyeSwgUGFuZSB9IGZyb20gJy4uL2NvcmUnO1xyXG5pbXBvcnQgeyBTaXplLCBCb3VuZHNVbm1vZGlmaWFibGUgfSBmcm9tICcuLi9ib3VuZHMnO1xyXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL2NvbG9yJztcclxuaW1wb3J0IHsgbmV3QmFja2dyb3VuZFBhaW50ZXIgfSBmcm9tICcuLi9taXNjJztcclxuaW1wb3J0IHsgaGFzdmFsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEluc2V0cyB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIHJpZ2h0OiBudW1iZXI7XHJcbiAgICBib3R0b206IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdJbnNldHMoLi4uaW5zZXRzOiBudW1iZXJbXSk6IEluc2V0cyB7XHJcbiAgICBzd2l0Y2ggKGluc2V0cy5sZW5ndGgpIHtcclxuXHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzBdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMF1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMV1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMl0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbMV1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdG9wOiBpbnNldHNbMF0sXHJcbiAgICAgICAgICAgICAgICByaWdodDogaW5zZXRzWzFdLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBpbnNldHNbMl0sXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBpbnNldHNbM11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAxLCAyLCAzLCBvciA0IGFyZ3MsIGJ1dCBmb3VuZCAnICsgaW5zZXRzLmxlbmd0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3SW5zZXRMYXlvdXQoaW5zZXRzOiBJbnNldHMpOiBMYXlvdXQge1xyXG4gICAgcmV0dXJuIDxMYXlvdXQ+e1xyXG4gICAgICAgIHVwZGF0ZVByZWZTaXplOiBmdW5jdGlvbiAocGFyZW50UHJlZlNpemU6IFNpemUsIGNoaWxkcmVuOiBMYXlvdXRFbnRyeVtdKSB7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLncgPSBpbnNldHMubGVmdCArIGluc2V0cy5yaWdodDtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLmggPSBpbnNldHMudG9wICsgaW5zZXRzLmJvdHRvbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkUHJlZlNpemUgPSBjaGlsZHJlblswXS5wcmVmU2l6ZTtcclxuICAgICAgICAgICAgICAgIHBhcmVudFByZWZTaXplLncgPSAoaGFzdmFsKGNoaWxkUHJlZlNpemUudykgPyBjaGlsZFByZWZTaXplLncgKyBpbnNldHMubGVmdCArIGluc2V0cy5yaWdodCA6IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50UHJlZlNpemUuaCA9IChoYXN2YWwoY2hpbGRQcmVmU2l6ZS5oKSA/IGNoaWxkUHJlZlNpemUuaCArIGluc2V0cy50b3AgKyBpbnNldHMuYm90dG9tIDogbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnNldCBsYXlvdXQgd29ya3Mgd2l0aCBhdCBtb3N0IDEgY2hpbGQsIGJ1dCBwYW5lIGhhcyAnICsgdGhpcy5jaGlsZHJlbi5sZW5ndGggKyAnIGNoaWxkcmVuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZUNoaWxkVmlld3BvcnRzOiBmdW5jdGlvbiAoY2hpbGRyZW46IExheW91dEVudHJ5W10sIHBhcmVudFZpZXdwb3J0OiBCb3VuZHNVbm1vZGlmaWFibGUpIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRWaWV3cG9ydCA9IGNoaWxkcmVuWzBdLnZpZXdwb3J0O1xyXG4gICAgICAgICAgICAgICAgY2hpbGRWaWV3cG9ydC5zZXRFZGdlcyhwYXJlbnRWaWV3cG9ydC5pU3RhcnQgKyBpbnNldHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRWaWV3cG9ydC5pRW5kIC0gaW5zZXRzLnJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFZpZXdwb3J0LmpTdGFydCArIGluc2V0cy5ib3R0b20sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Vmlld3BvcnQuakVuZCAtIGluc2V0cy50b3ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5zZXQgbGF5b3V0IHdvcmtzIHdpdGggYXQgbW9zdCAxIGNoaWxkLCBidXQgcGFuZSBoYXMgJyArIHRoaXMuY2hpbGRyZW4ubGVuZ3RoICsgJyBjaGlsZHJlbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBuZXdJbnNldFBhbmUocGFuZTogUGFuZSwgaW5zZXRzOiBJbnNldHMsIGJnQ29sb3I6IENvbG9yID0gbnVsbCwgY29uc3VtZUlucHV0RXZlbnRzOiBib29sZWFuID0gdHJ1ZSk6IFBhbmUge1xyXG4gICAgY29uc3QgaW5zZXRQYW5lID0gbmV3IFBhbmUobmV3SW5zZXRMYXlvdXQoaW5zZXRzKSwgY29uc3VtZUlucHV0RXZlbnRzKTtcclxuICAgIGlmIChoYXN2YWwoYmdDb2xvcikpIHtcclxuICAgICAgICBpbnNldFBhbmUuYWRkUGFpbnRlcihuZXdCYWNrZ3JvdW5kUGFpbnRlcihiZ0NvbG9yKSk7XHJcbiAgICB9XHJcbiAgICBpbnNldFBhbmUuYWRkUGFuZShwYW5lKTtcclxuICAgIHJldHVybiBpbnNldFBhbmU7XHJcbn1cclxuXHJcblxyXG4iXX0=