Files
Yajbir Singh f1b860b25c
Some checks failed
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
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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);