@difizen/mana-core
Version:
118 lines (112 loc) • 3.88 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
/**
* Resolves after the next animation frame if no parameter is given,
* or after the given number of animation frames.
*/
export function animationFrame() {
var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return new Promise(function (resolve) {
function frameFunc() {
if (n <= 0) {
resolve();
} else {
n -= 1;
requestAnimationFrame(frameFunc);
}
}
frameFunc();
});
}
/**
* Parse a magnitude value (e.g. width, height, left, top) from a CSS attribute value.
* Returns the given default value (or undefined) if the value cannot be determined,
* e.g. because it is a relative value like `50%` or `auto`.
*/
export function parseCssMagnitude(value, defaultValue) {
if (value) {
var parsed;
if (value.endsWith('px')) {
parsed = parseFloat(value.substring(0, value.length - 2));
} else {
parsed = parseFloat(value);
}
if (!Number.isNaN(parsed)) {
return parsed;
}
}
return defaultValue;
}
/**
* Parse the number of milliseconds from a CSS time value.
* Returns the given default value (or undefined) if the value cannot be determined.
*/
export function parseCssTime(time, defaultValue) {
if (time) {
var parsed;
if (time.endsWith('ms')) {
parsed = parseFloat(time.substring(0, time.length - 2));
} else if (time.endsWith('s')) {
parsed = parseFloat(time.substring(0, time.length - 1)) * 1000;
} else {
parsed = parseFloat(time);
}
if (!Number.isNaN(parsed)) {
return parsed;
}
}
return defaultValue;
}
function getMonacoEditorScroll(elem) {
var linesContent = elem.querySelector('.lines-content');
var viewLines = elem.querySelector('.view-lines');
if (linesContent === null || viewLines === null) {
return undefined;
}
var linesContentStyle = linesContent.style;
var elemStyle = elem.style;
var viewLinesStyle = viewLines.style;
return {
left: -parseCssMagnitude(linesContentStyle.left, 0),
top: -parseCssMagnitude(linesContentStyle.top, 0),
maxLeft: parseCssMagnitude(viewLinesStyle.width, 0) - parseCssMagnitude(elemStyle.width, 0),
maxTop: parseCssMagnitude(viewLinesStyle.height, 0) - parseCssMagnitude(elemStyle.height, 0)
};
}
/**
* Prevent browser back/forward navigation of a mouse wheel event.
*/
export function preventNavigation(event) {
var currentTarget = event.currentTarget,
deltaX = event.deltaX,
deltaY = event.deltaY;
var absDeltaX = Math.abs(deltaX);
var absDeltaY = Math.abs(deltaY);
var elem = event.target;
while (elem && elem !== currentTarget) {
var scroll = void 0;
if (elem.classList.contains('monaco-scrollable-element')) {
scroll = getMonacoEditorScroll(elem);
} else {
scroll = {
left: elem.scrollLeft,
top: elem.scrollTop,
maxLeft: elem.scrollWidth - elem.clientWidth,
maxTop: elem.scrollHeight - elem.clientHeight
};
}
if (scroll) {
var scrollH = scroll.maxLeft > 0 && (deltaX < 0 && scroll.left > 0 || deltaX > 0 && scroll.left < scroll.maxLeft);
var scrollV = scroll.maxTop > 0 && (deltaY < 0 && scroll.top > 0 || deltaY > 0 && scroll.top < scroll.maxTop);
if (scrollH && scrollV || scrollH && absDeltaX > absDeltaY || scrollV && absDeltaY > absDeltaX) {
// The event is consumed by the scrollable child element
return;
}
}
elem = elem.parentElement;
}
event.preventDefault();
event.stopPropagation();
}