Files
Yajbir Singh f1b860b25c
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

3201 lines
128 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
(function (window, undefined) {
var InitClass = AscFormat.InitClass;
var CAnimTexture = AscFormat.CAnimTexture;
const STATE_FLAG_SELECTED = 1;
const STATE_FLAG_HOVERED = 2;
const STATE_FLAG_PRESSED = 4;
const STATE_FLAG_DISABLED = 8;
const CONTROL_TYPE_UNKNOWN = 0;
const CONTROL_TYPE_LABEL = 1;
const CONTROL_TYPE_IMAGE = 2;
const CONTROL_TYPE_BUTTON = 3;
const CONTROL_TYPE_HEADER = 4;
const CONTROL_TYPE_SCROLL_VERT = 5;
const CONTROL_TYPE_SCROLL_HOR = 6;
const CONTROL_TYPE_TIMELINE_CONTAINER = 7;
const CONTROL_TYPE_TIMELINE = 8;
const CONTROL_TYPE_SEQ_LIST_CONTAINER = 9;
const CONTROL_TYPE_SEQ_LIST = 10;
const CONTROL_TYPE_ANIM_SEQ = 11;
const CONTROL_TYPE_ANIM_GROUP_LIST = 12;
const CONTROL_TYPE_ANIM_GROUP = 13;
const CONTROL_TYPE_ANIM_ITEM = 14;
const CONTROL_TYPE_EFFECT_BAR = 15;
function CControl(oParentControl) {
AscFormat.ExecuteNoHistory(function () {
AscFormat.CShape.call(this);
this.setRecalculateInfo();
this.setBDeleted(false);
this.setLayout(0, 0, 0, 0);
}, this, []);
this.parent = editor.WordControl.m_oLogicDocument.Slides[0];
this.parentControl = oParentControl;
this.state = 0;
this.hidden = false;
this.previous = null;
this.next = null;
}
InitClass(CControl, AscFormat.CShape, CONTROL_TYPE_UNKNOWN);
CControl.prototype.getSeqList = function () {
let oParentControl = this.parentControl;
while (oParentControl) {
if (oParentControl instanceof CSeqList) {
return oParentControl;
}
oParentControl = oParentControl.parentControl;
}
return null;
};
CControl.prototype.DEFALT_WRAP_OBJECT = {
oTxWarpStruct: null,
oTxWarpStructParamarks: null,
oTxWarpStructNoTransform: null,
oTxWarpStructParamarksNoTransform: null
};
CControl.prototype.setHidden = function (bVal) {
if (this.hidden !== bVal) {
this.hidden = bVal;
this.onUpdate();
}
};
CControl.prototype.show = function () {
this.setHidden(false);
};
CControl.prototype.hide = function () {
this.setHidden(true);
};
CControl.prototype.isHidden = function () {
return this.hidden;
};
CControl.prototype.notAllowedWithoutId = function () {
return false;
};
//define shape methods
CControl.prototype.getBodyPr = function () {
return this.bodyPr;
};
CControl.prototype.getScrollOffsetX = function (oChild) {
return 0;
};
CControl.prototype.getScrollOffsetY = function (oChild) {
return 0;
};
CControl.prototype.getParentScrollOffsetX = function (oChild) {
if (this.parentControl) {
return this.parentControl.getScrollOffsetX(oChild);
}
return 0;
};
CControl.prototype.getParentScrollOffsetY = function (oChild) {
if (this.parentControl) {
return this.parentControl.getScrollOffsetY(oChild);
}
return 0;
};
CControl.prototype.getFullTransformMatrix = function () {
return this.transform;
};
CControl.prototype.getInvFullTransformMatrix = function () {
return this.invertTransform;
};
CControl.prototype.multiplyParentTransforms = function (oLocalTransform) {
var oMT = AscCommon.global_MatrixTransformer;
var oTransform = oMT.CreateDublicateM(oLocalTransform);
var oScrollMatrix = new AscCommon.CMatrix();
oScrollMatrix.tx = this.getParentScrollOffsetX(this);
oScrollMatrix.ty = this.getParentScrollOffsetY(this);
oMT.MultiplyAppend(oTransform, oScrollMatrix);
var oParentTransform = this.parentControl && this.parentControl.getFullTransformMatrix();
oParentTransform && oMT.MultiplyAppend(oTransform, oParentTransform);
return oTransform;
};
CControl.prototype.getFullTransform = function () {
return this.transform;
};
CControl.prototype.getFullTextTransform = function () {
return this.transformText;
};
CControl.prototype.recalculate = function () {
AscFormat.CShape.prototype.recalculate.call(this);
};
CControl.prototype.recalculateBrush = function () {
this.brush = null;
};
CControl.prototype.recalculatePen = function () {
this.pen = null;
};
CControl.prototype.recalculateContent = function () {
};
CControl.prototype.recalculateGeometry = function () {
//this.calcGeometry = AscFormat.CreateGeometry("rect");
//this.calcGeometry.Recalculate(this.extX, this.extY);
};
CControl.prototype.recalculateTransform = function () {
if (!this.transform) {
this.transform = new AscCommon.CMatrix();
}
var tx = this.getLeft();
var ty = this.getTop();
this.x = tx;
this.y = ty;
this.rot = 0;
this.extX = this.getWidth();
this.extY = this.getHeight();
this.flipH = false;
this.flipV = false;
ty += this.getParentScrollOffsetY(this);
var oCurParent = this.parentControl;
if (oCurParent) {
tx += oCurParent.transform.tx;
ty += oCurParent.transform.ty
}
this.transform.tx = tx;
this.transform.ty = ty;
if (!this.invertTransform) {
this.invertTransform = new AscCommon.CMatrix();
}
this.invertTransform.tx = -tx;
this.invertTransform.ty = -ty;
this.localTransform = this.transform;
};
CControl.prototype.recalculateTransformText = function () {
if (!this.transformText) {
this.transformText = new AscCommon.CMatrix();
}
this.transformText.tx = this.transform.tx;
this.transformText.ty = this.transform.ty;
if (!this.invertTransformText) {
this.invertTransformText = new AscCommon.CMatrix();
}
this.invertTransformText.tx = -this.transform.tx;
this.invertTransformText.ty = -this.transform.ty;
this.localTransformText = this.transformText;
};
CControl.prototype.recalculateBounds = function () {
var dX = this.transform.tx;
var dY = this.transform.ty;
this.bounds.reset(dX, dY, dX + this.getWidth(), dY + this.getHeight())
};
CControl.prototype.recalculateSnapArrays = function () {
};
CControl.prototype.checkAutofit = function (bIgnoreWordShape) {
return false;
};
CControl.prototype.checkTextWarp = function (oContent, oBodyPr, dWidth, dHeight, bNeedNoTransform, bNeedWarp) {
return this.DEFALT_WRAP_OBJECT;
};
CControl.prototype.addToRecalculate = function () {
};
CControl.prototype.canHandleEvents = function () {
return true;
};
CControl.prototype.getPenWidth = function (graphics) {
var fScale = graphics.m_oCoordTransform.sx;
var nPenW = AscCommon.AscBrowser.convertToRetinaValue(1, true) / fScale;
return nPenW;
};
CControl.prototype.draw = function (graphics) {
if (this.isHidden()) { return false; }
if (!this.checkUpdateRect(graphics.updatedRect)) { return false; }
this.recalculateTransform();
this.recalculateTransformText();
const sFillColor = this.getFillColor();
const sOutlineColor = this.getOutlineColor();
let oColor;
if (sOutlineColor || sFillColor) {
graphics.SaveGrState();
graphics.transform3(this.transform);
var x = 0;
var y = 0;
var extX = this.getWidth();
var extY = this.getHeight();
if (sFillColor) {
oColor = AscCommon.RgbaHexToRGBA(sFillColor);
graphics.b_color1(oColor.R, oColor.G, oColor.B, 0xFF);
graphics.rect(x, y, extX, extY);
graphics.df();
}
if (sOutlineColor) {
oColor = AscCommon.RgbaHexToRGBA(sOutlineColor);
graphics.SetIntegerGrid(true);
var nPenW = this.getPenWidth(graphics);
//graphics.p_width(100);//AscCommon.AscBrowser.convertToRetinaValue(1, true);
graphics.p_color(oColor.R, oColor.G, oColor.B, 0xFF);
graphics.drawHorLine(0, y, x, x + extX, nPenW);
graphics.drawHorLine(0, y + extY, x, x + extX, nPenW);
graphics.drawVerLine(2, x, y, y + extY, nPenW);
graphics.drawVerLine(2, x + extX, y, y + extY, nPenW);
graphics.ds();
}
graphics.RestoreGrState();
}
AscFormat.CShape.prototype.draw.call(this, graphics);
return true;
};
CControl.prototype.hit = function (x, y) {
if (this.parentControl && !this.parentControl.hit(x, y)) {
return false;
}
var oInv = this.invertTransform;
var tx = oInv.TransformPointX(x, y);
var ty = oInv.TransformPointY(x, y);
return tx >= 0 && tx <= this.extX && ty >= 0 && ty <= this.extY;
};
CControl.prototype.setStateFlag = function (nFlag, bValue) {
var nOldState = this.state;
if (bValue) {
this.state |= nFlag;
} else {
this.state &= (~nFlag);
}
if (nOldState !== this.state) {
this.onUpdate();
}
};
CControl.prototype.getStateFlag = function (nFlag) {
return (this.state & nFlag) !== 0;
};
CControl.prototype.isHovered = function () {
return this.getStateFlag(STATE_FLAG_HOVERED);
};
CControl.prototype.isActive = function () {
if (this.parentControl) {
if (!this.eventListener && this.parentControl.isEventListener(this)) {
return true;
}
}
return false;
};
CControl.prototype.setHoverState = function () {
this.setStateFlag(STATE_FLAG_HOVERED, true);
};
CControl.prototype.setNotHoverState = function () {
this.setStateFlag(STATE_FLAG_HOVERED, false);
};
CControl.prototype.onMouseMove = function (e, x, y) {
if (e.IsLocked) {
return false;
}
if (!this.canHandleEvents()) {
return false;
}
const bHover = !!this.hit(x, y);
const bHoverChanged = bHover !== this.isHovered();
if(bHoverChanged) {
this.setStateFlag(STATE_FLAG_HOVERED, bHover);
}
return false;
};
CControl.prototype.onMouseDown = function (e, x, y) {
if (!this.canHandleEvents()) {
return false;
}
if (this.hit(x, y)) {
if (this.parentControl) {
this.parentControl.setEventListener(this);
}
return true;
}
return false;
};
CControl.prototype.onMouseUp = function (e, x, y) {
if (this.parentControl) {
if (this.parentControl.isEventListener(this)) {
this.parentControl.setEventListener(null);
return true;
}
}
return false;
};
CControl.prototype.onMouseWheel = function (e, deltaY, X, Y) {
return false;
};
CControl.prototype.onUpdate = function () {
if (this.parentControl) {
var oBounds = this.getBounds();
this.parentControl.onChildUpdate(oBounds);
}
};
CControl.prototype.onChildUpdate = function (oBounds) {
if (this.parentControl) {
this.parentControl.onChildUpdate(oBounds);
}
};
CControl.prototype.checkUpdateRect = function (oUpdateRect) {
var oBounds = this.getBounds();
if (oUpdateRect && oBounds) {
if (!oUpdateRect.isIntersectOther(oBounds)) {
return false;
}
}
return true;
};
CControl.prototype.recalculate = function () {
AscFormat.CShape.prototype.recalculate.call(this);
};
/**
* Sets the location and dimensions of the control inside the parent container.
*
* @param {number} dX - Offset of the element along the X axis relative to the upper-left corner of the parent container.
* @param {number} dY - Offset of the element along the Y axis relative to the upper-left corner of the parent container.
* @param {number} dExtX - Width of the element.
* @param {number} dExtY - Height of the element.
*
* @note
* - Negative values for dX and dY are supported with behavior similar to "overflow: hidden" in CSS.
* - Negative values for dExtX and dExtY are not supported and may lead to unexpected behavior.
* - It is recommended to avoid using negative values for dExtX and dExtY to ensure proper rendering and hit detection.
*/
CControl.prototype.setLayout = function (dX, dY, dExtX, dExtY) {
if (!this.spPr) {
this.spPr = new AscFormat.CSpPr();
}
if (!this.spPr.xfrm) {
this.spPr.xfrm = new AscFormat.CXfrm();
}
this.spPr.xfrm.offX = dX;
this.spPr.xfrm.offY = dY;
this.spPr.xfrm.extX = dExtX;
this.spPr.xfrm.extY = dExtY;
this.handleUpdateExtents();
};
CControl.prototype.getLeft = function () {
return this.spPr.xfrm.offX;
};
CControl.prototype.getTop = function () {
return this.spPr.xfrm.offY;
};
CControl.prototype.getRight = function () {
return this.spPr.xfrm.offX + this.spPr.xfrm.extX;
};
CControl.prototype.getBottom = function () {
return this.spPr.xfrm.offY + this.spPr.xfrm.extY;
};
CControl.prototype.getWidth = function () {
return this.spPr.xfrm.extX;
};
CControl.prototype.getHeight = function () {
return this.spPr.xfrm.extY;
};
CControl.prototype.getBounds = function () {
return AscFormat.ExecuteNoHistory(function () {
this.recalculateBounds();
this.recalculateTransform();
this.recalculateTransformText();
return this.bounds;
}, this, []);
};
CControl.prototype.convertRelToAbs = function (oPos) {
var oAbsPos = { x: oPos.x, y: oPos.y };
var oParent = this;
while (oParent) {
oAbsPos.x += oParent.getLeft();
oAbsPos.y += oParent.getTop();
oParent = oParent.parentControl;
}
return oAbsPos;
};
CControl.prototype.convertAbsToRel = function (oPos) {
var oRelPos = { x: oPos.x, y: oPos.y };
var oParent = this;
while (oParent) {
oRelPos.x -= oParent.getLeft();
oRelPos.y -= oParent.getTop();
oParent = oParent.parentControl;
}
return oRelPos;
};
CControl.prototype.getNext = function () {
return this.next;
};
CControl.prototype.getPrevious = function () {
return this.previous;
};
CControl.prototype.setNext = function (v) {
this.next = v;
};
CControl.prototype.setPrevious = function (v) {
this.previous = v;
};
CControl.prototype.setParentControl = function (v) {
this.parentControl = v;
};
CControl.prototype.getTiming = function () {
var oSlide = this.getSlide();
if (oSlide) {
return oSlide.timing;
}
return null;
};
CControl.prototype.getSlide = function () {
var oSlide = null;
if (editor.WordControl && editor.WordControl.m_oLogicDocument) {
oSlide = editor.WordControl.m_oLogicDocument.GetCurrentSlide();
return oSlide;
}
return null;
};
CControl.prototype.getSlideNum = function () {
var oSlide = this.getSlide();
if (oSlide) {
return oSlide.num;
}
return -1;
};
CControl.prototype.getFillColor = function () {
console.error('Method "getFillColor" must be implemented in ' + this.constructor.name);
return null;
};
CControl.prototype.getOutlineColor = function () {
console.error('Method "getOutlineColor" must be implemented in ' + this.constructor.name);
return null;
};
CControl.prototype.drawShdw = function () {
};
function CControlContainer(oParentControl) {
CControl.call(this, oParentControl);
this.children = [];
this.recalcInfo.recalculateChildrenLayout = true;
this.recalcInfo.recalculateChildren = true;
this.eventListener = null;
}
InitClass(CControlContainer, CControl, CONTROL_TYPE_UNKNOWN);
CControlContainer.prototype.isEventListener = function (oChild) {
return this.eventListener === oChild;
};
CControlContainer.prototype.onScroll = function () {
};
CControlContainer.prototype.onStartScroll = function () {
};
CControlContainer.prototype.onEndScroll = function () {
};
CControlContainer.prototype.clear = function () {
for (var nIdx = this.children.length - 1; nIdx > -1; --nIdx) {
this.removeControl(this.children[nIdx]);
}
};
CControlContainer.prototype.addControl = function (oChild) {
var oLast = this.children[this.children.length - 1];
this.children.push(oChild);
if (oLast) {
oLast.setNext(oChild);
oChild.setPrevious(oLast);
oChild.setParentControl(this);
}
return oChild;
};
CControlContainer.prototype.removeControl = function (oChild) {
var nIdx = this.getChildIdx(oChild);
this.removeByIdx(nIdx);
};
CControlContainer.prototype.removeByIdx = function (nIdx) {
if (nIdx > -1 && nIdx < this.children.length) {
var oChild = this.children[nIdx];
oChild.setNext(null);
oChild.setPrevious(null);
oChild.setParentControl(null);
var oPrev = this.children[nIdx - 1] || null;
var oNext = this.children[nIdx + 1] || null;
if (oPrev) {
oPrev.setNext(oNext);
}
if (oNext) {
oNext.setPrevious(oPrev);
}
this.children.splice(nIdx, 1);
}
};
CControlContainer.prototype.getChildIdx = function (oChild) {
for (var nChild = 0; nChild < this.children.length; ++nChild) {
if (this.children[nChild] === oChild) {
return nChild;
}
}
return -1;
};
CControlContainer.prototype.getChildByType = function (nType) {
for (var nChild = 0; nChild < this.children.length; ++nChild) {
var oChild = this.children[nChild];
if (oChild.getObjectType() === nType) {
return oChild;
}
}
return null;
};
CControlContainer.prototype.getChild = function (nIdx) {
if (nIdx > -1 && nIdx < this.children.length) {
return this.children[nIdx];
}
};
CControlContainer.prototype.draw = function (graphics) {
if (!CControl.prototype.draw.call(this, graphics)) {
return false;
}
this.clipStart(graphics);
for (var nChild = 0; nChild < this.children.length; ++nChild) {
this.children[nChild].draw(graphics);
}
this.clipEnd(graphics);
return true;
};
CControlContainer.prototype.clipStart = function (graphics) {
};
CControlContainer.prototype.clipEnd = function (graphics) {
};
CControlContainer.prototype.recalculateChildrenLayout = function () {
};
CControlContainer.prototype.recalculateChildren = function () {
};
CControlContainer.prototype.recalculate = function () {
AscFormat.ExecuteNoHistory(function () {
CControl.prototype.recalculate.call(this);
if (this.recalcInfo.recalculateChildren) {
this.recalculateChildren();
this.recalcInfo.recalculateChildren = false;
}
if (this.recalcInfo.recalculateChildrenLayout) {
this.recalculateChildrenLayout();
this.recalcInfo.recalculateChildrenLayout = false;
}
for (var nChild = 0; nChild < this.children.length; ++nChild) {
this.children[nChild].recalculate();
}
}, this, []);
};
CControlContainer.prototype.setLayout = function (dX, dY, dExtX, dExtY) {
AscFormat.ExecuteNoHistory(function () {
CControl.prototype.setLayout.call(this, dX, dY, dExtX, dExtY);
this.recalcInfo.recalculateChildrenLayout = true;
}, this, []);
};
CControlContainer.prototype.handleUpdateExtents = function () {
this.recalcInfo.recalculateChildrenLayout = true;
CControl.prototype.handleUpdateExtents.call(this);
};
CControlContainer.prototype.setEventListener = function (oChild) {
if (oChild) {
this.eventListener = oChild;
if (this.parentControl) {
this.parentControl.setEventListener(this);
}
} else {
this.eventListener = null;
if (this.parentControl) {
this.parentControl.setEventListener(null);
}
}
};
CControlContainer.prototype.onMouseDown = function (e, x, y) {
for (var nChild = this.children.length - 1; nChild >= 0; --nChild) {
if (this.children[nChild].onMouseDown(e, x, y)) {
return true;
}
}
return CControl.prototype.onMouseDown.call(this, e, x, y);
};
CControlContainer.prototype.onMouseMove = function (e, x, y) {
for (var nChild = this.children.length - 1; nChild >= 0; --nChild) {
if (this.children[nChild].onMouseMove(e, x, y)) {
return true;
}
}
return CControl.prototype.onMouseMove.call(this, e, x, y);
};
CControlContainer.prototype.onMouseUp = function (e, x, y) {
for (var nChild = this.children.length - 1; nChild >= 0; --nChild) {
if (this.children[nChild].onMouseUp(e, x, y)) {
return true;
}
}
return CControl.prototype.onMouseUp.call(this, e, x, y);
};
CControlContainer.prototype.onMouseWheel = function (e, deltaY, X, Y) {
for (var nChild = 0; nChild < this.children.length; ++nChild) {
if (this.children[nChild].onMouseWheel(e, deltaY, X, Y)) {
return true;
}
}
return CControl.prototype.onMouseWheel.call(this, e, deltaY, X, Y);
};
CControlContainer.prototype.isScrolling = function () {
for (var nChild = 0; nChild < this.children.length; ++nChild) {
var oChild = this.children[nChild];
if (oChild.isOnScroll && oChild.isOnScroll()) {
return true;
}
}
return false;
};
CControlContainer.prototype.canHandleEvents = function () {
return false;
};
CControlContainer.prototype.onResize = function () {
this.handleUpdateExtents();
this.recalculate();
};
CControlContainer.prototype.getFillColor = function () {
return null;
};
CControlContainer.prototype.getOutlineColor = function () {
return null;
};
function CTopControl(oDrawer) {
CControlContainer.call(this, null);
this.drawer = oDrawer;
}
InitClass(CTopControl, CControlContainer, CONTROL_TYPE_UNKNOWN);
CTopControl.prototype.onUpdateRect = function (oBounds) {
if (this.drawer) {
this.drawer.OnAnimPaneChanged(oBounds);
}
};
CTopControl.prototype.onUpdate = function () {
var oBounds = this.getBounds();
this.onUpdateRect(oBounds);
};
CTopControl.prototype.onChildUpdate = function (oBounds) {
this.onUpdateRect(oBounds);
};
CTopControl.prototype.onResize = function () {
this.setLayout(0, 0, this.drawer.GetWidth(), this.drawer.GetHeight());
CControlContainer.prototype.onResize.call(this);
this.onUpdate();
};
function CLabel(oParentControl, sString, nFontSize, bBold, nParaAlign) {
CControl.call(this, oParentControl);
this.fontSize = nFontSize;
this.bold = bBold;
this.paraAlign = nParaAlign;
AscFormat.ExecuteNoHistory(function () {
const oRGB = AscCommon.RgbaHexToRGBA(AscCommon.GlobalSkin.AnimPaneText);
const oColor = new AscCommonWord.CDocumentColor(oRGB.R, oRGB.G, oRGB.B, false);
var oTxLstStyle = new AscFormat.TextListStyle();
oTxLstStyle.levels[0] = new CParaPr();
oTxLstStyle.levels[0].DefaultRunPr = new AscCommonWord.CTextPr();
oTxLstStyle.levels[0].DefaultRunPr.FontSize = this.fontSize;
oTxLstStyle.levels[0].DefaultRunPr.Bold = this.bold;
oTxLstStyle.levels[0].DefaultRunPr.Color = oColor;
oTxLstStyle.levels[0].DefaultRunPr.RFonts.SetAll("Arial", -1);
if (AscFormat.isRealNumber(this.paraAlign)) oTxLstStyle.levels[0].Jc = this.paraAlign;
this.createTextBody();
this.txBody.setLstStyle(oTxLstStyle);
this.bodyPr = new AscFormat.CBodyPr();
this.bodyPr.setDefault();
this.bodyPr.anchor = 1; //vertical align ctr
this.bodyPr.resetInsets();
this.bodyPr.horzOverflow = AscFormat.nHOTClip;
this.bodyPr.vertOverflow = AscFormat.nVOTClip;
this.cachedMaxWidth = 0;
this.setString(sString);
}, this, []);
}
InitClass(CLabel, CControl, CONTROL_TYPE_LABEL);
CLabel.prototype.getString = function () {
return AscCommon.translateManager.getValue(this.string);
};
CLabel.prototype.recalculateContent = function () {
this.txBody.content.Recalc_AllParagraphs_CompiledPr();
const oRGB = AscCommon.RgbaHexToRGBA(AscCommon.GlobalSkin.AnimPaneText);
const oColor = new AscCommonWord.CDocumentColor(oRGB.R, oRGB.G, oRGB.B, false);
this.txBody.lstStyle.levels[0].DefaultRunPr.Color = oColor;
if (!this.txBody.bFit || !AscFormat.isRealNumber(this.txBody.fitWidth) || this.txBody.fitWidth > this.getWidth()) {
this.txBody.recalculateOneString(this.getString());
}
// this.recalculateGeometry();
this.recalculateTransform();
};
CLabel.prototype.setString = function(str) {
this.string = str;
this.initStringContent();
};
CLabel.prototype.initStringContent = function() {
AscFormat.ExecuteNoHistory(function () {
this.txBody.checkContentFit(this.getString());
this.cachedMaxWidth = this.txBody.content.RecalculateMinMaxContentWidth().Max;
}, this, []);
};
CLabel.prototype.canHandleEvents = function () {
return false;
};
CLabel.prototype.getFillColor = function () {
return null;
};
CLabel.prototype.getOutlineColor = function () {
return null;
};
CLabel.prototype.recalculateTransformText = function () {
var Y = this.getHeight() / 2 - this.txBody.content.GetSummaryHeight() / 2;
if (!this.transformText) {
this.transformText = new AscCommon.CMatrix();
}
this.transformText.tx = this.transform.tx;
this.transformText.ty = this.transform.ty + Y;
if (!this.invertTransformText) {
this.invertTransformText = new AscCommon.CMatrix();
}
this.invertTransformText.tx = -this.transformText.tx;
this.invertTransformText.ty = -this.transformText.ty;
this.localTransformText = this.transformText;
};
CLabel.prototype.recalculateTransformText2 = function () {
return null;
};
CLabel.prototype.getContentOneStringSizes = function () {
return AscFormat.ExecuteNoHistory(function () {
this.recalculateContent();
return this.txBody.getContentOneStringSizes();
}, this, []);
};
CLabel.prototype.setLayout = function (dX, dY, dExtX, dExtY) {
this.superclass.prototype.setLayout.call(this, dX, dY, dExtX, dExtY);
if(this.txBody) {
this.txBody.bFit = false;
}
};
function CImageControl(oParentControl, sBase64Image, width, height) {
CControl.call(this, oParentControl)
this.src = sBase64Image;
this.imgWidth = width || 0;
this.imgHeight = height || 0;
}
InitClass(CImageControl, CControl, CONTROL_TYPE_IMAGE);
CImageControl.prototype.canHandleEvents = function () {
return false;
};
CImageControl.prototype.draw = function(graphics) {
if (!this.src) { return false; }
if (this.isHidden()) { return false; }
if (!this.checkUpdateRect(graphics.updatedRect)) { return false; }
const left = this.bounds.l + (this.getWidth() - this.imgWidth) / 2;
const top = this.bounds.t + (this.getHeight() - this.imgHeight) / 2;
graphics.SaveGrState();
graphics.SetIntegerGrid(false);
graphics.drawImage(this.src, left, top, this.imgWidth, this.imgHeight);
graphics.RestoreGrState();
};
CImageControl.prototype.getFillColor = function () {
return null;
};
CImageControl.prototype.getOutlineColor = function () {
return null;
};
function CButton(oParentControl, fOnMouseDown, fOnMouseMove, fOnMouseUp) {
CControlContainer.call(this, oParentControl);
this.onMouseDownCallback = fOnMouseDown;
this.onMouseMoveCallback = fOnMouseMove;
this.onMouseUpCallback = fOnMouseUp;
}
InitClass(CButton, CControlContainer, CONTROL_TYPE_BUTTON);
CButton.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback && this.onMouseDownCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseDown.call(this, e, x, y);
};
CButton.prototype.onMouseMove = function (e, x, y) {
if (this.onMouseMoveCallback && this.onMouseMoveCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseMove.call(this, e, x, y);
};
CButton.prototype.onMouseUp = function (e, x, y) {
if (this.onMouseUpCallback && this.onMouseUpCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseUp.call(this, e, x, y);
};
CButton.prototype.canHandleEvents = function () {
return true;
};
CButton.prototype.draw = function (graphics) {
if (!CControl.prototype.draw.call(this, graphics)) { return false; }
const contentOpacity = this.getContentOpacity();
graphics.put_GlobalAlpha(true, contentOpacity);
for (var nChild = 0; nChild < this.children.length; ++nChild) {
this.children[nChild].draw(graphics);
}
graphics.put_GlobalAlpha(false);
return true;
};
CButton.prototype.getContentOpacity = function () {
if (this.isDisabled()) { return 0.6 }
return 1;
}
CButton.prototype.getFillColor = function () {
const oSkin = AscCommon.GlobalSkin;
if (this.isDisabled()) { return null; }
if (this.isHovered()) { return oSkin.AnimPaneButtonFillHovered; }
if (this.sName === 'playButton') { return oSkin.type === 'light' ? oSkin.AnimPanePlayButtonFill : null; }
return null;
};
CButton.prototype.getOutlineColor = function () {
if (this.sName === 'playButton') { return AscCommon.GlobalSkin.AnimPanePlayButtonOutline; }
return null;
};
CButton.prototype.isPressed = function () {
return this.getStateFlag(STATE_FLAG_PRESSED);
};
CButton.prototype.disable = function () {
return this.setStateFlag(STATE_FLAG_DISABLED, true)
};
CButton.prototype.enable = function () {
return this.setStateFlag(STATE_FLAG_DISABLED, false)
};
CButton.prototype.isDisabled = function () {
return this.getStateFlag(STATE_FLAG_DISABLED);
};
function CAnimPaneHeader(oDrawer) {
CTopControl.call(this, oDrawer);
this.label = this.addControl(new CLabel(this, 'Animation Pane', HEADER_LABEL_FONTSIZE, true, AscCommon.align_Left));
this.playButton = this.addControl(new CButton(this, null, null, managePreview));
this.playButton.sName = 'playButton';
this.playButton.icon = this.playButton.addControl(new CImageControl(
this.playButton, null,
10 * AscCommon.g_dKoef_pix_to_mm, 10 * AscCommon.g_dKoef_pix_to_mm /* 10x10 svg icon (play and stop icons both) */
));
this.playButton.label = this.playButton.addControl(new CLabel(this.playButton, '', PLAY_BUTTON_LABEL_FONTSIZE));
this.moveUpButton = this.addControl(new CButton(this, null, null, moveChosenUp));
this.moveUpButton.icon = this.moveUpButton.addControl(new CImageControl(
this.moveUpButton,
AscCommon.GlobalSkin.type == 'light' ? arrowUpIcon_dark : arrowUpIcon_light,
12 * AscCommon.g_dKoef_pix_to_mm, 7 * AscCommon.g_dKoef_pix_to_mm /* 12x7 svg icon*/
));
this.moveDownButton = this.addControl(new CButton(this, null, null, moveChosenDown));
this.moveDownButton.icon = this.moveDownButton.addControl(new CImageControl(
this.moveDownButton,
AscCommon.GlobalSkin.type == 'light' ? arrowDownIcon_dark : arrowDownIcon_light,
12 * AscCommon.g_dKoef_pix_to_mm, 7 * AscCommon.g_dKoef_pix_to_mm /* 12x7 svg icon*/
));
this.closeButton = this.addControl(new CButton(this, null, null, closePanel));
this.closeButton.icon = this.closeButton.addControl(new CImageControl(
this.closeButton,
AscCommon.GlobalSkin.type == 'light' ? closeIcon_dark : closeIcon_light,
10 * AscCommon.g_dKoef_pix_to_mm, 10 * AscCommon.g_dKoef_pix_to_mm /* 10x10 svg icon*/
));
// Event handlers for button of CAnimPaneHeader ---
function managePreview(event, x, y) {
if (!this.hit(x, y)) { return; }
if (this.isDisabled()) { return; }
if(Asc.editor.asc_IsStartedAnimationPreview()) {
Asc.editor.asc_StopAnimationPreview();
} else {
const timing = this.parentControl.getTiming();
const bIncludeFollowing = timing && (timing.getSelectedEffects().length === 1);
Asc.editor.asc_StartAnimationPreview(this.parentControl.isStartAllPreview(), bIncludeFollowing);
}
}
function moveChosenUp(event, x, y) {
if (!this.hit(x, y)) { return }
if (this.isDisabled()) { return }
if (Asc.editor.asc_canMoveAnimationEarlier()) {
if (Asc.editor.asc_IsStartedAnimationPreview()) {
Asc.editor.asc_StopAnimationPreview()
}
Asc.editor.asc_moveAnimationEarlier()
}
}
function moveChosenDown(event, x, y) {
if (!this.hit(x, y)) { return }
if (this.isDisabled()) { return }
if (Asc.editor.asc_canMoveAnimationLater()) {
if (Asc.editor.asc_IsStartedAnimationPreview()) {
Asc.editor.asc_StopAnimationPreview()
}
Asc.editor.asc_moveAnimationLater()
}
}
function closePanel(event, x, y) {
if (!this.hit(x, y)) { return }
if (this.isDisabled()) { return }
Asc.editor.asc_ShowAnimPane(false);
Asc.editor.sendEvent('asc_onCloseAnimPane');
}
// --- end of event handlers for buttons of CAnimPaneHeader
}
InitClass(CAnimPaneHeader, CTopControl, CONTROL_TYPE_HEADER);
CAnimPaneHeader.prototype.isStartAllPreview = function () {
const timing = this.getTiming();
if (!timing) { return true; }
const aSelectedEffects = timing.getSelectedEffects();
return aSelectedEffects.length === 0;
};
CAnimPaneHeader.prototype.getPlayButtonText = function () {
if (Asc.editor.asc_IsStartedAnimationPreview()) { return 'Stop'; }
if (this.isStartAllPreview()) { return 'Play All'; } // No timing or zero selected effects
if (this.getTiming().getSelectedEffects().length === 1) { return 'Play From'; } // One selected
return 'Play Selected'; // Many selected
};
CAnimPaneHeader.prototype.getPlayButtonIcon = function() {
let sPlayButtonIcon = "";
if(Asc.editor.asc_IsStartedAnimationPreview()) {
sPlayButtonIcon = AscCommon.GlobalSkin.type == 'light' ? stopIcon_dark : stopIcon_light;
}
else {
sPlayButtonIcon = AscCommon.GlobalSkin.type == 'light' ? playIcon_dark : playIcon_light;
}
return sPlayButtonIcon;
};
CAnimPaneHeader.prototype.checkLayout = function() {
AscFormat.ExecuteNoHistory(function () {
if(this.playButton.label.string !== this.getPlayButtonText()) {
this.recalculateChildrenLayout();
this.onUpdate();
}
}, this, []);
};
CAnimPaneHeader.prototype.recalculateChildrenLayout = function () {
let gap;
this.moveUpButton.icon.src =AscCommon.GlobalSkin.type == 'light' ? arrowUpIcon_dark : arrowUpIcon_light;
this.moveDownButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? arrowDownIcon_dark : arrowDownIcon_light;
this.closeButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? closeIcon_dark : closeIcon_light;
this.label.setLayout(COMMON_LEFT_MARGIN, 0, Math.min(HEADER_LABEL_WIDTH, this.label.cachedMaxWidth), this.getHeight());
let sPlayButtonText = this.getPlayButtonText();
let sPlayButtonIcon = this.getPlayButtonIcon();
this.playButton.icon.src = sPlayButtonIcon;
gap = (PLAY_BUTTON_HEIGHT - PLAY_BUTTON_ICON_SIZE) / 2;
this.playButton.icon.setLayout(PLAY_BUTTON_LEFT_PADDING, gap, PLAY_BUTTON_ICON_SIZE, PLAY_BUTTON_ICON_SIZE);
let oButtonLabel = this.playButton.label;
oButtonLabel.setString(sPlayButtonText);
let dLabelWidth = oButtonLabel.cachedMaxWidth;
oButtonLabel.setLayout(
this.playButton.icon.getRight() + PLAY_BUTTON_LABEL_LEFT_MARGIN,
0,
dLabelWidth,
PLAY_BUTTON_HEIGHT
);
oButtonLabel.recalculate();
this.playButton.setLayout(
this.label.getRight() + PLAY_BUTTON_LEFT_MARGIN,
(HEADER_HEIGHT - PLAY_BUTTON_HEIGHT) / 2,
this.playButton.icon.getRight() + PLAY_BUTTON_LABEL_LEFT_MARGIN + oButtonLabel.getWidth() + PLAY_BUTTON_RIGHT_PADDING,
PLAY_BUTTON_HEIGHT
);
this.moveUpButton.icon.setLayout(0, 0, MOVE_BUTTON_SIZE, MOVE_BUTTON_SIZE);
gap = (HEADER_HEIGHT - MOVE_BUTTON_SIZE) / 2;
this.moveUpButton.setLayout(
this.playButton.getRight() + MOVE_UP_BUTTON_LEFT_MARGIN,
gap,
MOVE_BUTTON_SIZE,
MOVE_BUTTON_SIZE
);
this.moveUpButton.recalculate();
this.moveDownButton.icon.setLayout(0, 0, MOVE_BUTTON_SIZE, MOVE_BUTTON_SIZE);
this.moveDownButton.setLayout(
this.moveUpButton.getRight() + MOVE_DOWN_BUTTON_LEFT_MARGIN,
gap,
MOVE_BUTTON_SIZE,
MOVE_BUTTON_SIZE
);
this.moveDownButton.recalculate();
this.closeButton.icon.setLayout(0, 0, CLOSE_BUTTON_SIZE, CLOSE_BUTTON_SIZE);
gap = (HEADER_HEIGHT - CLOSE_BUTTON_SIZE) / 2;
this.closeButton.setLayout(
this.getRight() - COMMON_RIGHT_MARGIN - CLOSE_BUTTON_SIZE,
gap,
CLOSE_BUTTON_SIZE,
CLOSE_BUTTON_SIZE
);
this.closeButton.recalculate();
};
CAnimPaneHeader.prototype.onMouseMove = function (e, x, y) {
const animPane = Asc.editor.WordControl.m_oAnimPaneApi;
animPane.SetCursorType('default', new CMouseMoveData());
for (var nChild = this.children.length - 1; nChild >= 0; --nChild) {
if (this.children[nChild].onMouseMove(e, x, y)) {
return true;
}
}
return CControl.prototype.onMouseMove.call(this, e, x, y);
};
function CTimelineContainer(oDrawer) {
CTopControl.call(this, oDrawer);
this.drawer = oDrawer;
this.zoomOutButton = this.addControl(
new CButton(this, null, null, function (e, x, y) {
if (this.hit(x, y)) editor.asc_ZoomOutTimeline();
})
);
this.zoomOutButton.icon = this.zoomOutButton.addControl(
new CImageControl(
this.zoomOutButton,
AscCommon.GlobalSkin.type == 'light' ? zoomOutIcon_dark : zoomOutIcon_light,
10 * AscCommon.g_dKoef_pix_to_mm, 1 * AscCommon.g_dKoef_pix_to_mm /* 10x1 svg image */
)
);
this.zoomLabel = this.addControl(new CLabel(this, 'Zoom', ZOOM_LABEL_FONTSIZE, false, AscCommon.align_Center));
this.zoomInButton = this.addControl(
new CButton(this, null, null, function (e, x, y) {
if (this.hit(x, y)) editor.asc_ZoomInTimeline();
})
);
this.zoomInButton.icon = this.zoomInButton.addControl(
new CImageControl(
this.zoomInButton,
AscCommon.GlobalSkin.type == 'light' ? zoomInIcon_dark : zoomInIcon_light,
11 * AscCommon.g_dKoef_pix_to_mm, 11 * AscCommon.g_dKoef_pix_to_mm /* 11x11 svg image */
)
);
this.timeline = this.addControl(new CTimeline(this));
this.onMouseDownCallback = function (event, x, y) {
if(Asc.editor.asc_IsStartedAnimationPreview()) {
Asc.editor.asc_StopAnimationPreview();
}
}
}
InitClass(CTimelineContainer, CTopControl, CONTROL_TYPE_TIMELINE_CONTAINER);
CTimelineContainer.prototype.recalculateChildrenLayout = function () {
this.zoomOutButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? zoomOutIcon_dark : zoomOutIcon_light;
this.zoomInButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? zoomInIcon_dark : zoomInIcon_light;
this.zoomInButton.setLayout(
TIMELINE_SCROLL_ABSOLUTE_LEFT - TIMELINE_HEIGHT + (TIMELINE_HEIGHT - ZOOM_BUTTON_SIZE) / 2,
(TIMELINE_HEIGHT - ZOOM_BUTTON_SIZE) / 2,
ZOOM_BUTTON_SIZE,
ZOOM_BUTTON_SIZE
);
this.zoomInButton.icon.setLayout(0, 0, ZOOM_BUTTON_SIZE, ZOOM_BUTTON_SIZE);
const nZoomLabelWidth = Math.min(this.zoomLabel.cachedMaxWidth, ZOOM_LABEL_WIDTH) + 2 * ZOOM_LABEL_MARGIN;
this.zoomLabel.setLayout(
this.zoomInButton.getLeft() - nZoomLabelWidth,
0,
nZoomLabelWidth,
this.getHeight()
);
this.zoomOutButton.setLayout(
this.zoomLabel.getLeft() - ZOOM_BUTTON_SIZE,
(TIMELINE_HEIGHT - ZOOM_BUTTON_SIZE) / 2,
ZOOM_BUTTON_SIZE,
ZOOM_BUTTON_SIZE
);
this.zoomOutButton.icon.setLayout(0, 0, ZOOM_BUTTON_SIZE, ZOOM_BUTTON_SIZE);
const timelineWidth = this.getWidth() -
(COMMON_LEFT_MARGIN + COMMON_RIGHT_MARGIN) -
(SCALE_BUTTON_LEFT_MARGIN + SCALE_BUTTON_WIDTH + TIMELINE_SCROLL_LEFT_MARGIN) - (ANIM_ITEM_HEIGHT - MENU_BUTTON_SIZE) / 2;
this.timeline.setLayout(
TIMELINE_SCROLL_ABSOLUTE_LEFT,
(TIMELINE_HEIGHT - TIMELINE_SCROLL_HEIGHT) / 2,
timelineWidth,
TIMELINE_SCROLL_HEIGHT
);
};
CTimelineContainer.prototype.draw = function (graphics) {
if (!CTopControl.prototype.draw.call(this, graphics)) {
return false;
}
// this.clipStart(graphics);
for (var nChild = 0; nChild < this.children.length; ++nChild) {
this.children[nChild].draw(graphics);
}
// graphics.RemoveClipRect();
// this.clipEnd(graphics);
return true;
};
CTimelineContainer.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback && this.onMouseDownCallback.call(this, e, x, y)) {
return true;
}
return CTopControl.prototype.onMouseDown.call(this, e, x, y);
};
function CTimeline(oParentControl, oContainer, oChild) {
CControlContainer.call(this, oParentControl);
this.container = oContainer;
this.scrolledChild = oChild;
this.isScrollerHovered;
this.isStickedToPointer;
this.startButton = this.addControl(new CButton(this, onFirstBtnMouseDown, null, onMouseUp));
this.startButton.icon = this.startButton.addControl(new CImageControl(
this.startButton,
AscCommon.GlobalSkin.type == 'light' ? arrowLeftIcon_dark : arrowLeftIcon_light,
5 * AscCommon.g_dKoef_pix_to_mm, 9 * AscCommon.g_dKoef_pix_to_mm /* 5x9 svg image */
));
this.endButton = this.addControl(new CButton(this, onSecondBtnMouseDown, null, onMouseUp));
this.endButton.icon = this.endButton.addControl(new CImageControl(
this.endButton,
AscCommon.GlobalSkin.type == 'light' ? arrowRightIcon_dark : arrowRightIcon_light,
5 * AscCommon.g_dKoef_pix_to_mm, 9 * AscCommon.g_dKoef_pix_to_mm /* 5x9 svg image */
));
function onFirstBtnMouseDown(e, x, y) {
if (!this.hit(x, y)) { return }
this.parentControl.setEventListener(this);
let step = SCROLL_STEP * this.parentControl.getWidth()
this.parentControl.startScroll(-step);
return true;
}
function onSecondBtnMouseDown(e, x, y) {
if (!this.hit(x, y)) { return }
this.parentControl.setEventListener(this);
let step = SCROLL_STEP * this.parentControl.getWidth()
this.parentControl.startScroll(step);
return true;
}
function onMouseUp(e, x, y) {
if (this.parentControl.isEventListener(this)) {
this.parentControl.setEventListener(null);
this.parentControl.endScroll();
return true;
}
return false;
}
this.timerId = null;
this.timeoutId = null;
// This fields supposed to be private
// so it should not be changed directly.
// Use set methods instead (setScrollOffset, setStartTime)
this.scrollOffset = 0; // in millimeters
this.startTime = 0; // in seconds
this.timeScaleIndex = 2;
// Tmp field for demoPreview
this.tmpScrollOffset = null;
// Labels cache
this.labels = {};
this.usedLabels = {};
this.cachedParaPr = null
this.onMouseDownCallback = function stickToPointer(event, x, y) {
if (!this.hitInScroller(x, y)) { return; }
this.isStickedToPointer = true;
this.onUpdate()
}
this.onMouseUpCallback = function unstickFromPointer(event, x, y) {
this.isStickedToPointer = false;
if (this.isOnScroll()) { this.endScroll(); }
this.onUpdate();
}
this.onMouseMoveCallback = function handlePointerMovement(event, x, y) {
// Updating hover state of the scroller
const tmpIsScrollerHovered = this.hitInScroller(x, y);
if (this.isScrollerHovered !== tmpIsScrollerHovered) {
this.isScrollerHovered = tmpIsScrollerHovered;
this.onUpdate();
}
if (!this.isStickedToPointer) { return; }
let oInv = this.getInvFullTransformMatrix();
let tx = oInv.TransformPointX(x, y);
let newScrollOffset = tx - this.getRulerStart() - TIMELINE_SCROLLER_WIDTH / 2;
// Check if the boundaried are reached and start scrolling if so
let leftBorder = this.getRulerStart();
let rightBorder = this.getRulerEnd();
if (tx <= leftBorder || tx >= rightBorder) {
if (!this.isOnScroll()) {
let scrollStep = this.getWidth() * SCROLL_STEP / 10;
scrollStep = tx <= leftBorder ? -scrollStep : scrollStep;
let scrollTimerDelay = 0;
let scrollTimerInterval = 50;
this.startScroll(scrollStep, scrollTimerDelay, scrollTimerInterval);
}
}
else this.endScroll();
// Updating scrollOffset
this.setScrollOffset(newScrollOffset)
}
}
InitClass(CTimeline, CControlContainer, CONTROL_TYPE_TIMELINE);
CTimeline.prototype.limitScrollOffset = function (newScrollOffset /* in millimeters */) {
return Math.max(0, Math.min(newScrollOffset, this.getMaxScrollOffset()));
};
CTimeline.prototype.getScrollOffset = function () {
return this.tmpScrollOffset !== null ? this.tmpScrollOffset : this.scrollOffset;
};
CTimeline.prototype.setScrollOffset = function (newScrollOffset /* in millimeters */) {
let oldScrollOffset = this.getScrollOffset()
this.scrollOffset = this.limitScrollOffset(newScrollOffset)
let difference = this.posToTime(this.getScrollOffset()) - this.posToTime(oldScrollOffset) // difference in seconds
this.setStartTime(this.getStartTime() + difference)
this.parentControl.onScroll();
this.onUpdate();
};
CTimeline.prototype.getMaxScrollOffset = function () {
return this.getWidth() - 2 * TIMELINE_SCROLL_BUTTON_SIZE - TIMELINE_SCROLLER_WIDTH;
};
CTimeline.prototype.getStartTime = function () {
return this.startTime;
};
CTimeline.prototype.setStartTime = function (newStartTime /* in seconds */) {
this.startTime = Math.max(0, newStartTime)
this.parentControl.onScroll();
this.onUpdate();
// also updating seqList to redraw effect bars
editor.WordControl.m_oAnimPaneApi.list.Control.seqList.onUpdateSeqList()
};
CTimeline.prototype.getCurrentTime = function() {
return this.posToTime(this.getScrollOffset() + this.startButton.getWidth() + TIMELINE_SCROLLER_WIDTH / 2)
}
CTimeline.prototype.startScroll = function (step /* in millimeters */, scrollTimerDelay, scrollTimerInterval) {
if (typeof scrollTimerDelay === 'undefined') { scrollTimerDelay = SCROLL_TIMER_DELAY }
if (typeof scrollTimerInterval === 'undefined') { scrollTimerInterval = SCROLL_TIMER_INTERVAL }
this.endScroll();
var oScroll = this;
oScroll.addScroll(step);
this.timeoutId = setTimeout(function () {
oScroll.timeoutId = null;
oScroll.timerId = setInterval(function () {
oScroll.addScroll(step);
}, scrollTimerInterval);
}, scrollTimerDelay);
};
CTimeline.prototype.addScroll = function (step /* in millimeters */) {
let newStartTime = this.posToTime(this.getZeroShift() + step)
const seqList = editor.WordControl.m_oAnimPaneApi.list.Control.seqList
seqList.forEachAnimItem(function (animItem) {
if (!animItem.hitResult) { return }
animItem.handleTimelineScroll(step);
})
this.setStartTime(newStartTime)
};
CTimeline.prototype.endScroll = function () {
if (this.timerId !== null) {
clearInterval(this.timerId);
this.timerId = null;
}
if (this.timeoutId !== null) {
clearTimeout(this.timeoutId);
this.timeoutId = null;
}
this.setStateFlag(STATE_FLAG_SELECTED, false);
};
CTimeline.prototype.isOnScroll = function () {
return this.timerId !== null || this.timeoutId !== null;
// return this.timerId !== null || this.timeoutId !== null || this.parentControl.isEventListener(this);
};
CTimeline.prototype.startDrawLabels = function () {
this.usedLabels = {};
};
CTimeline.prototype.endDrawLabels = function () {
for (var nTime in this.labels) {
if (!this.usedLabels[nTime]) {
var oLabel = this.labels[nTime];
oLabel.parentControl = null;
oLabel.bDeleted = true;
delete this.labels[nTime];
}
}
};
CTimeline.prototype.getLabel = function (nTime, scale) {
this.usedLabels[nTime] = true;
if (this.labels[nTime] && AscFormat.fApproxEqual(this.labels[nTime].scale, scale, 0.01)) {
return this.labels[nTime];
}
return this.cacheLabel(nTime, scale);
};
CTimeline.prototype.cacheLabel = function (nTime, scale) {
return AscFormat.ExecuteNoHistory(function () {
var oLabel = new CLabel(this, this.getTimeString(nTime), TIMELINE_LABEL_FONTSIZE, false, AscCommon.align_Center);
var oContent = oLabel.txBody.content;
oLabel.setLayout(0, 0, TIMELINE_LABEL_WIDTH, this.getHeight());
if (this.cachedParaPr) {
oContent.Content[0].CompiledPr = this.cachedParaPr;
} else {
oContent.SetApplyToAll(true);
oContent.SetParagraphAlign(AscCommon.align_Center);
oContent.SetApplyToAll(false);
}
oLabel.recalculate();
if (!this.cachedParaPr) {
this.cachedParaPr = oContent.Content[0].CompiledPr;
}
var oBaseTexture = oLabel.getAnimTexture(scale);
if (oBaseTexture) {
this.labels[nTime] = new CAnimTexture(this, oBaseTexture.canvas, oBaseTexture.scale, oBaseTexture.x, oBaseTexture.y);
}
return this.labels[nTime];
}, this, []);
};
CTimeline.prototype.getTimeString = function (nTime) {
if (nTime < 60) {
return "" + nTime;
}
const nSeconds = nTime % 60;
const nMinutes = ((nTime / 60) >> 0) % 60;
let sSeconds = padZero(nSeconds);
let sMinutes = padZero(nMinutes);
if (nTime < 3600) {
return (sMinutes + ":") + sSeconds;
}
return (((nTime / 3600) >> 0) + ":") + sMinutes + ":" + sSeconds;
function padZero(number) {
return number < 10 ? "0" + number : "" + number;
}
};
CTimeline.prototype.drawLabel = function (graphics, dPos, nTime) {
var oLabelTexture = this.getLabel(nTime, graphics.m_oCoordTransform.sx);
var oMatrix = new AscCommon.CMatrix();
var dWidth = oLabelTexture.canvas.width / oLabelTexture.scale;
var dHeight = oLabelTexture.canvas.height / oLabelTexture.scale;
graphics.drawImage2(oLabelTexture.canvas,
dPos - dWidth / 2, this.getHeight() / 2 - dHeight / 2,
dWidth,
dHeight);
// var oContent = oLabel.txBody.content;
// oContent.ShiftView(dPos - TIMELINE_LABEL_WIDTH / 2, this.getHeight() / 2 - oContent.GetSummaryHeight() / 2);
// oContent.Draw(0, graphics);
// oContent.ResetShiftView();
};
CTimeline.prototype.drawMark = function (graphics, dPos) {
var dHeight = this.getHeight() / 3;
var nPenW = this.getPenWidth(graphics);
graphics.drawVerLine(1, dPos, dHeight, dHeight + dHeight, nPenW);
};
CTimeline.prototype.start = function (graphics, dPos) {
var dHeight = this.getHeight() / 3;
var nPenW = this.getPenWidth(graphics);
graphics.drawVerLine(1, dPos, dHeight, dHeight + dHeight, nPenW);
};
CTimeline.prototype.handleUpdateExtents = function () {
this.labels = {};
this.usedLabels = {};
this.cachedParaPr = null;
if(this.startButton && this.endButton) {
this.startButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? arrowLeftIcon_dark : arrowLeftIcon_light;
this.endButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? arrowRightIcon_dark : arrowRightIcon_light;
}
CControlContainer.prototype.handleUpdateExtents.call(this);
};
CTimeline.prototype.draw = function (graphics) {
if (this.isHidden()) { return false }
if (!this.checkUpdateRect(graphics.updatedRect)) { return false }
this.getStartTime() === 0 ? this.startButton.disable() : this.startButton.enable();
graphics.SaveGrState();
// var dPenW = this.getPenWidth(graphics);
// graphics.SetIntegerGrid(true);
// graphics.p_width(dPenW);
// var sColor = this.children[0].getOutlineColor();
// var oColor = AscCommon.RgbaHexToRGBA(sColor);
// graphics.p_color(oColor.R, oColor.G, oColor.B, 255);
// var dPaneLeft = this.children[0].getRight();
// var dPaneWidth = this.getWidth() - (this.children[0].getWidth() + this.children[1].getWidth());
// graphics.rect(dPaneLeft, 0, dPaneWidth, this.getHeight());
// graphics.ds();
// graphics.RestoreGrState();
const sColor = AscCommon.GlobalSkin.AnimPaneTimelineRulerOutline;
var oColor = AscCommon.RgbaHexToRGBA(sColor);
var dPaneLeft = this.getRulerStart();
var dPaneWidth = this.getRulerEnd() - dPaneLeft;
var x = dPaneLeft;
var y = 0;
var extX = dPaneWidth;
var extY = this.getHeight();
graphics.transform3(this.transform);
graphics.SetIntegerGrid(true);
var nPenW = this.getPenWidth(graphics);
graphics.p_color(oColor.R, oColor.G, oColor.B, 0xFF);
graphics.drawHorLine(0, y, x, x + extX, nPenW);
graphics.drawHorLine(0, y + extY, x, x + extX, nPenW);
graphics.drawVerLine(2, x, y, y + extY, nPenW);
graphics.drawVerLine(2, x + extX, y, y + extY, nPenW);
graphics.ds();
//draw marks
//find first visible
var fStartTime = this.posToTime(this.getRulerStart());
var fTimeInterval = TIME_SCALES[this.timeScaleIndex];
var nMarksCount = TIME_INTERVALS[this.timeScaleIndex] === LONG_TIME_INTERVAL ? 10 : 2;
var dTimeOfSmallInterval = fTimeInterval / nMarksCount;
var nStartIntervalIdx = this.startTime / dTimeOfSmallInterval >> 0;
var nEndIntervalIdx = this.posToTime(this.getRulerEnd()) / dTimeOfSmallInterval + 0.5 >> 0;
this.startDrawLabels();
graphics.SaveGrState();
var nInterval;
graphics.AddClipRect(x, y, extX, extY);
oColor = AscCommon.RgbaHexToRGBA(AscCommon.GlobalSkin.AnimPaneTimelineRulerTick);
graphics.p_color(oColor.R, oColor.G, oColor.B, 0xFF);
for (nInterval = nStartIntervalIdx; nInterval <= nEndIntervalIdx; ++nInterval) {
var dTime = nInterval * dTimeOfSmallInterval;
var dPos = this.timeToPos(dTime);
if (nInterval % nMarksCount !== 0) {
this.drawMark(graphics, dPos);
} else {
this.drawLabel(graphics, dPos, dTime);
}
}
graphics.ds();
// for(nInterval = nFirstInterval; nInterval <= nLastInterval; ++nInterval) {
// var dTime = nInterval*dSmallInterval;
// var dPos = this.timeToPos(dTime);
// if(nInterval % nMarksCount === 0) {
// this.drawLabel(graphics, dPos, dTime);
// }
// }
graphics.RestoreGrState();
this.endDrawLabels();
//
this.drawScroller(graphics);
graphics.RestoreGrState();
if (!CControlContainer.prototype.draw.call(this, graphics)) {
return false;
}
};
CTimeline.prototype.drawScroller = function (graphics) {
let x = this.getRulerStart() + this.getScrollOffset();
let y = 0;
let extX = TIMELINE_SCROLLER_WIDTH;
let extY = this.getHeight();
const oSkin = AscCommon.GlobalSkin;
const oFillColor = AscCommon.RgbaHexToRGBA(oSkin.AnimPaneTimelineScrollerFill);
let nOpacity;
if (this.isStickedToPointer) {
nOpacity = 0.5;//oSkin.AnimPaneTimelineScrollerOpacityActive;
} else if (this.isScrollerHovered) {
nOpacity = oSkin.AnimPaneTimelineScrollerOpacityHovered;
} else {
nOpacity = oSkin.AnimPaneTimelineScrollerOpacity;
}
graphics.b_color1(oFillColor.R, oFillColor.G, oFillColor.B, nOpacity * 255);
graphics.rect(x, y, extX, extY);
graphics.df();
let nPenW = this.getPenWidth(graphics);
let sColor = oSkin.AnimPaneTimelineScrollerOutline;
let oColor = AscCommon.RgbaHexToRGBA(sColor);
graphics.p_color(oColor.R, oColor.G, oColor.B, 0xFF);
graphics.drawHorLine(0, y, x, x + extX, nPenW);
graphics.drawHorLine(0, y + extY, x, x + extX, nPenW);
graphics.drawVerLine(2, x, y, y + extY, nPenW);
graphics.drawVerLine(2, x + extX, y, y + extY, nPenW);
if (this.tmpScrollOffset !== null) {
graphics.SaveGrState();
graphics.RemoveClipRect();
// const seqList = Asc.editor.WordControl.m_oAnimPaneApi.list.Control.seqList
// graphics.drawVerLine(1, x + extX / 2, seqList.getTop(), y, nPenW);
graphics.drawVerLine(1, x + extX / 2, y - 1000, y, nPenW);
graphics.RestoreGrState();
}
return true;
};
CTimeline.prototype.hitInScroller = function(x, y) {
// x, y - relatively to this.parentContainer
// tx, ty - relatively to this
let oInv = this.getInvFullTransformMatrix();
let tx = oInv.TransformPointX(x, y);
let ty = oInv.TransformPointY(x, y);
let l = this.getRulerStart() + this.getScrollOffset();
let t = 0;
let r = l + TIMELINE_SCROLLER_WIDTH;
let b = t + this.getHeight();
return tx >= l && tx <= r && ty >= t && ty <= b;
}
CTimeline.prototype.onPreviewStart = function() {
AscFormat.ExecuteNoHistory(function () {
this.tmpScrollOffset = 0;
this.setStartTime(0);
const previewTimings = Asc.editor.WordControl.m_oLogicDocument.previewPlayer.timings;
this.demoTiming = previewTimings[0]; // effects are smoothed to follow each other
this.rawDemoTiming = previewTimings[1]; // timing with only effects for preview (without smoothing)
const oPaneApi = Asc.editor.WordControl.m_oAnimPaneApi;
oPaneApi.list.Control.recalculateByTiming(this.rawDemoTiming);
oPaneApi.header.Control.recalculateChildrenLayout();
oPaneApi.header.OnPaint();
oPaneApi.timeline.OnPaint();
oPaneApi.list.OnPaint();
// this.onUpdate();
}, this, []);
}
CTimeline.prototype.onPreviewStop = function() {
AscFormat.ExecuteNoHistory(function () {
this.demoTiming = null;
this.rawDemoTiming = null;
this.tmpScrollOffset = null;
this.setStartTime(0);
const oPaneApi = Asc.editor.WordControl.m_oAnimPaneApi;
oPaneApi.list.Control.recalculateByTiming(this.getTiming());
oPaneApi.header.Control.recalculateChildrenLayout();
oPaneApi.header.OnPaint();
oPaneApi.timeline.OnPaint();
oPaneApi.list.OnPaint();
// this.onUpdate();
}, this, []);
}
CTimeline.prototype.onPreview = function(elapsedTicks) {
if (this.tmpScrollOffset === null) { return; }
if (!this.demoTiming) { return; }
const currentlyPlayingDemoEffects = this.getCurrentlyPlayingDemoEffects(elapsedTicks);
const currentlyPlayingDemoEffect = currentlyPlayingDemoEffects[0]; // first in group
const correction = (currentlyPlayingDemoEffect)
? currentlyPlayingDemoEffect.originalNode.getBaseTime() - currentlyPlayingDemoEffect.getBaseTime()
: 0;
this.tmpScrollOffset = this.getNewTmpScrollOffset(elapsedTicks, correction);
const seqList = Asc.editor.WordControl.m_oAnimPaneApi.list.Control.seqList;
seqList.setCurrentlyPlaying(currentlyPlayingDemoEffects);
// this.parentControl.drawer == editor.WordControl.m_oAnimPaneApi.timeline
Asc.editor.WordControl.m_oAnimPaneApi.timeline.OnPaint();
Asc.editor.WordControl.m_oAnimPaneApi.list.OnPaint();
}
CTimeline.prototype.getCurrentlyPlayingDemoEffects = function (elapsedTicks) {
const demoEffects = this.demoTiming.getRootSequences()[0].getAllEffects();
const rawDemoEffects = this.rawDemoTiming.getRootSequences()[0].getAllEffects();
rawDemoEffects.forEach(function (effect, index) {
effect.originalDemoNode = demoEffects[index];
});
// Getting level 3 Time Node Containers
// Each contains either 'after'-effect or 'click'-effect with mulpiple 'with'-effects
const lvl3DemoTimingNodes = this.demoTiming.getRootSequences(0)[0].getChildrenTimeNodes()[0].getChildrenTimeNodes();
// Getting first active level 3 Time Node Container
// to get currently active demo effect
let activeDemoEffect = null;
for (let nodeIndex = lvl3DemoTimingNodes.length - 1; nodeIndex >= 0; --nodeIndex) {
const node = lvl3DemoTimingNodes[nodeIndex];
if (node.isActive()) {
activeDemoEffect = node.getAllAnimEffects()[0];
break;
}
}
if(activeDemoEffect) {
// Get index of active demo effect (in array of all raw demo effects)
let activeDemoEffectIndex;
for (let nEffect = 0; nEffect < rawDemoEffects.length; nEffect++) {
if (rawDemoEffects[nEffect].originalNode === activeDemoEffect.originalNode) {
activeDemoEffectIndex = nEffect;
break;
}
}
// Get group of active raw demo effects and their corresponding demo effects
const activeRawDemoEffects = rawDemoEffects[activeDemoEffectIndex].getTimeNodeWithLvl(2).getAllAnimEffects();
const activeDemoEffects = activeRawDemoEffects.map(function (rawEffect) {
return rawEffect.originalDemoNode;
});
return activeDemoEffects;
}
return [];
};
CTimeline.prototype.getNewTmpScrollOffset = function (elapsedTicks, correction) {
const leftLimit = 0;
const rightLimit = this.getRulerEnd() - this.getZeroShift();
let newTmpScrollOffset = ms_to_mm(elapsedTicks + correction) - ms_to_mm(this.getStartTime() * 1000);
if (newTmpScrollOffset < leftLimit) {
this.setStartTime(0);
newTmpScrollOffset = 0;
}
if (newTmpScrollOffset > rightLimit) {
const rulerDur = mm_to_ms(this.getRulerEnd() - this.getRulerStart()) / 1000; // seconds
this.setStartTime(this.getStartTime() + rulerDur / 2);
newTmpScrollOffset -= ms_to_mm(rulerDur / 2);
}
return newTmpScrollOffset;
function ms_to_mm(nMilliseconds) {
const index = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline.timeScaleIndex;
return nMilliseconds * TIME_INTERVALS[index] / TIME_SCALES[index] / 1000;
}
function mm_to_ms(nMillimeters) {
const index = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline.timeScaleIndex;
return nMillimeters / TIME_INTERVALS[index] * TIME_SCALES[index] * 1000;
}
};
CTimeline.prototype.getRulerStart = function () {
return this.startButton.getRight();
};
CTimeline.prototype.getRulerEnd = function () {
return this.getWidth() - this.endButton.getWidth();
};
CTimeline.prototype.getZeroShift = function () {
// Returns the value (in millimeters) of the left margin of the start of the ruler
return this.getRulerStart() + TIMELINE_SCROLLER_WIDTH / 2;
};
/*
* Functions to convert time to pos and vice versa
*/
CTimeline.prototype.getLinearCoeffs = function () {
//linear relationship x = a*t + b
var a = TIME_INTERVALS[this.timeScaleIndex] / TIME_SCALES[this.timeScaleIndex];
var b = this.getZeroShift() - a * this.startTime;
return { a: a, b: b };
};
CTimeline.prototype.timeToPos = function (fTime) {
//linear relationship x = a*t + b
var oCoefs = this.getLinearCoeffs();
return oCoefs.a * fTime + oCoefs.b;
};
CTimeline.prototype.posToTime = function (fPos) {
//linear relationship x = a*t + b
var oCoefs = this.getLinearCoeffs();
return (fPos - oCoefs.b) / oCoefs.a;
};
CTimeline.prototype.changeTimelineScale = function (bZoomOut) {
this.timeScaleIndex = bZoomOut ?
Math.min(this.timeScaleIndex + 1, TIME_SCALES.length - 1) :
Math.max(this.timeScaleIndex - 1, 0)
this.onUpdate();
// also updating seqList to redraw effect bars
editor.WordControl.m_oAnimPaneApi.list.Control.seqList.onUpdateSeqList();
}
CTimeline.prototype.canHandleEvents = function () {
return true;
};
CTimeline.prototype.recalculateChildrenLayout = function () {
this.startButton.setLayout(0, 0, TIMELINE_SCROLL_BUTTON_SIZE, TIMELINE_SCROLL_BUTTON_SIZE);
this.startButton.icon.setLayout(0, 0, TIMELINE_SCROLL_BUTTON_SIZE, TIMELINE_SCROLL_BUTTON_SIZE);
this.endButton.setLayout(this.getWidth() - TIMELINE_SCROLL_BUTTON_SIZE, 0, TIMELINE_SCROLL_BUTTON_SIZE, TIMELINE_SCROLL_BUTTON_SIZE);
this.endButton.icon.setLayout(0, 0, TIMELINE_SCROLL_BUTTON_SIZE, TIMELINE_SCROLL_BUTTON_SIZE);
const currentScrollOffset = this.getScrollOffset()
if (currentScrollOffset >= this.getMaxScrollOffset()) {
this.setScrollOffset(currentScrollOffset)
}
};
CTimeline.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback && this.onMouseDownCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseDown.call(this, e, x, y);
};
CTimeline.prototype.onMouseMove = function (e, x, y) {
if (this.onMouseMoveCallback && this.onMouseMoveCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseMove.call(this, e, x, y);
};
CTimeline.prototype.onMouseUp = function (e, x, y) {
if (this.onMouseUpCallback && this.onMouseUpCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseUp.call(this, e, x, y);
};
function CSeqListContainer(oDrawer) {
CTopControl.call(this, oDrawer);
this.seqList = this.addControl(new CSeqList(this));
this.onMouseDownCallback = function (event, x, y) {
if(Asc.editor.asc_IsStartedAnimationPreview()) {
Asc.editor.asc_StopAnimationPreview();
}
if (this.seqList.hit(x, y)) { return }
this.seqList.forEachAnimItem(function (animItem) { animItem.effect.deselect() })
Asc.editor.WordControl.m_oLogicDocument.RedrawCurSlide()
Asc.editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState()
}
}
InitClass(CSeqListContainer, CTopControl, CONTROL_TYPE_SEQ_LIST_CONTAINER);
CSeqListContainer.prototype.recalculateChildrenLayout = function () {
this.seqList.setLayout(
COMMON_LEFT_MARGIN,
0,
this.getWidth() - COMMON_LEFT_MARGIN - COMMON_RIGHT_MARGIN,
this.seqList.getHeight());
this.seqList.recalculate();
this.setLayout(0, 0, this.getWidth(), this.seqList.getHeight());
};
CSeqListContainer.prototype.recalculateByTiming = function (customTiming) {
AscFormat.ExecuteNoHistory(function () {
if (!customTiming) { return; }
this.seqList.recalculateChildren(customTiming);
this.seqList.recalculateChildrenLayout();
this.seqList.parentControl.recalculateChildrenLayout();
this.seqList.parentControl.onUpdate();
this.seqList.parentControl.drawer.CheckScroll();
}, this, []);
};
CSeqListContainer.prototype.onScroll = function () {
this.onUpdate();
};
CSeqListContainer.prototype.onMouseWheel = function (e, deltaY, X, Y) {
return false;
};
CSeqListContainer.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback && this.onMouseDownCallback.call(this, e, x, y)) {
return true;
}
return CTopControl.prototype.onMouseDown.call(this, e, x, y);
};
function CSeqList(oParentControl) {
CControlContainer.call(this, oParentControl);
// this.children - mainSeq, interactiveSeq
this.indexLabelWidth = null;
// Tmp field for animItems moving up/down
this.pressingPoint = null;
this.nPressedSlot = null;
this.nCurrentSlot = null;
this.bTopPart = false;
this.getIndexLabelWidth = function () {
if (this.indexLabelWidth === null) {
let nMaxIndexWidth = 0;
this.forEachAnimItem(function (oAnimItem) {
if (oAnimItem.indexLabel) {
const nIndexWidth = oAnimItem.indexLabel.cachedMaxWidth;
if (nIndexWidth > nMaxIndexWidth) {
nMaxIndexWidth = nIndexWidth;
}
}
});
this.indexLabelWidth = Math.min(nMaxIndexWidth, INDEX_LABEL_WIDTH);
}
return this.indexLabelWidth;
};
this.onMouseDownCallback = function (event, x, y) {
const oThis = this;
this.forEachAnimItem(function (animItem, index, groupIndex, seqIndex) {
const hit = animItem.hit(x, y);
const hitInEffectBar = animItem.hitInEffectBar(x, y);
const hitInMenuButton = animItem.contextMenuButton.hit(x, y);
if (hit && !hitInEffectBar && !hitInMenuButton) {
oThis.nPressedSlot = index + seqIndex;
oThis.pressingPoint = { x: x, y: y };
}
})
this.onUpdate();
}
this.onMouseMoveCallback = function (event, x, y) {
if (this.nPressedSlot === null) { return }
const oThis = this;
const minRadius = 2; // in millimeters
const currentShift = Math.sqrt(Math.pow(oThis.pressingPoint.x - x, 2) + Math.pow(oThis.pressingPoint.y - y, 2));
const bDistancePassed = currentShift >= minRadius;
if (!bDistancePassed) { return }
let nLastCheckedSeq = null;
let hit = null;
this.forEachAnimItem(function (animItem, index, groupIndex, seqIndex) {
const seqLabel = oThis.children[seqIndex].label;
if (seqIndex !== nLastCheckedSeq && seqLabel !== null && seqLabel.hit(x, y)) {
hit = 'top';
nLastCheckedSeq = seqIndex;
} else {
hit = animItem.hit(x, y);
}
if (hit) {
oThis.nCurrentSlot = index + seqIndex;
oThis.bTopPart = (hit === 'top');
}
})
this.onUpdate();
}
this.onMouseUpCallback = function (event, x, y) {
if (this.nCurrentSlot !== null && this.nPressedSlot !== null) {
let moves = this.nCurrentSlot - this.nPressedSlot;
if (moves > 0 && this.bTopPart) { moves -= 1; }
if (moves < 0 && !this.bTopPart) { moves += 1; }
if (moves > 0) {
if (Asc.editor.asc_canMoveAnimationLater(moves)) {
Asc.editor.asc_moveAnimationLater(moves)
}
}
if (moves < 0) {
if (Asc.editor.asc_canMoveAnimationEarlier(Math.abs(moves))) {
Asc.editor.asc_moveAnimationEarlier(Math.abs(moves))
}
}
}
this.pressingPoint = null;
this.nPressedSlot = null;
this.nCurrentSlot = null;
this.onUpdate();
}
}
InitClass(CSeqList, CControlContainer, CONTROL_TYPE_SEQ_LIST);
CSeqList.prototype.recalculateChildren = function (oCustomTiming) {
this.clear();
const oTiming = oCustomTiming || this.getTiming();
if (!oTiming) { return }
const aAllSeqs = oTiming.getRootSequences();
let oLastSeqView = null; // Зачем нужна эта переменная?
for (var nSeq = 0; nSeq < aAllSeqs.length; ++nSeq) {
const oSeqView = new CAnimSequence(this, aAllSeqs[nSeq]);
this.addControl(oSeqView);
oLastSeqView = oSeqView;
}
};
CSeqList.prototype.recalculateChildrenLayout = function () {
this.indexLabelWidth = null;
let dLastBottom = 0;
for (let nChild = 0; nChild < this.children.length; ++nChild) {
const oSeq = this.children[nChild];
oSeq.setLayout(0, dLastBottom, this.getWidth(), 0);
oSeq.recalculate();
dLastBottom = oSeq.getBottom();
}
this.setLayout(this.getLeft(), this.getTop(), this.getWidth(), dLastBottom);
};
CSeqList.prototype.draw = function (graphics) {
if (!CControlContainer.prototype.draw.call(this, graphics)) { return false; }
// Draw horizontal line when animItem is moving
if (this.nCurrentSlot !== null) {
const oThis = this;
let currentAnimItem;
this.forEachAnimItem(function(animItem, index, groupIndex, seqIndex) {
if (index + seqIndex === oThis.nCurrentSlot) currentAnimItem = animItem;
})
const transformX = function (x, y) { return graphics.m_oFullTransform.TransformPointX(x, y) + 0.5 >> 0; }
const transformY = function (x, y) { return graphics.m_oFullTransform.TransformPointY(x, y) + 0.5 >> 0; }
const yCord = this.bTopPart ? currentAnimItem.bounds.t : currentAnimItem.bounds.b;
const triangle_diagonal_half = 1; // mm
const outerLeft = transformX(this.getLeft(), yCord);
const innerLeft = transformX(this.getLeft() + triangle_diagonal_half, yCord);
const innerRight = transformX(this.getRight() - triangle_diagonal_half, yCord);
const outerRight = transformX(this.getRight(), yCord);
const top = transformY(0, yCord - triangle_diagonal_half);
const center = transformY(0, yCord);
const bottom = transformY(0, yCord + triangle_diagonal_half);
graphics.SaveGrState();
graphics.RemoveClipRect();
let ctx = graphics.m_oContext;
ctx.beginPath();
ctx.moveTo(innerLeft, center);
ctx.lineTo(outerLeft, top);
ctx.lineTo(outerLeft, bottom);
ctx.lineTo(innerLeft, center);
ctx.lineTo(innerRight, center);
ctx.lineTo(outerRight, top);
ctx.lineTo(outerRight, bottom);
ctx.lineTo(innerRight, center);
graphics.df();
graphics.ds();
graphics.RestoreGrState();
}
// Draw preview line
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
if (timeline.tmpScrollOffset !== null) {
graphics.SaveGrState();
graphics.RemoveClipRect();
let sColor = AscCommon.GlobalSkin.AnimPaneTimelineScrollerOutline;
let oColor = AscCommon.RgbaHexToRGBA(sColor);
graphics.p_color(oColor.R, oColor.G, oColor.B, 255);
const xCord = timeline.getLeft() + timeline.getZeroShift() + timeline.tmpScrollOffset;
const height = this.parentControl.drawer.GetHeight() + editor.WordControl.m_oAnimPaneApi.list.Scroll * g_dKoef_pix_to_mm;
graphics.drawVerLine(1, xCord, this.getTop(), this.getTop() + height, this.getPenWidth(graphics));
graphics.RestoreGrState();
}
return true;
}
CSeqList.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback) this.onMouseDownCallback(e, x, y);
return CControlContainer.prototype.onMouseDown.call(this, e, x, y);
};
CSeqList.prototype.onMouseMove = function (e, x, y) {
if (this.onMouseMoveCallback) this.onMouseMoveCallback(e, x, y);
return CControlContainer.prototype.onMouseMove.call(this, e, x, y);
};
CSeqList.prototype.onMouseUp = function (e, x, y) {
if (this.onMouseUpCallback) this.onMouseUpCallback(e, x, y);
return CControlContainer.prototype.onMouseUp.call(this, e, x, y);
};
CSeqList.prototype.onUpdateSeqList = function () {
if (Asc.editor.WordControl.m_oAnimPaneApi.list.Control) {
this.onUpdate()
}
}
CSeqList.prototype.checkCachedTexture = function (graphics) {
var dGraphicsScale = graphics.m_oCoordTransform.sx;
if (this.cachedCanvas) {
var dScale = this.cachedCanvas.scale;
if (AscFormat.fApproxEqual(dScale, dGraphicsScale)) {
return this.cachedCanvas;
}
}
this.bDrawTexture = true;
var oBaseTexture = this.getAnimTexture(dGraphicsScale);
if (oBaseTexture) {
this.cachedCanvas = new CAnimTexture(this, oBaseTexture.canvas, oBaseTexture.scale, oBaseTexture.x, oBaseTexture.y);
}
else {
this.cachedCanvas = null;
}
this.bDrawTexture = false;
return this.cachedCanvas;
};
CSeqList.prototype.clearCachedTexture = function () {
if (this.cachedCanvas) {
this.cachedCanvas = null;
}
};
CSeqList.prototype.setCurrentlyPlaying = function (demoEffects) {
if (!demoEffects) { return; }
const originalEffects = demoEffects.map(
function (demoEffect) {
return demoEffect.originalNode;
}
);
this.forEachAnimItem(
function (animItem) {
animItem.isCurrentlyPlaying = (originalEffects.indexOf(animItem.effect.originalNode) > -1);
}
)
};
CSeqList.prototype.forEachAnimItem = function (callback) {
// У счетчиков сквозная нумерация
let seqCounter = 0;
let groupCounter = 0;
let itemCounter = 0;
this.children.forEach(function (seq) {
seq.animGroups.forEach(function (group) {
group.children.forEach(function (animItem) {
callback(animItem, itemCounter, groupCounter, seqCounter);
itemCounter++;
})
groupCounter++;
})
seqCounter++;
})
};
// mainSeq or interactiveSeq
function CAnimSequence(oParentControl, oSeq) {
CControlContainer.call(this, oParentControl);
this.seq = oSeq;
this.label = null; //this.addControl(new CLabel(this, "seq"));
this.animGroups = [];
}
InitClass(CAnimSequence, CControlContainer, CONTROL_TYPE_ANIM_SEQ);
CAnimSequence.prototype.getSeq = function () {
return this.seq;
};
CAnimSequence.prototype.recalculateChildren = function () {
this.clear();
let sLabel = this.seq.getLabel();
if (typeof sLabel === "string" && sLabel.length > 0) {
this.label = this.addControl(new CLabel(this, sLabel, 9, true, AscCommon.align_Left));
}
const aAllEffects = this.seq.getAllEffects();
const animGroups = AscFormat.groupBy(aAllEffects, function (effect) { return effect.getIndexInSequence(); })
for (let indexInSequence in animGroups) {
const oAnimGroup = this.addControl(new CAnimGroup(this, animGroups[indexInSequence]));
this.animGroups[this.animGroups.length] = oAnimGroup;
}
};
CAnimSequence.prototype.recalculateChildrenLayout = function () {
let dCurY = 0;
if (this.label) {
dCurY += SEQ_LABEL_MARGIN;
this.label.setLayout(SEQ_LABEL_MARGIN, dCurY, this.getWidth(), SEQ_LABEL_HEIGHT);
this.label.recalculate();
dCurY += this.label.getHeight() + SEQ_LABEL_MARGIN;
}
for (let nGroup = 0; nGroup < this.animGroups.length; ++nGroup) {
this.animGroups[nGroup].setLayout(0, dCurY, this.getWidth(), 0);
this.animGroups[nGroup].recalculate();
dCurY += this.animGroups[nGroup].getHeight();
}
this.setLayout(this.getLeft(), this.getTop(), this.getWidth(), dCurY);
};
function CAnimGroup(oParentControl, aAllGroupEffects) {
CControlContainer.call(this, oParentControl);
this.effects = aAllGroupEffects;
}
InitClass(CAnimGroup, CControlContainer, CONTROL_TYPE_ANIM_GROUP_LIST);
CAnimGroup.prototype.getSeq = function () {
return this.parentControl.getSeq();
};
CAnimGroup.prototype.recalculateChildren = function () {
this.clear();
for (let nCurEffect = this.effects.length - 1; nCurEffect >= 0; --nCurEffect) {
const oItem = new CAnimItem(this, this.effects[nCurEffect]);
this.addControl(oItem);
}
};
CAnimGroup.prototype.recalculateChildrenLayout = function () {
let dLastBottom = 0;
for (let nChild = 0; nChild < this.children.length; ++nChild) {
let oChild = this.children[nChild];
oChild.setLayout(0, dLastBottom, this.getWidth(), ANIM_ITEM_HEIGHT);
oChild.recalculate();
dLastBottom = oChild.getBottom();
}
this.setLayout(this.getLeft(), this.getTop(), this.getWidth(), dLastBottom);
};
CAnimGroup.prototype.draw = function(graphics) {
if (this.isHidden()) { return false; }
if (!this.checkUpdateRect(graphics.updatedRect)) { return false; }
if (!CControlContainer.prototype.draw.call(this, graphics)) { return false; }
// Connection lines drawing
let bShouldDraw = false;
this.effects.some(function (effect) {
if (effect.isSelected()) return bShouldDraw = true;
})
if (!bShouldDraw) { return }
const oThis = this;
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
const timelineShift = ms_to_mm(timeline.getStartTime() * 1000);
let afterItems = []
this.children.forEach(function (animItem) {
if (animItem.effect.isAfterEffect()) afterItems[afterItems.length] = animItem;
})
if (afterItems.length === 0) { return }
graphics.SaveGrState();
graphics.AddClipRect(
afterItems[0].getLeftBorder(),
oThis.parentControl.getTop(),
afterItems[0].getRightBorder() - afterItems[0].getLeftBorder(),
oThis.parentControl.getBottom() - oThis.parentControl.getTop()
);
for (let i = 0; i < afterItems.length; i++) {
const animItem = afterItems[i];
if (animItem.effect === this.effects[this.effects.length - 1]) {
// effects in group are arranged backwards
continue;
}
const align = 0;
const x = ms_to_mm(animItem.effect.getBaseTime()) + animItem.getLeftBorder() - timelineShift;
let top = afterItems[i-1] ? oThis.getTop() + afterItems[i-1].getTop() : oThis.getTop();
top += oThis.parentControl.getTop();
let bottom = afterItems[i+1] ? oThis.getTop() + afterItems[i+1].getTop() : oThis.getBottom();
bottom += oThis.parentControl.getTop();
graphics.drawVerLine(align, x, top, bottom, oThis.getPenWidth(graphics));
}
graphics.RestoreGrState();
function ms_to_mm(nMilliseconds) {
const index = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline.timeScaleIndex;
return nMilliseconds * TIME_INTERVALS[index] / TIME_SCALES[index] / 1000;
}
}
function CAnimItem(oParentControl, oEffect) {
CControlContainer.call(this, oParentControl);
this.effect = oEffect;
if (this.effect.isClickEffect() || !this.effect.getPreviousEffect()) {
this.indexLabel = this.addControl(new CLabel(this, this.effect.getIndexInSequence() + "", INDEX_LABEL_FONTSIZE, false, AscCommon.align_Center))
}
// Event type image
const eventImg = this.getEventImage();
this.eventTypeImage = this.addControl(new CImageControl(this, eventImg.src, eventImg.width, eventImg.height));
// Effect type image
const effectImg = this.getEffectImage();
this.effectTypeImage = this.addControl(new CImageControl(this, effectImg.src, effectImg.width, effectImg.height));
this.effectLabel = this.addControl(new CLabel(this, this.getEffectLabelText(), EFFECT_LABEL_FONTSIZE, false, AscCommon.align_Left));
this.contextMenuButton = this.addControl(new CButton(this, function (e, x, y) {
if (this.hit(x, y) && (e.Button === AscCommon.g_mouse_button_left)) {
this.pressedFlag = true;
}
}, null, showContextMenu));
this.contextMenuButton.icon = this.contextMenuButton.addControl(new CImageControl(
this.contextMenuButton,
AscCommon.GlobalSkin.type == 'light' ? menuButtonIcon_dark : menuButtonIcon_light,
10 * AscCommon.g_dKoef_pix_to_mm, 2 * AscCommon.g_dKoef_pix_to_mm /* 10x2 svg image */
));
this.contextMenuButton.sendContextMenuEvent = function (customX, customY) {
const coords = editor.WordControl.m_oDrawingDocument.ConvertAnimPaneCoordsToCursor(
AscFormat.isRealNumber(customX) ? customX : this.bounds.l,
(AscFormat.isRealNumber(customY) ? customY : this.bounds.t) + HEADER_HEIGHT - editor.WordControl.m_oAnimPaneApi.list.Scroll * g_dKoef_pix_to_mm
);
const data = new AscCommonSlide.CContextMenuData()
data.Type = Asc.c_oAscContextMenuTypes.AnimEffect;
data.X_abs = coords.X;
data.Y_abs = coords.Y;
if (!AscFormat.isRealNumber(customX)) {
data.ButtonWidth = (this.bounds.r - this.bounds.l) * g_dKoef_mm_to_pix;
}
if (!AscFormat.isRealNumber(customY)) {
data.ButtonHeight = (this.bounds.b - this.bounds.t) * g_dKoef_mm_to_pix;
}
data.EffectStartType = this.parentControl.effect.getNodeType();
editor.sync_ContextMenuCallback(data);
}
function showContextMenu(e, x, y) {
if (this.hit(x, y) && !this.isHidden()) {
if (this.pressedFlag) {
this.sendContextMenuEvent();
this.pressedFlag = false;
}
}
}
// Temp fields for effect bar movement
this.tmpDelay = null;
this.tmpDuration = null;
this.tmpRepeatCount = null;
// Callback functions for effect bar events
this.onMouseDownCallback = function (event, x, y) {
if (!this.hit(x, y)) { return }
if (!this.contextMenuButton.hit(x, y)) {
this.updateSelectState(event);
}
const hitRes = this.hitInEffectBar(x, y);
if (hitRes) {
this.hitResult = hitRes;
this.tmpDelay = this.getDelay();
this.tmpDuration = this.getDuration();
if (this.effect.isUntilEffect() && hitRes.type === 'right') {
this.tmpRepeatCount = this.getRepeatCount();
this.initialTmpRepeatCount = this.tmpRepeatCount;
}
this.onUpdate();
}
}
this.onMouseMoveCallback = function (event, x, y) {
if (this.hit(x, y)) {
this.updateCursorType(x, y);
}
if (!this.hitResult) { return }
this.handleMovement(x, y);
this.handleScrollCondition(x, y);
this.onUpdate();
}
this.onMouseUpCallback = function (event, x, y) {
if (this.hit(x, y)) {
if (event.Button === AscCommon.g_mouse_button_right) {
this.contextMenuButton.sendContextMenuEvent(x, y);
}
}
if (!this.hitResult) { return }
this.setNewEffectParams(this.tmpDelay, this.tmpDuration, this.tmpRepeatCount);
this.hitResult = this.tmpDelay = this.tmpDuration = this.tmpRepeatCount = null;
this.onUpdate()
}
}
InitClass(CAnimItem, CControlContainer, CONTROL_TYPE_ANIM_ITEM);
CAnimItem.prototype.recalculateChildrenLayout = function () {
const oSeqLst = this.getSeqList();
const nIndexLabelWidth = oSeqLst ? oSeqLst.getIndexLabelWidth() : 0;
if (this.indexLabel) this.indexLabel.setLayout(0, 0, nIndexLabelWidth, ANIM_ITEM_HEIGHT)
this.eventTypeImage.setLayout(nIndexLabelWidth, 0, EVENT_TYPE_ICON_SIZE, EVENT_TYPE_ICON_SIZE);
this.effectTypeImage.src = this.getEffectImage().src;
this.effectTypeImage.setLayout(this.eventTypeImage.getRight(), 0, EFFECT_TYPE_ICON_SIZE, EFFECT_TYPE_ICON_SIZE);
const zeroPos = COMMON_LEFT_MARGIN + SCALE_BUTTON_LEFT_MARGIN + SCALE_BUTTON_WIDTH + TIMELINE_SCROLL_LEFT_MARGIN + TIMELINE_SCROLL_BUTTON_SIZE;
const labelWidth = zeroPos - COMMON_LEFT_MARGIN - (nIndexLabelWidth + EVENT_TYPE_ICON_SIZE + EFFECT_TYPE_ICON_SIZE);
const gap = (ANIM_ITEM_HEIGHT - EFFECT_BAR_HEIGHT) / 2;
this.effectLabel.setLayout(this.effectTypeImage.getRight(), gap, labelWidth, EFFECT_BAR_HEIGHT);
const menuBtnGap = (ANIM_ITEM_HEIGHT - MENU_BUTTON_SIZE) / 2;
const menuBtnLeft = this.getRight() - MENU_BUTTON_SIZE - menuBtnGap;
this.contextMenuButton.setLayout(menuBtnLeft, menuBtnGap, MENU_BUTTON_SIZE, MENU_BUTTON_SIZE);
this.contextMenuButton.icon.src = AscCommon.GlobalSkin.type == 'light' ? menuButtonIcon_dark : menuButtonIcon_light;
this.contextMenuButton.icon.setLayout(0, 0, MENU_BUTTON_SIZE, MENU_BUTTON_SIZE);
};
CAnimItem.prototype.getEventImage = function () {
let eventImg = {};
if (this.effect.isClickEffect()) {
eventImg.src = clickEffectIcon;
eventImg.width = 11 * AscCommon.g_dKoef_pix_to_mm;
eventImg.height = 16 * AscCommon.g_dKoef_pix_to_mm;
}
if (this.effect.isAfterEffect()) {
eventImg.src = afterEffectIcon;
eventImg.width = 16 * AscCommon.g_dKoef_pix_to_mm;
eventImg.height = 16 * AscCommon.g_dKoef_pix_to_mm;
}
return eventImg;
};
CAnimItem.prototype.getEffectImage = function () {
let effectImg = {};
if (this.effect.cTn.presetClass === AscFormat.PRESET_CLASS_ENTR) {
effectImg.src = entrEffectIcon;
effectImg.width = 20 * AscCommon.g_dKoef_pix_to_mm;
effectImg.height = 20 * AscCommon.g_dKoef_pix_to_mm;
}
if (this.effect.cTn.presetClass === AscFormat.PRESET_CLASS_EMPH) {
effectImg.src = emphEffectIcon;
effectImg.width = 20 * AscCommon.g_dKoef_pix_to_mm;
effectImg.height = 20 * AscCommon.g_dKoef_pix_to_mm;
}
if (this.effect.cTn.presetClass === AscFormat.PRESET_CLASS_EXIT) {
effectImg.src = exitEffectIcon;
effectImg.width = 20 * AscCommon.g_dKoef_pix_to_mm;
effectImg.height = 20 * AscCommon.g_dKoef_pix_to_mm;
}
if (this.effect.cTn.presetClass === AscFormat.PRESET_CLASS_PATH) {
effectImg.src = AscCommon.GlobalSkin.type === 'light' ? pathEffectIcon_dark : pathEffectIcon_light;
effectImg.width = 20 * AscCommon.g_dKoef_pix_to_mm;
effectImg.height = 20 * AscCommon.g_dKoef_pix_to_mm;
}
return effectImg;
};
CAnimItem.prototype.updateSelectState = function (event) {
const oThis = this;
const seqList = Asc.editor.WordControl.m_oAnimPaneApi.list.Control.seqList;
if (event.Button === AscCommon.g_mouse_button_right && !oThis.effect.isSelected()) {
seqList.forEachAnimItem(function (animItem) {
animItem.effect === oThis.effect ? animItem.effect.select() : animItem.effect.deselect();
})
}
if (event.Button === AscCommon.g_mouse_button_left) {
if (event.CtrlKey) {
oThis.effect.toggleSelect();
} else {
seqList.forEachAnimItem(function (animItem) {
animItem.effect === oThis.effect ? animItem.effect.select() : animItem.effect.deselect();
})
}
}
Asc.editor.WordControl.m_oLogicDocument.RedrawCurSlide();
Asc.editor.WordControl.m_oLogicDocument.Document_UpdateInterfaceState();
}
CAnimItem.prototype.updateCursorType = function (x, y) {
const cursorType = this.getNewCursorType(x, y);
const mouseMoveData = this.getMouseMoveData(x, y);
const animPane = Asc.editor.WordControl.m_oAnimPaneApi;
animPane.SetCursorType(cursorType, mouseMoveData);
animPane.sentMouseMoveData = mouseMoveData;
}
CAnimItem.prototype.getNewCursorType = function (x, y) {
const isVerticalDrag = null !== editor.WordControl.m_oAnimPaneApi.list.Control.seqList.nPressedSlot;
if (isVerticalDrag) {
return 'grabbing';
}
let draggingAnimItem;
editor.WordControl.m_oAnimPaneApi.list.Control.seqList.forEachAnimItem(function (animItem) {
if (animItem.hitResult) {
draggingAnimItem = animItem;
}
});
const hitRes = draggingAnimItem
? draggingAnimItem.hitResult
: (this.hitResult || this.hitInEffectBar(x, y));
const cursorTypes = {
'left': 'col-resize',
'right': 'col-resize',
'partition': 'col-resize',
'center': 'ew-resize'
};
const cursorType = hitRes
? cursorTypes[hitRes.type]
: this.contextMenuButton.hit(x, y) ? 'default' : 'ns-resize';
return cursorType;
};
CAnimItem.prototype.getMouseMoveData = function (x, y) {
const coords = editor.WordControl.m_oDrawingDocument.ConvertAnimPaneCoordsToCursor(
x, y + HEADER_HEIGHT - editor.WordControl.m_oAnimPaneApi.list.Scroll * g_dKoef_pix_to_mm
);
const mouseMoveData = new CMouseMoveData();
mouseMoveData.X_abs = coords.X;
mouseMoveData.Y_abs = coords.Y;
const isVerticalDrag = null !== editor.WordControl.m_oAnimPaneApi.list.Control.seqList.nPressedSlot;
if (!this.contextMenuButton.hit(x, y) && !isVerticalDrag) {
mouseMoveData.Type = Asc.c_oAscMouseMoveDataTypes.EffectInfo;
const tooltipInfo = this.getInfoForTooltip(x, y);
if (typeof tooltipInfo === 'string') {
mouseMoveData.EffectText = tooltipInfo;
} else {
mouseMoveData.EffectDescription = tooltipInfo;
}
}
return mouseMoveData;
};
CAnimItem.prototype.getInfoForTooltip = function (x, y) {
// If there is a pressed animItem - we take the information from it,
// otherwise - from this one (literally 'this' xd)
let currentAnimItem = this;
const seqList = editor.WordControl.m_oAnimPaneApi.list.Control.seqList
seqList.forEachAnimItem(function (animItem) {
if (animItem.hitResult) { currentAnimItem = animItem; }
})
const templateStrings = {
startTime: AscCommon.translateManager.getValue('Start: ${0}s'),
endTime: AscCommon.translateManager.getValue('End: ${0}s'),
loopTime: AscCommon.translateManager.getValue('Loop: ${0}s'),
};
// When dragging (when animItem's bar is pressed)
if (currentAnimItem.hitResult) {
let time;
switch (currentAnimItem.hitResult.type) {
case 'center':
time = currentAnimItem.getDelay() / 1000;
return templateStrings.startTime.replace('${0}', time.toFixed(1));
case 'left':
time = currentAnimItem.getDelay() / 1000;
return templateStrings.startTime.replace('${0}', time.toFixed(1));
case 'right':
time = currentAnimItem.getDelay() / 1000 + currentAnimItem.getDuration() / 1000;
return templateStrings.endTime.replace('${0}', time.toFixed(1));
case 'partition':
time = (currentAnimItem.getDuration() / 1000);
return templateStrings.loopTime.replace('${0}', time.toFixed(1));
}
}
if (currentAnimItem.hitInEffectBar(x, y)) {
const startTime = (currentAnimItem.getDelay() / 1000).toFixed(1);
const endTime = ((currentAnimItem.getDelay() + currentAnimItem.getDuration()) / 1000).toFixed(1);
const result = [
templateStrings.startTime.replace('${0}', startTime),
templateStrings.endTime.replace('${0}', endTime),
];
return result.join(', ');
} else {
// Belongs to [AscFormat.NODE_TYPE_AFTEREFFECT, AscFormat.NODE_TYPE_CLICKEFFECT, AscFormat.NODE_TYPE_WITHEFFECT]
const eventType = currentAnimItem.effect.getNodeType();
// Belongs to [AscFormat.PRESET_CLASS_ENTR, AscFormat.PRESET_CLASS_EMPH, AscFormat.PRESET_CLASS_EXIT, AscFormat.PRESET_CLASS_PATH]
const presetClass = currentAnimItem.effect.cTn.presetClass;
// Belongs to presets of animation - [AscFormat.ENTRANCE_APPEAR, ..., AscFormat.EMPHASIS_FILL_COLOR, ...]
const presetId = currentAnimItem.effect.cTn.presetID;
const shapeName = currentAnimItem.effect.getObjectName();
return [eventType, presetClass, presetId, shapeName];
}
}
CAnimItem.prototype.getEffectLabelText = function () {
const objectName = this.effect.getObjectName();
const objectText = this.effect.getObjectText();
return objectText ? (objectName + ': ' + objectText) : objectName;
};
CAnimItem.prototype.handleScrollCondition = function (x, y) {
const leftBorder = this.getLeftBorder();
const rightBorder = this.getRightBorder();
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
if (x <= leftBorder || x >= rightBorder) {
if (!timeline.isOnScroll()) {
let scrollStep = timeline.getWidth() * SCROLL_STEP / 10;
scrollStep = x <= leftBorder ? -scrollStep : scrollStep;
let scrollTimerDelay = 0;
let scrollTimerInterval = 50;
timeline.startScroll(scrollStep, scrollTimerDelay, scrollTimerInterval);
}
} else timeline.endScroll();
}
CAnimItem.prototype.handleMovement = function (x, y) {
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
const timelineShift = this.ms_to_mm(timeline.getStartTime() * 1000);
const repeats = this.getRepeatCount() / 1000;
let pointOfLanding = x - this.getLeftBorder() + timelineShift;
if (this.hitResult.type === 'right') {
if (this.effect.isUntilEffect()) {
const pointOfContact = this.ms_to_mm(this.effect.getFullDelay() + this.effect.asc_getDuration() * this.initialTmpRepeatCount / 1000);
let diff = this.mm_to_ms(pointOfLanding - pointOfContact);
const newTmpRepeatCount = this.initialTmpRepeatCount + diff / (this.effect.asc_getDuration() / 1000);
this.tmpRepeatCount = Math.max(newTmpRepeatCount, MIN_ALLOWED_REPEAT_COUNT);
} else {
const pointOfContact = this.ms_to_mm(this.effect.getFullDelay() + this.effect.asc_getDuration() * repeats);
let diff = this.mm_to_ms(pointOfLanding - pointOfContact);
const newTmpDuration = this.effect.asc_getDuration() + diff / repeats;
this.tmpDuration = Math.max(MIN_ALLOWED_DURATION, newTmpDuration);
}
}
if (this.hitResult.type === 'left') {
const pointOfContact = this.ms_to_mm(this.effect.getFullDelay());
const basePoint = this.ms_to_mm(this.effect.getBaseTime());
pointOfLanding = Math.max(pointOfLanding, basePoint);
const diff = this.mm_to_ms(pointOfLanding - pointOfContact);
const newTmpDuration = this.effect.asc_getDuration() - diff / repeats;
const newTmpDelay = this.effect.getFullDelay() + diff;
const maxNewTmpDuration = this.effect.getFullDelay() / repeats + this.effect.asc_getDuration();
const maxNewTmpDelay = this.effect.getFullDelay() + (this.effect.asc_getDuration() - MIN_ALLOWED_DURATION) * repeats;
if (this.effect.isUntilEffect()) {
this.tmpDelay = Math.max(newTmpDelay, this.effect.getBaseTime());
} else {
this.tmpDuration = Math.min(Math.max(newTmpDuration, MIN_ALLOWED_DURATION), maxNewTmpDuration);
this.tmpDelay = Math.min(Math.max(newTmpDelay, this.effect.getBaseTime()), maxNewTmpDelay);
}
}
if (this.hitResult.type === 'center') {
const pointOfContact = this.ms_to_mm(this.effect.getFullDelay()) + this.hitResult.offset;
const diff = this.mm_to_ms(pointOfLanding - pointOfContact);
const newTmpDelay = this.effect.getFullDelay() + diff;
this.tmpDelay = Math.max(newTmpDelay, this.effect.getBaseTime());
}
if (this.hitResult.type === 'partition') {
const pointOfContact = this.ms_to_mm(this.effect.getFullDelay() + this.effect.asc_getDuration() * this.hitResult.index);
const diff = this.mm_to_ms(pointOfLanding - pointOfContact);
const newTmpDuration = this.effect.asc_getDuration() + diff / this.hitResult.index;
this.tmpDuration = Math.max(MIN_ALLOWED_DURATION, newTmpDuration);
}
}
CAnimItem.prototype.handleTimelineScroll = function (step) {
if (!this.hitResult) { return }
const repeats = this.getRepeatCount() / 1000;
const diff = this.mm_to_ms(step);
let newTmpDelay;
let newTmpDuration;
let newTmpRepeatCount;
switch (this.hitResult.type) {
case 'center':
newTmpDelay = this.tmpDelay + diff;
this.tmpDelay = Math.max(newTmpDelay, this.effect.getBaseTime());
break;
case 'right':
if (this.effect.isUntilEffect()) {
newTmpRepeatCount = this.tmpRepeatCount + diff / (this.effect.asc_getDuration() / 1000);
this.tmpRepeatCount = Math.max(newTmpRepeatCount, MIN_ALLOWED_REPEAT_COUNT);
} else {
newTmpDuration = this.tmpDuration + diff / repeats;
this.tmpDuration = Math.max(MIN_ALLOWED_DURATION, newTmpDuration);
}
break;
case 'left':
newTmpDuration = this.tmpDuration - diff / repeats;
newTmpDelay = this.tmpDelay + diff;
const maxNewTmpDuration = (this.effect.getFullDelay() - this.effect.getBaseTime()) / repeats + this.effect.asc_getDuration();
const maxNewTmpDelay = this.effect.getFullDelay() + (this.effect.asc_getDuration() - MIN_ALLOWED_DURATION) * repeats;
if (this.effect.isUntilEffect()) {
this.tmpDelay = Math.max(newTmpDelay, this.effect.getBaseTime());
} else {
this.tmpDuration = Math.min(Math.max(newTmpDuration, MIN_ALLOWED_DURATION), maxNewTmpDuration);
this.tmpDelay = Math.min(Math.max(newTmpDelay, this.effect.getBaseTime()), maxNewTmpDelay);
}
break;
case 'partition':
newTmpDuration = this.tmpDuration + diff / this.hitResult.index;
this.tmpDuration = Math.max(MIN_ALLOWED_DURATION, newTmpDuration);
break;
}
this.onUpdate();
}
CAnimItem.prototype.ms_to_mm = function (nMilliseconds) {
if (nMilliseconds === null || nMilliseconds === undefined) { return }
const index = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline.timeScaleIndex;
return nMilliseconds * TIME_INTERVALS[index] / TIME_SCALES[index] / 1000;
};
CAnimItem.prototype.mm_to_ms = function (nMillimeters) {
if (nMillimeters === null || nMillimeters === undefined) { return }
const index = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline.timeScaleIndex;
return nMillimeters / TIME_INTERVALS[index] * TIME_SCALES[index] * 1000;
};
CAnimItem.prototype.getDelay = function () {
return this.tmpDelay !== null ? this.tmpDelay : this.effect.getFullDelay();
}
CAnimItem.prototype.getDuration = function () {
return this.tmpDuration !== null ? this.tmpDuration : this.effect.asc_getDuration()
}
CAnimItem.prototype.getRepeatCount = function () {
if (this.tmpRepeatCount !== null) { return this.tmpRepeatCount; }
else if (this.effect.asc_getRepeatCount() > 0) { return this.effect.asc_getRepeatCount(); }
else {
const bounds = this.getEffectBarBounds();
const width = bounds.r - bounds.l;
const totalWidth = this.getRightBorder() - bounds.l;
return (totalWidth / width * 1000) >> 0; // approximate repeat counter
}
}
CAnimItem.prototype.getLeftBorder = function () {
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
return timeline.getLeft() + timeline.getZeroShift();
}
CAnimItem.prototype.getRightBorder = function () {
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
return timeline.getRight() - TIMELINE_SCROLL_BUTTON_SIZE;
}
CAnimItem.prototype.getEffectBarBounds = function () {
const timeline = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control.timeline;
const timelineShift = timeline.getStartTime() * 1000;
let l = this.ms_to_mm(this.getDelay()) + this.getLeftBorder() - this.ms_to_mm(timelineShift);
let r = l + this.ms_to_mm(this.getDuration());
let t = this.bounds.t + (ANIM_ITEM_HEIGHT - EFFECT_BAR_HEIGHT) / 2;
let b = t + EFFECT_BAR_HEIGHT;
if (this.effect.isInstantEffect()) {
return { l: l, r: l + EFFECT_BAR_HEIGHT, t: t, b: b }
}
return { l: l, r: r, t: t, b: b }
};
CAnimItem.prototype.draw = function drawEffectBar(graphics) {
const timelineContainer = Asc.editor.WordControl.m_oAnimPaneApi.timeline.Control
if (!timelineContainer) { return }
this.effect.isSelected() ? this.contextMenuButton.show() : this.contextMenuButton.hide();
if (!CControlContainer.prototype.draw.call(this, graphics)) { return false }
if (this.isHidden()) { return false }
if (!this.checkUpdateRect(graphics.updatedRect)) { return false }
graphics.SaveGrState();
const clipL = this.getLeftBorder();
const clipT = this.bounds.t;
const clipW = this.getRightBorder() - clipL;
const clipH = this.bounds.b - this.bounds.t;
graphics.AddClipRect(clipL, clipT, clipW, clipH);
const oSkin = AscCommon.GlobalSkin;
let sFillColor, sOutlineColor;
switch (this.effect.cTn.presetClass) {
case AscFormat.PRESET_CLASS_ENTR:
sFillColor = oSkin.AnimPaneEffectBarFillEntrance;
sOutlineColor = oSkin.AnimPaneEffectBarOutlineEntrance;
break;
case AscFormat.PRESET_CLASS_EMPH:
sFillColor = oSkin.AnimPaneEffectBarFillEmphasis;
sOutlineColor = oSkin.AnimPaneEffectBarOutlineEmphasis;
break;
case AscFormat.PRESET_CLASS_EXIT:
sFillColor = oSkin.AnimPaneEffectBarFillExit;
sOutlineColor = oSkin.AnimPaneEffectBarOutlineExit;
break;
case AscFormat.PRESET_CLASS_PATH:
sFillColor = oSkin.AnimPaneEffectBarFillPath;
sOutlineColor = oSkin.AnimPaneEffectBarOutlinePath;
break;
default:
sFillColor = '#A0A0A0';
sOutlineColor = '#404040';
}
// hex to rgba
const oFillColorRGBA = AscCommon.RgbaHexToRGBA(sFillColor);
const oOutlineColorRGBA = AscCommon.RgbaHexToRGBA(sOutlineColor);
// rgba to CShapeColor
let oFillColor = new AscFormat.CShapeColor(oFillColorRGBA.R, oFillColorRGBA.G, oFillColorRGBA.B);
let oOutlineColor = new AscFormat.CShapeColor(oOutlineColorRGBA.R, oOutlineColorRGBA.G, oOutlineColorRGBA.B);
// change brightness of CShapeColor during demo preview
if (Asc.editor.asc_IsStartedAnimationPreview()) {
if (!this.isCurrentlyPlaying) {
oFillColor = oFillColor.getColorData(0.4);
oOutlineColor = oOutlineColor.getColorData(0.4);
}
}
graphics.b_color1(oFillColor.r, oFillColor.g, oFillColor.b, 255);
graphics.p_color(oOutlineColor.r, oOutlineColor.g, oOutlineColor.b, 255);
const bounds = this.getEffectBarBounds();
if (this.effect.isInstantEffect()) {
// In case we need to draw a triangle
let transform = graphics.m_oFullTransform;
let left = (transform.TransformPointX(bounds.l, bounds.t) + 0.5) >> 0;
let top = (transform.TransformPointY(bounds.l, bounds.t) + 0.5) >> 0;
let right = (transform.TransformPointX(bounds.r, bounds.t) + 0.5) >> 0;
let bottom = (transform.TransformPointY(bounds.l, bounds.b) + 0.5) >> 0;
let ctx = graphics.m_oContext;
ctx.beginPath();
ctx.moveTo(left, top);
ctx.lineTo(left + 5, top);
ctx.lineTo(right, top + (bottom - top) / 2);
ctx.lineTo(left + 5, bottom);
ctx.lineTo(left, bottom);
ctx.lineTo(left, top);
graphics.df();
graphics.ds();
} else {
let repeats;
if (this.effect.isUntilEffect() && this.tmpRepeatCount === null) {
// In case we need to draw an infinite bar with an arrow
const barWidth = Math.max(this.getRightBorder() - bounds.l - EFFECT_BAR_HEIGHT, this.ms_to_mm(MIN_ALLOWED_DURATION));
// repeats = barWidth / (bounds.r - bounds.l);
repeats = this.getRepeatCount() / 1000;
let transform = graphics.m_oFullTransform;
let left = (transform.TransformPointX(bounds.l, bounds.t) + 0.5) >> 0;
let top = (transform.TransformPointY(bounds.l, bounds.t) + 0.5) >> 0;
let right = (transform.TransformPointX(bounds.l + barWidth, bounds.t) + 0.5) >> 0;
let bottom = (transform.TransformPointY(bounds.l, bounds.b) + 0.5) >> 0;
let ctx = graphics.m_oContext;
ctx.beginPath();
ctx.moveTo(left, top);
ctx.lineTo(right, top);
ctx.lineTo(right + 5, top);
ctx.lineTo(right + EFFECT_BAR_HEIGHT * g_dKoef_mm_to_pix, top + (bottom - top) / 2);
ctx.lineTo(right + 5, bottom);
ctx.lineTo(right, bottom);
ctx.lineTo(left, bottom);
ctx.lineTo(left, top);
graphics.df();
graphics.ds();
// renew clipRect to clip marks
graphics.RemoveClipRect();
graphics.AddClipRect(clipL, clipT, clipW - EFFECT_BAR_HEIGHT, clipH);
} else {
// In case we need to draw a bar
repeats = this.getRepeatCount() / 1000;
const barWidth = (bounds.r - bounds.l) * repeats;
graphics.rect(bounds.l, bounds.t, barWidth, bounds.b - bounds.t);
graphics.df();
graphics.ds();
}
// draw marks
if ((bounds.r - bounds.l) >= 2 * g_dKoef_pix_to_mm) {
const gap = (bounds.b - bounds.t) / 5;
for (let markIndex = 1; markIndex < repeats; markIndex++) {
const xCord = bounds.l + markIndex * (bounds.r - bounds.l)
graphics.drawVerLine(2, xCord, bounds.t + gap, bounds.b - gap, this.getPenWidth(graphics));
}
}
}
graphics.RestoreGrState();
};
CAnimItem.prototype.hitInEffectBar = function (x, y) {
if (!this.hit(x, y)) { return null; }
const bounds = this.getEffectBarBounds();
const isOutOfBorders = x < this.getLeftBorder() || x > this.getRightBorder() || y < bounds.t || y > bounds.b
if (isOutOfBorders) { return null; }
const width = bounds.r - bounds.l;
const repeats = this.getRepeatCount() / 1000;
const delta = AscFormat.DIST_HIT_IN_LINE / 2
let barRight = this.effect.isUntilEffect() ? this.getRightBorder() : bounds.l + width * repeats;
barRight = Math.max(bounds.l + this.ms_to_mm(MIN_ALLOWED_DURATION), barRight);
if (!this.effect.isInstantEffect()) {
if (x >= bounds.l - delta && x <= bounds.l + delta) {
return { type: 'left' };
}
if (this.effect.isUntilEffect()) {
if (x >= barRight - EFFECT_BAR_HEIGHT - delta && x <= barRight + delta) {
return { type: 'right' };
}
} else {
if (x >= barRight - delta && x <= barRight + delta) {
return { type: 'right' };
}
}
const partitionIndex = (x - bounds.l) / width >> 0;
// if effect isUntilEffect condition (partitionIndex < repeats) doesnt matter
if (partitionIndex > 0 && (this.effect.isUntilEffect() || partitionIndex < repeats)) {
const partitionPos = bounds.l + partitionIndex * width;
if (x <= partitionPos + delta && x >= partitionPos - delta) {
return { type: 'partition', index: partitionIndex };
}
}
}
if (x > bounds.l && x < barRight) {
return { type: 'center', offset: x - bounds.l };
}
return null;
};
CAnimItem.prototype.hit = function (x, y) {
const headerY = y + HEADER_HEIGHT - editor.WordControl.m_oAnimPaneApi.list.Scroll * g_dKoef_pix_to_mm
if (editor.WordControl.m_oAnimPaneApi.header.Control.hit(x, headerY)) {
return false;
}
if (this.parentControl && !this.parentControl.hit(x, y)) { return false; }
const oInv = this.invertTransform;
const tx = oInv.TransformPointX(x, y);
const ty = oInv.TransformPointY(x, y);
if (tx >= 0 && tx <= this.extX) {
if (ty >= 0 && ty <= this.extY / 2) { return 'top' }
if (ty > this.extY / 2 && ty <= this.extY) { return 'bottom' }
}
return false;
};
CAnimItem.prototype.setNewEffectParams = function (newDelay, newDuration, newRepeatCount) {
const minAllowedDelta = 1 // in ms
let dOwnNewDelay = newDelay - this.effect.getBaseTime();
const delayDiff = Math.abs(dOwnNewDelay - this.effect.asc_getDelay());
const durationDiff = Math.abs(newDuration - this.effect.asc_getDuration());
const repeatCountDiff = Math.abs(newRepeatCount - this.effect.asc_getRepeatCount());
const effectCopy = AscFormat.ExecuteNoHistory(function () {
let oCopy = this.effect.createDuplicate();
oCopy.merge(this.effect);
return oCopy;
}, this, []);
if (dOwnNewDelay !== null && dOwnNewDelay !== undefined && delayDiff >= minAllowedDelta) {
effectCopy.asc_putDelay(dOwnNewDelay);
}
if (newDuration !== null && newDuration !== undefined && durationDiff >= minAllowedDelta) {
effectCopy.asc_putDuration(newDuration);
}
if (newRepeatCount !== null && newRepeatCount !== undefined && repeatCountDiff >= 1) {
effectCopy.asc_putRepeatCount(newRepeatCount);
}
if (this.effect.isEqualProperties(effectCopy)) { return }
Asc.editor.WordControl.m_oLogicDocument.SetAnimationProperties(effectCopy, false);
};
CAnimItem.prototype.onMouseDown = function (e, x, y) {
if (this.onMouseDownCallback && this.onMouseDownCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseDown.call(this, e, x, y);
};
CAnimItem.prototype.onMouseMove = function (e, x, y) {
if (this.onMouseMoveCallback && this.onMouseMoveCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseMove.call(this, e, x, y);
};
CAnimItem.prototype.onMouseUp = function (e, x, y) {
if (this.onMouseUpCallback && this.onMouseUpCallback.call(this, e, x, y)) {
return true;
}
return CControlContainer.prototype.onMouseUp.call(this, e, x, y);
};
CAnimItem.prototype.canHandleEvents = function () {
return true;
};
CAnimItem.prototype.getFillColor = function() {
const oSkin = AscCommon.GlobalSkin;
if (this.effect.isSelected()) { return oSkin.AnimPaneItemFillSelected; }
if (this.isHovered()) { return oSkin.AnimPaneItemFillHovered; }
return null;
};
// HEADER
const HEADER_HEIGHT = 40 * AscCommon.g_dKoef_pix_to_mm;
const HEADER_LABEL_FONTSIZE = 10;
const HEADER_LABEL_WIDTH = 101 * AscCommon.g_dKoef_pix_to_mm;
const PLAY_BUTTON_HEIGHT = 24 * AscCommon.g_dKoef_pix_to_mm;
const PLAY_BUTTON_LEFT_MARGIN = 30 * AscCommon.g_dKoef_pix_to_mm;
const PLAY_BUTTON_LEFT_PADDING = 8 * AscCommon.g_dKoef_pix_to_mm;
const PLAY_BUTTON_RIGHT_PADDING = 12 * AscCommon.g_dKoef_pix_to_mm;
const PLAY_BUTTON_ICON_SIZE = 20 * AscCommon.g_dKoef_pix_to_mm;;
const PLAY_BUTTON_LABEL_FONTSIZE = 9;
const PLAY_BUTTON_MAX_LABEL_WIDTH = 100 * g_dKoef_pix_to_mm;
const PLAY_BUTTON_LABEL_LEFT_MARGIN = 4 * AscCommon.g_dKoef_pix_to_mm;
const MOVE_BUTTON_SIZE = 24 * AscCommon.g_dKoef_pix_to_mm;
const MOVE_UP_BUTTON_LEFT_MARGIN = 14 * AscCommon.g_dKoef_pix_to_mm;
const MOVE_DOWN_BUTTON_LEFT_MARGIN = 4 * AscCommon.g_dKoef_pix_to_mm;
const CLOSE_BUTTON_SIZE = 24 * AscCommon.g_dKoef_pix_to_mm;
// TIMELINE
const TIMELINE_HEIGHT = 40 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLL_HEIGHT = 17 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLL_ABSOLUTE_LEFT = 143 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLL_LEFT_MARGIN = 10 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLL_RIGHT_MARGIN = 40 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLL_BUTTON_SIZE = 17 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_SCROLLER_WIDTH = 16 * AscCommon.g_dKoef_pix_to_mm;
const ZOOM_BUTTON_SIZE = 20 * AscCommon.g_dKoef_pix_to_mm;
const ZOOM_LABEL_FONTSIZE = 9;
const ZOOM_LABEL_WIDTH = 80 * AscCommon.g_dKoef_pix_to_mm;
const ZOOM_LABEL_MARGIN = 5 * AscCommon.g_dKoef_pix_to_mm;
const SCALE_BUTTON_WIDTH = 76 * AscCommon.g_dKoef_pix_to_mm;
const SCALE_BUTTON_LEFT_MARGIN = 43 * AscCommon.g_dKoef_pix_to_mm;
const TIMELINE_LABEL_WIDTH = 100;
const TIMELINE_LABEL_FONTSIZE = 7.5;
const SCROLL_TIMER_INTERVAL = 150;
const SCROLL_TIMER_DELAY = 600;
const SCROLL_STEP = 0.26
const TIME_SCALES = [0.25, 1, 1, 2, 5, 10, 20, 60, 120, 300, 600, 600]; // in seconds
const SMALL_TIME_INTERVAL = 15;
const MIDDLE_1_TIME_INTERVAL = 20;
const MIDDLE_2_TIME_INTERVAL = 25;
const LONG_TIME_INTERVAL = 30;
const TIME_INTERVALS = [
SMALL_TIME_INTERVAL,
LONG_TIME_INTERVAL, //1
SMALL_TIME_INTERVAL, //1
SMALL_TIME_INTERVAL, //2
MIDDLE_1_TIME_INTERVAL, //5
MIDDLE_1_TIME_INTERVAL,//10
MIDDLE_1_TIME_INTERVAL,//20
MIDDLE_2_TIME_INTERVAL,//60
MIDDLE_2_TIME_INTERVAL,//120
MIDDLE_2_TIME_INTERVAL,//300
MIDDLE_2_TIME_INTERVAL,//600
SMALL_TIME_INTERVAL//600
]; // in mms
// SEQUENCE LIST
const SEQ_LABEL_MARGIN = 3;
const SEQ_LABEL_HEIGHT = 15 * AscCommon.g_dKoef_pix_to_mm;
const ANIM_ITEM_HEIGHT = 24 * AscCommon.g_dKoef_pix_to_mm;
const INDEX_LABEL_FONTSIZE = 7.5;
const INDEX_LABEL_WIDTH = 19 * AscCommon.g_dKoef_pix_to_mm;
const EVENT_TYPE_ICON_SIZE = ANIM_ITEM_HEIGHT;
const EFFECT_TYPE_ICON_SIZE = ANIM_ITEM_HEIGHT;
const EFFECT_LABEL_FONTSIZE = 7.5;
const EFFECT_BAR_HEIGHT = ANIM_ITEM_HEIGHT * 5 / 8;
const MENU_BUTTON_SIZE = 15 * AscCommon.g_dKoef_pix_to_mm;
const MIN_ALLOWED_DURATION = 10; // milliseconds
const MIN_ALLOWED_REPEAT_COUNT = 10; // equals 0.01 of full effect duration
// COMMON
const COMMON_LEFT_MARGIN = 14 * AscCommon.g_dKoef_pix_to_mm;
const COMMON_RIGHT_MARGIN = 20 * AscCommon.g_dKoef_pix_to_mm;
// const ALIGNMENT_LINE = MATH.max(CLOSE_BUTTON_SIZE, MENU_BUTTON_SIZE, TIMELINE_SCROLL_BUTTON_SIZE) / 2;
// ICONS
const playIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDEwTDEwIDVMMiAtNC43NjgzN2UtMDdWMTBaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K';
const playIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yIDEwTDEwIDVMMiAtNC43NjgzN2UtMDdWMTBaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K';
const stopIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K';
const stopIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjEwIiBoZWlnaHQ9IjEwIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K';
const clickEffectIcon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxMiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTIgMC41SDEwQzEwLjgyODQgMC41IDExLjUgMS4xNzE1NyAxMS41IDJWMTJDMTEuNSAxMy45MzMgOS45MzMgMTUuNSA4IDE1LjVINEMyLjA2NyAxNS41IDAuNSAxMy45MzMgMC41IDEyVjJDMC41IDEuMTcxNTcgMS4xNzE1NyAwLjUgMiAwLjVaIiBmaWxsPSJ3aGl0ZSIgc3Ryb2tlPSIjNDQ0NDQ0Ii8+CjxyZWN0IHg9IjUiIHk9IjIiIHdpZHRoPSIyIiBoZWlnaHQ9IjQiIGZpbGw9IiM0NDQ0NDQiLz4KPC9zdmc+Cg==';
const afterEffectIcon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTggMTUuNUMxMi4xNDIxIDE1LjUgMTUuNSAxMi4xNDIxIDE1LjUgOEMxNS41IDMuODU3ODYgMTIuMTQyMSAwLjUgOCAwLjVDMy44NTc4NiAwLjUgMC41IDMuODU3ODYgMC41IDhDMC41IDEyLjE0MjEgMy44NTc4NiAxNS41IDggMTUuNVoiIGZpbGw9IndoaXRlIiBzdHJva2U9IiM0NDQ0NDQiLz4KPHBhdGggZD0iTTExIDguNUg3IiBzdHJva2U9IiM0NDQ0NDQiLz4KPHBhdGggZD0iTTcuNSA0VjkiIHN0cm9rZT0iIzQ0NDQ0NCIvPgo8L3N2Zz4K';
const entrEffectIcon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxLjAwMDAyQzkuNzExNjQgMC45OTgxNDIgOS40MjIyNSAxLjE2Mjk3IDkuMzE0NTQgMS40OTQ0OUw3LjM3MDc5IDcuNTIzNDZDNy4yOTE4MyA3Ljc2NjQ3IDcuMDkxMzIgNy45NDQ4IDYuODQ5NjkgOEgxLjcxN0MxLjAyMzc1IDggMC43MzU1MTYgOC44ODcxIDEuMjk2MzYgOS4yOTQ1OEw1LjgyNzIyIDEyLjQ4NzlDNS43ODMzMiAxMi42NjA5IDUuNzMxNzEgMTIuODQwMyA1LjY3MTI5IDEzLjAyNjJMNC4wMzcyOCAxOC4wNTUyQzMuODIzMDUgMTguNzE0NSA0LjU3NzY3IDE5LjI2MjggNS4xMzg1MiAxOC44NTUzTDEwIDE1LjQyODlMMTQuODYxNSAxOC44NTUzQzE1LjQyMjMgMTkuMjYyOCAxNi4xNzY5IDE4LjcxNDUgMTUuOTYyNyAxOC4wNTUyTDE0LjMyODcgMTMuMDI2MkMxNC4yNjgzIDEyLjg0MDMgMTQuMjE2NyAxMi42NjA5IDE0LjE3MjggMTIuNDg3OUwxOC43MDM2IDkuMjk0NThDMTkuMjY0NSA4Ljg4NzEgMTguOTc2MiA4IDE4LjI4MyA4SDEzLjE1MDNDMTIuOTA4NyA3Ljk0NDggMTIuNzA4MiA3Ljc2NjQ3IDEyLjYyOTIgNy41MjM0NkwxMC42ODU1IDEuNDk0NDlDMTAuNTc3NyAxLjE2Mjk3IDEwLjI4ODQgMC45OTgxNDIgMTAgMS4wMDAwMlpNMTAgMi42MDAzMUM5LjMwMDY2IDQuNzM5NDYgNy44MTc1MSA5LjAwMDAxIDcuODE3NTEgOS4wMDAwMUgyLjYwMDFMNy4wMDAxIDEyLjFDNi42MTQ0OSAxMy40NDk2IDYuMTcxNzMgMTQuNzQ0OCA1LjcyMjY5IDE2LjA1ODRDNS41NDg0NSAxNi41NjgxIDUuMzczMjYgMTcuMDgwNSA1LjIwMDEgMTcuNkwxMCAxNC4yMzIyTDE0Ljc5OTkgMTcuNkMxNC42MjY3IDE3LjA4MDYgMTQuNDUxNiAxNi41NjgxIDE0LjI3NzMgMTYuMDU4NUMxMy44MjgzIDE0Ljc0NDkgMTMuMzg1NSAxMy40NDk2IDEyLjk5OTkgMTIuMUwxNy4zOTk5IDkuMDAwMDFIMTIuMTgyNUMxMi4xODI1IDkuMDAwMDEgMTAuNjk5MyA0LjczOTQ2IDEwIDIuNjAwMzFaIiBmaWxsPSIjMEU4QTI2Ii8+CjxwYXRoIG9wYWNpdHk9IjAuNSIgZD0iTTcuODE3NTEgOS4wMDAyOUM3LjgxNzUxIDkuMDAwMjkgOS4zMDA2NiA0LjczOTc0IDEwIDIuNjAwNTlDMTAuNjk5MyA0LjczOTc0IDEyLjE4MjUgOS4wMDAyOSAxMi4xODI1IDkuMDAwMjlIMTcuMzk5OUwxMi45OTk5IDEyLjEwMDNDMTMuMzg1NSAxMy40NDk5IDEzLjgyODMgMTQuNzQ1MSAxNC4yNzczIDE2LjA1ODdDMTQuNDUxNiAxNi41NjgzIDE0LjYyNjcgMTcuMDgwOCAxNC43OTk5IDE3LjYwMDNMMTAgMTQuMjMyNUw1LjIwMDEgMTcuNjAwM0M1LjM3MzI2IDE3LjA4MDggNS41NDg0NCAxNi41NjgzIDUuNzIyNjggMTYuMDU4N0M2LjE3MTczIDE0Ljc0NTEgNi42MTQ0OSAxMy40NDk5IDcuMDAwMSAxMi4xMDAzTDIuNjAwMSA5LjAwMDI5SDcuODE3NTFaIiBmaWxsPSIjMEU4QTI2Ii8+CjxyZWN0IHg9IjMiIHk9IjIiIHdpZHRoPSI0IiBoZWlnaHQ9IjEiIGZpbGw9IiMwRThBMjYiLz4KPHJlY3QgeD0iMSIgeT0iNSIgd2lkdGg9IjQiIGhlaWdodD0iMSIgZmlsbD0iIzBFOEEyNiIvPgo8cmVjdCB4PSIxIiB5PSIxMiIgd2lkdGg9IjMiIGhlaWdodD0iMSIgZmlsbD0iIzBFOEEyNiIvPgo8cmVjdCB4PSIxIiB5PSIxNSIgd2lkdGg9IjIiIGhlaWdodD0iMSIgZmlsbD0iIzBFOEEyNiIvPgo8L3N2Zz4K';
const emphEffectIcon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxLjAwMDAyQzkuNzExNjQgMC45OTgxNDIgOS40MjIyNSAxLjE2Mjk3IDkuMzE0NTQgMS40OTQ0OUw3LjM3MDc5IDcuNTIzNDZDNy4yOTE4MyA3Ljc2NjQ3IDcuMDkxMzIgNy45NDQ4IDYuODQ5NjkgOEgxLjcxN0MxLjAyMzc1IDggMC43MzU1MTYgOC44ODcxIDEuMjk2MzYgOS4yOTQ1OEw1LjgyNzIyIDEyLjQ4NzlDNS43ODMzMiAxMi42NjA5IDUuNzMxNzEgMTIuODQwMyA1LjY3MTI5IDEzLjAyNjJMNC4wMzcyOCAxOC4wNTUyQzMuODIzMDUgMTguNzE0NSA0LjU3NzY3IDE5LjI2MjggNS4xMzg1MiAxOC44NTUzTDEwIDE1LjQyODlMMTQuODYxNSAxOC44NTUzQzE1LjQyMjMgMTkuMjYyOCAxNi4xNzY5IDE4LjcxNDUgMTUuOTYyNyAxOC4wNTUyTDE0LjMyODcgMTMuMDI2MkMxNC4yNjgzIDEyLjg0MDMgMTQuMjE2NyAxMi42NjA5IDE0LjE3MjggMTIuNDg3OUwxOC43MDM2IDkuMjk0NThDMTkuMjY0NSA4Ljg4NzEgMTguOTc2MiA4IDE4LjI4MyA4SDEzLjE1MDNDMTIuOTA4NyA3Ljk0NDggMTIuNzA4MiA3Ljc2NjQ3IDEyLjYyOTIgNy41MjM0NkwxMC42ODU1IDEuNDk0NDlDMTAuNTc3NyAxLjE2Mjk3IDEwLjI4ODQgMC45OTgxNDIgMTAgMS4wMDAwMlpNMTAgMi42MDAzMUM5LjMwMDY2IDQuNzM5NDYgNy44MTc1MSA5LjAwMDAxIDcuODE3NTEgOS4wMDAwMUgyLjYwMDFMNy4wMDAxIDEyLjFDNi42MTQ0OSAxMy40NDk2IDYuMTcxNzMgMTQuNzQ0OCA1LjcyMjY5IDE2LjA1ODRDNS41NDg0NSAxNi41NjgxIDUuMzczMjYgMTcuMDgwNSA1LjIwMDEgMTcuNkwxMCAxNC4yMzIyTDE0Ljc5OTkgMTcuNkMxNC42MjY3IDE3LjA4MDYgMTQuNDUxNiAxNi41NjgxIDE0LjI3NzMgMTYuMDU4NUMxMy44MjgzIDE0Ljc0NDkgMTMuMzg1NSAxMy40NDk2IDEyLjk5OTkgMTIuMUwxNy4zOTk5IDkuMDAwMDFIMTIuMTgyNUMxMi4xODI1IDkuMDAwMDEgMTAuNjk5MyA0LjczOTQ2IDEwIDIuNjAwMzFaIiBmaWxsPSIjRkY4RTAwIi8+CjxwYXRoIG9wYWNpdHk9IjAuNSIgZD0iTTcuODE3NTEgOS4wMDAyOUM3LjgxNzUxIDkuMDAwMjkgOS4zMDA2NiA0LjczOTc0IDEwIDIuNjAwNTlDMTAuNjk5MyA0LjczOTc0IDEyLjE4MjUgOS4wMDAyOSAxMi4xODI1IDkuMDAwMjlIMTcuMzk5OUwxMi45OTk5IDEyLjEwMDNDMTMuMzg1NSAxMy40NDk5IDEzLjgyODMgMTQuNzQ1MSAxNC4yNzczIDE2LjA1ODdDMTQuNDUxNiAxNi41NjgzIDE0LjYyNjcgMTcuMDgwOCAxNC43OTk5IDE3LjYwMDNMMTAgMTQuMjMyNUw1LjIwMDEgMTcuNjAwM0M1LjM3MzI2IDE3LjA4MDggNS41NDg0NCAxNi41NjgzIDUuNzIyNjggMTYuMDU4N0M2LjE3MTczIDE0Ljc0NTEgNi42MTQ0OSAxMy40NDk5IDcuMDAwMSAxMi4xMDAzTDIuNjAwMSA5LjAwMDI5SDcuODE3NTFaIiBmaWxsPSIjRkY4RTAwIi8+CjxwYXRoIGQ9Ik01Ljg5NDU4IDYuMTkzMzZMMi4zOTQ1OCAxLjY5MzM2TDEuNjA1MjIgMi4zMDczTDUuMTA1MjIgNi44MDczTDUuODk0NTggNi4xOTMzNloiIGZpbGw9IiNGRjhFMDAiLz4KPHBhdGggZD0iTTEuODUzNTkgMTUuODUzOUw0LjM1MzU5IDEzLjM1MzlMMy42NDY0OCAxMi42NDY4TDEuMTQ2NDggMTUuMTQ2OEwxLjg1MzU5IDE1Ljg1MzlaIiBmaWxsPSIjRkY4RTAwIi8+CjxwYXRoIGQ9Ik0xNC4xNDY0IDYuMTkzMzZMMTcuNjQ2NCAxLjY5MzM2TDE4LjQzNTggMi4zMDczTDE0LjkzNTggNi44MDczTDE0LjE0NjQgNi4xOTMzNloiIGZpbGw9IiNGRjhFMDAiLz4KPHBhdGggZD0iTTE4LjE4NzQgMTUuODUzOUwxNS42ODc0IDEzLjM1MzlMMTYuMzk0NSAxMi42NDY4TDE4Ljg5NDUgMTUuMTQ2OEwxOC4xODc0IDE1Ljg1MzlaIiBmaWxsPSIjRkY4RTAwIi8+Cjwvc3ZnPgo=';
const exitEffectIcon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMCAxLjAwMDAyQzkuNzExNjQgMC45OTgxNDIgOS40MjIyNSAxLjE2Mjk3IDkuMzE0NTQgMS40OTQ0OUw3LjM3MDc5IDcuNTIzNDZDNy4yOTE4MyA3Ljc2NjQ3IDcuMDkxMzIgNy45NDQ4IDYuODQ5NjkgOEgxLjcxN0MxLjAyMzc1IDggMC43MzU1MTYgOC44ODcxIDEuMjk2MzYgOS4yOTQ1OEw1LjgyNzIyIDEyLjQ4NzlDNS43ODMzMiAxMi42NjA5IDUuNzMxNzEgMTIuODQwMyA1LjY3MTI5IDEzLjAyNjJMNC4wMzcyOCAxOC4wNTUyQzMuODIzMDUgMTguNzE0NSA0LjU3NzY3IDE5LjI2MjggNS4xMzg1MiAxOC44NTUzTDEwIDE1LjQyODlMMTQuODYxNSAxOC44NTUzQzE1LjQyMjMgMTkuMjYyOCAxNi4xNzY5IDE4LjcxNDUgMTUuOTYyNyAxOC4wNTUyTDE0LjMyODcgMTMuMDI2MkMxNC4yNjgzIDEyLjg0MDMgMTQuMjE2NyAxMi42NjA5IDE0LjE3MjggMTIuNDg3OUwxOC43MDM2IDkuMjk0NThDMTkuMjY0NSA4Ljg4NzEgMTguOTc2MiA4IDE4LjI4MyA4SDEzLjE1MDNDMTIuOTA4NyA3Ljk0NDggMTIuNzA4MiA3Ljc2NjQ3IDEyLjYyOTIgNy41MjM0NkwxMC42ODU1IDEuNDk0NDlDMTAuNTc3NyAxLjE2Mjk3IDEwLjI4ODQgMC45OTgxNDIgMTAgMS4wMDAwMlpNMTAgMi42MDAzMUM5LjMwMDY2IDQuNzM5NDYgNy44MTc1MSA5LjAwMDAxIDcuODE3NTEgOS4wMDAwMUgyLjYwMDFMNy4wMDAxIDEyLjFDNi42MTQ0OSAxMy40NDk2IDYuMTcxNzMgMTQuNzQ0OCA1LjcyMjY5IDE2LjA1ODRDNS41NDg0NSAxNi41NjgxIDUuMzczMjYgMTcuMDgwNSA1LjIwMDEgMTcuNkwxMCAxNC4yMzIyTDE0Ljc5OTkgMTcuNkMxNC42MjY3IDE3LjA4MDYgMTQuNDUxNiAxNi41NjgxIDE0LjI3NzMgMTYuMDU4NUMxMy44MjgzIDE0Ljc0NDkgMTMuMzg1NSAxMy40NDk2IDEyLjk5OTkgMTIuMUwxNy4zOTk5IDkuMDAwMDFIMTIuMTgyNUMxMi4xODI1IDkuMDAwMDEgMTAuNjk5MyA0LjczOTQ2IDEwIDIuNjAwMzFaIiBmaWxsPSIjRjIzRDNEIi8+CjxwYXRoIG9wYWNpdHk9IjAuNSIgZD0iTTcuODE3NTEgOS4wMDAyOUM3LjgxNzUxIDkuMDAwMjkgOS4zMDA2NiA0LjczOTc0IDEwIDIuNjAwNTlDMTAuNjk5MyA0LjczOTc0IDEyLjE4MjUgOS4wMDAyOSAxMi4xODI1IDkuMDAwMjlIMTcuMzk5OUwxMi45OTk5IDEyLjEwMDNDMTMuMzg1NSAxMy40NDk5IDEzLjgyODMgMTQuNzQ1MSAxNC4yNzczIDE2LjA1ODdDMTQuNDUxNiAxNi41NjgzIDE0LjYyNjcgMTcuMDgwOCAxNC43OTk5IDE3LjYwMDNMMTAgMTQuMjMyNUw1LjIwMDEgMTcuNjAwM0M1LjM3MzI2IDE3LjA4MDggNS41NDg0NCAxNi41NjgzIDUuNzIyNjggMTYuMDU4N0M2LjE3MTczIDE0Ljc0NTEgNi42MTQ0OSAxMy40NDk5IDcuMDAwMSAxMi4xMDAzTDIuNjAwMSA5LjAwMDI5SDcuODE3NTFaIiBmaWxsPSIjRjIzRDNEIi8+CjxwYXRoIGQ9Ik0xMyAySDE3VjNIMTNWMloiIGZpbGw9IiNGMjNEM0QiLz4KPHBhdGggZD0iTTE1IDZWNUgxOVY2SDE1WiIgZmlsbD0iI0YyM0QzRCIvPgo8cGF0aCBkPSJNMTkgMTJIMTZWMTNIMTlWMTJaIiBmaWxsPSIjRjIzRDNEIi8+CjxwYXRoIGQ9Ik0xNyAxNUgxOVYxNkgxN1YxNVoiIGZpbGw9IiNGMjNEM0QiLz4KPC9zdmc+Cg==';
const pathEffectIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuOTk2NzUgMS41MDAwMUw5Ljk5Njc1IDEuNTAwMDVMMTAuMDAzMiAxLjUwMDAxQzEwLjA1MjUgMS40OTk2OSAxMC4wOTcgMS41MTM4IDEwLjEzMDQgMS41MzY0QzEwLjE2MDUgMS41NTY3NSAxMC4xOTA1IDEuNTg5NjEgMTAuMjA5OCAxLjY0ODU4QzEwLjIwOTggMS42NDg3MiAxMC4yMDk5IDEuNjQ4ODYgMTAuMjA5OSAxLjY0ODk5TDEyLjE1MzMgNy42NzY4OUwxMi4xNTM3IDcuNjc3OTdDMTIuMjg3OSA4LjA5MDk3IDEyLjYyODYgOC4zOTM2OSAxMy4wMzg5IDguNDg3NDRMMTMuMDkzOSA4LjVIMTMuMTUwM0gxOC4yODNDMTguNDkxIDguNSAxOC41NzggOC43NjUwNCAxOC40MTE5IDguODg4NTFMMTMuODg0NyAxMi4wNzkzTDEzLjYwMzUgMTIuMjc3NEwxMy42ODgxIDEyLjYxMDlDMTMuNzM0OCAxMi43OTQ2IDEzLjc4OTQgMTIuOTg0NSAxMy44NTMyIDEzLjE4MDhMMTUuNDg3MiAxOC4yMDk3QzE1LjU1MTcgMTguNDA4NCAxNS4zMjQ0IDE4LjU3MzYgMTUuMTU1NCAxOC40NTA4TDE1LjE1NTQgMTguNDUwOEwxNS4xNDk1IDE4LjQ0NjZMMTAuMjg4IDE1LjAyMDJMMTAgMTQuODE3Mkw5LjcxMTk1IDE1LjAyMDJMNC44NTA0NyAxOC40NDY2TDQuODUwNDQgMTguNDQ2Nkw0Ljg0NDYyIDE4LjQ1MDhDNC42NzU2NCAxOC41NzM2IDQuNDQ4MjYgMTguNDA4NCA0LjUxMjgxIDE4LjIwOTdMNi4xNDY4MiAxMy4xODA4QzYuMjEwNTggMTIuOTg0NSA2LjI2NTI0IDEyLjc5NDYgNi4zMTE4NiAxMi42MTA5TDYuMzk2NDcgMTIuMjc3NEw2LjExNTI2IDEyLjA3OTNMMS41ODgxNSA4Ljg4ODUzQzEuNDIyIDguNzY1MDYgMS41MDg5OSA4LjUgMS43MTcgOC41SDYuODQ5NjlINi45MDYwOEw2Ljk2MTA1IDguNDg3NDRDNy4zNzE0MyA4LjM5MzY5IDcuNzEyMTMgOC4wOTA5NyA3Ljg0NjMyIDcuNjc3OTdMNy44NDY2NyA3LjY3Njg5TDkuNzkwMDcgMS42NDg5OUM5Ljc5MDExIDEuNjQ4ODYgOS43OTAxNSAxLjY0ODcyIDkuNzkwMiAxLjY0ODU5QzkuODA5NDUgMS41ODk2MSA5LjgzOTU0IDEuNTU2NzYgOS44Njk2MyAxLjUzNjRDOS45MDMwNSAxLjUxMzggOS45NDc1NCAxLjQ5OTY5IDkuOTk2NzUgMS41MDAwMVoiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTEyIDNDMTIgNC4xMDQ1NyAxMS4xMDQ2IDUgMTAgNUM4Ljg5NTQzIDUgOCA0LjEwNDU3IDggM0M4IDEuODk1NDMgOC44OTU0MyAxIDEwIDFDMTEuMTA0NiAxIDEyIDEuODk1NDMgMTIgM1oiIGZpbGw9IiMzQUJENTkiLz4KPHBhdGggZD0iTTkgN0M5IDguMTA0NTcgOC4xMDQ1NyA5IDcgOUM1Ljg5NTQzIDkgNSA4LjEwNDU3IDUgN0M1IDUuODk1NDMgNS44OTU0MyA1IDcgNUM4LjEwNDU3IDUgOSA1Ljg5NTQzIDkgN1oiIGZpbGw9IiNGNTJDMkMiLz4KPC9zdmc+Cg==';
const pathEffectIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTkuOTk2NzUgMS41MDAwMUw5Ljk5Njc1IDEuNTAwMDVMMTAuMDAzMiAxLjUwMDAxQzEwLjA1MjUgMS40OTk2OSAxMC4wOTcgMS41MTM4IDEwLjEzMDQgMS41MzY0QzEwLjE2MDUgMS41NTY3NSAxMC4xOTA1IDEuNTg5NjEgMTAuMjA5OCAxLjY0ODU4QzEwLjIwOTggMS42NDg3MiAxMC4yMDk5IDEuNjQ4ODYgMTAuMjA5OSAxLjY0ODk5TDEyLjE1MzMgNy42NzY4OUwxMi4xNTM3IDcuNjc3OTdDMTIuMjg3OSA4LjA5MDk3IDEyLjYyODYgOC4zOTM2OSAxMy4wMzg5IDguNDg3NDRMMTMuMDkzOSA4LjVIMTMuMTUwM0gxOC4yODNDMTguNDkxIDguNSAxOC41NzggOC43NjUwNCAxOC40MTE5IDguODg4NTFMMTMuODg0NyAxMi4wNzkzTDEzLjYwMzUgMTIuMjc3NEwxMy42ODgxIDEyLjYxMDlDMTMuNzM0OCAxMi43OTQ2IDEzLjc4OTQgMTIuOTg0NSAxMy44NTMyIDEzLjE4MDhMMTUuNDg3MiAxOC4yMDk3QzE1LjU1MTcgMTguNDA4NCAxNS4zMjQ0IDE4LjU3MzYgMTUuMTU1NCAxOC40NTA4TDE1LjE1NTQgMTguNDUwOEwxNS4xNDk1IDE4LjQ0NjZMMTAuMjg4IDE1LjAyMDJMMTAgMTQuODE3Mkw5LjcxMTk1IDE1LjAyMDJMNC44NTA0NyAxOC40NDY2TDQuODUwNDQgMTguNDQ2Nkw0Ljg0NDYyIDE4LjQ1MDhDNC42NzU2NCAxOC41NzM2IDQuNDQ4MjYgMTguNDA4NCA0LjUxMjgxIDE4LjIwOTdMNi4xNDY4MiAxMy4xODA4QzYuMjEwNTggMTIuOTg0NSA2LjI2NTI0IDEyLjc5NDYgNi4zMTE4NiAxMi42MTA5TDYuMzk2NDcgMTIuMjc3NEw2LjExNTI2IDEyLjA3OTNMMS41ODgxNSA4Ljg4ODUzQzEuNDIyIDguNzY1MDYgMS41MDg5OSA4LjUgMS43MTcgOC41SDYuODQ5NjlINi45MDYwOEw2Ljk2MTA1IDguNDg3NDRDNy4zNzE0MyA4LjM5MzY5IDcuNzEyMTMgOC4wOTA5NyA3Ljg0NjMyIDcuNjc3OTdMNy44NDY2NyA3LjY3Njg5TDkuNzkwMDcgMS42NDg5OUM5Ljc5MDExIDEuNjQ4ODYgOS43OTAxNSAxLjY0ODcyIDkuNzkwMiAxLjY0ODU5QzkuODA5NDUgMS41ODk2MSA5LjgzOTU0IDEuNTU2NzYgOS44Njk2MyAxLjUzNjRDOS45MDMwNSAxLjUxMzggOS45NDc1NCAxLjQ5OTY5IDkuOTk2NzUgMS41MDAwMVoiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjgiLz4KPHBhdGggZD0iTTEyIDNDMTIgNC4xMDQ1NyAxMS4xMDQ2IDUgMTAgNUM4Ljg5NTQzIDUgOCA0LjEwNDU3IDggM0M4IDEuODk1NDMgOC44OTU0MyAxIDEwIDFDMTEuMTA0NiAxIDEyIDEuODk1NDMgMTIgM1oiIGZpbGw9IiMwRThBMjYiLz4KPHBhdGggZD0iTTkgN0M5IDguMTA0NTcgOC4xMDQ1NyA5IDcgOUM1Ljg5NTQzIDkgNSA4LjEwNDU3IDUgN0M1IDUuODk1NDMgNS44OTU0MyA1IDcgNUM4LjEwNDU3IDUgOSA1Ljg5NTQzIDkgN1oiIGZpbGw9IiNGMjNEM0QiLz4KPC9zdmc+Cg==';
const arrowUpIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iNyIgdmlld0JveD0iMCAwIDEyIDciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNS45OTk5NiAwLjI5Mjg1NUw1LjY0NjQxIDAuNjQ2NDA4TDAuMTQ2NDA4IDYuMTQ2NDFMMC44NTM1MTYgNi44NTM1MUw1Ljk5OTk2IDEuNzA3MDdMMTEuMTQ2NCA2Ljg1MzUyTDExLjg1MzUgNi4xNDY0MUw2LjM1MzUyIDAuNjQ2NDA5TDUuOTk5OTYgMC4yOTI4NTVaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K';
const arrowUpIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iNyIgdmlld0JveD0iMCAwIDEyIDciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNS45OTk5NiAwLjI5Mjg1NUw1LjY0NjQxIDAuNjQ2NDA4TDAuMTQ2NDA4IDYuMTQ2NDFMMC44NTM1MTYgNi44NTM1MUw1Ljk5OTk2IDEuNzA3MDdMMTEuMTQ2NCA2Ljg1MzUyTDExLjg1MzUgNi4xNDY0MUw2LjM1MzUyIDAuNjQ2NDA5TDUuOTk5OTYgMC4yOTI4NTVaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K';
const arrowDownIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iNyIgdmlld0JveD0iMCAwIDEyIDciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNi4wMDAwNCA2LjcwNzE0TDYuMzUzNTkgNi4zNTM1OUwxMS44NTM2IDAuODUzNTkxTDExLjE0NjUgMC4xNDY0ODRMNi4wMDAwNCA1LjI5MjkzTDAuODUzNTkxIDAuMTQ2NDg0TDAuMTQ2NDg0IDAuODUzNTkxTDUuNjQ2NDggNi4zNTM1OUw2LjAwMDA0IDYuNzA3MTRaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K';
const arrowDownIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iNyIgdmlld0JveD0iMCAwIDEyIDciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNi4wMDAwNCA2LjcwNzE0TDYuMzUzNTkgNi4zNTM1OUwxMS44NTM2IDAuODUzNTkxTDExLjE0NjUgMC4xNDY0ODRMNi4wMDAwNCA1LjI5MjkzTDAuODUzNTkxIDAuMTQ2NDg0TDAuMTQ2NDg0IDAuODUzNTkxTDUuNjQ2NDggNi4zNTM1OUw2LjAwMDA0IDYuNzA3MTRaIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K';
const closeIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEgMUwxMSAxMU0xMSAxTDEgMTEiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjwvc3ZnPgo=';
const closeIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEgMUwxMSAxMU0xMSAxTDEgMTEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjwvc3ZnPgo=';
const menuButtonIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMiIgdmlld0JveD0iMCAwIDEwIDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik04IDFDOCAwLjQ0NzcxNSA4LjQ0NzcyIDguMjg1MmUtMDggOSAxLjMxMTM0ZS0wN0M5LjU1MjI4IDEuNzk0MTdlLTA3IDEwIDAuNDQ3NzE2IDEwIDFDMTAgMS41NTIyOCA5LjU1MjI4IDIgOSAyQzguNDQ3NzIgMiA4IDEuNTUyMjggOCAxWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTQgMUM0IDAuNDQ3NzE1IDQuNDQ3NzIgLTIuNjY4MzllLTA3IDUgLTIuMTg1NTdlLTA3QzUuNTUyMjkgLTEuNzAyNzVlLTA3IDYgMC40NDc3MTUgNiAxQzYgMS41NTIyOCA1LjU1MjI5IDIgNSAyQzQuNDQ3NzIgMiA0IDEuNTUyMjggNCAxWiIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTEgMy44NTQyNmUtMDdDMC40NDc3MTYgMy4zNzE0NGUtMDcgLTEuOTU3MDNlLTA4IDAuNDQ3NzE2IC00LjM3MTE0ZS0wOCAxQy02Ljc4NTI2ZS0wOCAxLjU1MjI4IDAuNDQ3NzE2IDIgMSAyQzEuNTUyMjkgMiAyIDEuNTUyMjkgMiAxQzIgMC40NDc3MTYgMS41NTIyOSA0LjMzNzA5ZS0wNyAxIDMuODU0MjZlLTA3WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+Cg==';
const menuButtonIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMiIgdmlld0JveD0iMCAwIDEwIDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik04IDFDOCAwLjQ0NzcxNSA4LjQ0NzcyIDguMjg1MmUtMDggOSAxLjMxMTM0ZS0wN0M5LjU1MjI4IDEuNzk0MTdlLTA3IDEwIDAuNDQ3NzE2IDEwIDFDMTAgMS41NTIyOCA5LjU1MjI4IDIgOSAyQzguNDQ3NzIgMiA4IDEuNTUyMjggOCAxWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTQgMUM0IDAuNDQ3NzE1IDQuNDQ3NzIgLTIuNjY4MzllLTA3IDUgLTIuMTg1NTdlLTA3QzUuNTUyMjkgLTEuNzAyNzVlLTA3IDYgMC40NDc3MTUgNiAxQzYgMS41NTIyOCA1LjU1MjI5IDIgNSAyQzQuNDQ3NzIgMiA0IDEuNTUyMjggNCAxWiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTEgMy44NTQyNmUtMDdDMC40NDc3MTYgMy4zNzE0NGUtMDcgLTEuOTU3MDNlLTA4IDAuNDQ3NzE2IC00LjM3MTE0ZS0wOCAxQy02Ljc4NTI2ZS0wOCAxLjU1MjI4IDAuNDQ3NzE2IDIgMSAyQzEuNTUyMjkgMiAyIDEuNTUyMjkgMiAxQzIgMC40NDc3MTYgMS41NTIyOSA0LjMzNzA5ZS0wNyAxIDMuODU0MjZlLTA3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==';
const arrowLeftIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNSA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNSA5LjUzNjc0ZS0wN0w1IDlMMC41IDQuNUw1IDkuNTM2NzRlLTA3WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+Cg==';
const arrowLeftIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNSA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNSA5LjUzNjc0ZS0wN0w1IDlMMC41IDQuNUw1IDkuNTM2NzRlLTA3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==';
const arrowRightIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNSA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMCA5TDAgMEw0LjUgNC41TDAgOVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';
const arrowRightIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNSIgaGVpZ2h0PSI5IiB2aWV3Qm94PSIwIDAgNSA5IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMCA5TDAgMEw0LjUgNC41TDAgOVoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=';
const zoomInIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMSA2TDExIDVMNiA1TDYgLTIuMTg1NTdlLTA3TDUgLTIuNjIyNjhlLTA3TDUgNUwtMi4xODU1N2UtMDcgNUwtMi42MjI2OGUtMDcgNkw1IDZMNSAxMUw2IDExTDYgNkwxMSA2WiIgZmlsbD0iYmxhY2siLz4KPC9zdmc+Cg==';
const zoomInIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHZpZXdCb3g9IjAgMCAxMSAxMSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMSA2TDExIDVMNiA1TDYgLTIuMTg1NTdlLTA3TDUgLTIuNjIyNjhlLTA3TDUgNUwtMi4xODU1N2UtMDcgNUwtMi42MjI2OGUtMDcgNkw1IDZMNSAxMUw2IDExTDYgNkwxMSA2WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==';
const zoomOutIcon_dark = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMSIgdmlld0JveD0iMCAwIDEwIDEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHg9IjEwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMCIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMTAgMCkiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';
const zoomOutIcon_light = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMSIgdmlld0JveD0iMCAwIDEwIDEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHg9IjEwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMCIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMTAgMCkiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=';
const getIconsForLoad = function () {
return [
clickEffectIcon, afterEffectIcon,
entrEffectIcon, emphEffectIcon, exitEffectIcon,
pathEffectIcon_dark, pathEffectIcon_light,
playIcon_dark, playIcon_light,
stopIcon_dark, stopIcon_light,
arrowUpIcon_dark, arrowUpIcon_light,
arrowDownIcon_dark, arrowDownIcon_light,
closeIcon_dark, closeIcon_light,
menuButtonIcon_dark, menuButtonIcon_light,
arrowLeftIcon_dark, arrowLeftIcon_light,
arrowRightIcon_dark, arrowRightIcon_light,
zoomInIcon_dark, zoomInIcon_light,
zoomOutIcon_dark, zoomOutIcon_light,
];
}
// EXPORTS
window['AscCommon'] = window['AscCommon'] || {};
window['AscCommon'].CAnimPaneHeader = CAnimPaneHeader;
window['AscCommon'].CSeqListContainer = CSeqListContainer;
window['AscCommon'].CTimelineContainer = CTimelineContainer;
window['AscCommon'].getIconsForLoad = getIconsForLoad;
})(window);