@babylonjs/gui 7.21.0 → 7.21.2
Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/control.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport type { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport type { Container } from \"./container\";\r\nimport type { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport type { Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { GetClass, RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport type { ICanvasGradient, ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { IAccessibilityTag } from \"core/IAccessibilityTag\";\r\nimport type { IKeyboardEvent, IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport type { Animation } from \"core/Animations/animation\";\r\nimport type { BaseGradient } from \"./gradient/BaseGradient\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IFocusableControl } from \"./focusableControl\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#controls\r\n */\r\nexport class Control implements IAnimatable, IFocusableControl {\r\n /**\r\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\r\n */\r\n public static AllowAlphaInheritance = false;\r\n\r\n private _alpha = 1;\r\n private _alphaSet = false;\r\n private _zIndex = 0;\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @internal */\r\n public _currentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _font: string;\r\n /** @internal */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n protected _fontOffset: { ascent: number; height: number; descent: number };\r\n private _color = \"\";\r\n private _style: Nullable<Style> = null;\r\n private _styleObserver: Nullable<Observer<Style>>;\r\n /** @internal */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _isDirty = true;\r\n /** @internal */\r\n protected _wasDirty = false;\r\n /** @internal */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @internal */\r\n public _cachedParentMeasure = Measure.Empty();\r\n private _descendantsOnlyPadding = false;\r\n private _paddingLeft = new ValueAndUnit(0);\r\n private _paddingRight = new ValueAndUnit(0);\r\n private _paddingTop = new ValueAndUnit(0);\r\n private _paddingBottom = new ValueAndUnit(0);\r\n /** @internal */\r\n public _left = new ValueAndUnit(0);\r\n /** @internal */\r\n public _top = new ValueAndUnit(0);\r\n private _scaleX = 1.0;\r\n private _scaleY = 1.0;\r\n private _rotation = 0;\r\n private _transformCenterX = 0.5;\r\n private _transformCenterY = 0.5;\r\n /** @internal */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _transformedPosition = Vector2.Zero();\r\n private _isMatrixDirty = true;\r\n private _cachedOffsetX: number;\r\n private _cachedOffsetY: number;\r\n private _isVisible = true;\r\n private _isHighlighted = false;\r\n private _highlightColor = \"#4affff\";\r\n protected _highlightLineWidth = 2;\r\n /** @internal */\r\n public _linkedMesh: Nullable<TransformNode>;\r\n private _fontSet = false;\r\n private _dummyVector2 = Vector2.Zero();\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _doNotRender = false;\r\n private _downPointerIds: { [id: number]: boolean } = {};\r\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\r\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\r\n protected _isEnabled = true;\r\n protected _disabledColor = \"#9a9a9a\";\r\n protected _disabledColorItem = \"#6a6a6a\";\r\n protected _isReadOnly = false;\r\n private _gradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _rebuildLayout = false;\r\n\r\n /** @internal */\r\n protected _urlRewriter?: (url: string) => string;\r\n\r\n /**\r\n * Observable that fires when the control's enabled state changes\r\n */\r\n public onEnabledStateChangedObservable = new Observable<boolean>();\r\n\r\n /** @internal */\r\n public _customData: any = {};\r\n\r\n /** @internal */\r\n public _isClipped = false;\r\n\r\n /** @internal */\r\n public _automaticSize = false;\r\n\r\n /** @internal */\r\n public _tag: any;\r\n\r\n /**\r\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the control is readonly (default: false).\r\n * A readonly control will still raise pointer events but will not react to them\r\n */\r\n public get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n }\r\n\r\n /**\r\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\r\n */\r\n public get transformedMeasure(): Measure {\r\n return this._evaluatedMeasure;\r\n }\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\r\n @serialize()\r\n public isHitTestVisible = true;\r\n /** Gets or sets a boolean indicating if the control can block pointer events. False by default except on the following controls:\r\n * * Button controls (Button, RadioButton, ToggleButton)\r\n * * Checkbox\r\n * * ColorPicker\r\n * * InputText\r\n * * Slider\r\n */\r\n @serialize()\r\n public isPointerBlocker = false;\r\n /** Gets or sets a boolean indicating if the control can be focusable */\r\n @serialize()\r\n public isFocusInvisible = false;\r\n\r\n protected _clipChildren = true;\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n }\r\n\r\n @serialize()\r\n public get clipChildren() {\r\n return this._clipChildren;\r\n }\r\n\r\n protected _clipContent = true;\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n }\r\n\r\n @serialize()\r\n public get clipContent() {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\r\n */\r\n @serialize()\r\n public useBitmapCache = false;\r\n\r\n private _cacheData: Nullable<ImageData>;\r\n\r\n private _shadowOffsetX = 0;\r\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetX() {\r\n return this._shadowOffsetX;\r\n }\r\n\r\n public set shadowOffsetX(value: number) {\r\n if (this._shadowOffsetX === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetX = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowOffsetY = 0;\r\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetY() {\r\n return this._shadowOffsetY;\r\n }\r\n\r\n public set shadowOffsetY(value: number) {\r\n if (this._shadowOffsetY === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetY = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowBlur = 0;\r\n private _previousShadowBlur = 0;\r\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\r\n @serialize()\r\n public get shadowBlur() {\r\n return this._shadowBlur;\r\n }\r\n\r\n public set shadowBlur(value: number) {\r\n if (this._shadowBlur === value) {\r\n return;\r\n }\r\n\r\n this._previousShadowBlur = this._shadowBlur;\r\n\r\n this._shadowBlur = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowColor = \"black\";\r\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\r\n @serialize()\r\n public get shadowColor() {\r\n return this._shadowColor;\r\n }\r\n\r\n public set shadowColor(value: string) {\r\n if (this._shadowColor === value) {\r\n return;\r\n }\r\n\r\n this._shadowColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the cursor to use when the control is hovered */\r\n @serialize()\r\n public hoverCursor = \"\";\r\n\r\n /** @internal */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @internal */\r\n protected _linkOffsetY = new ValueAndUnit(0);\r\n\r\n // Properties\r\n\r\n /** Gets the control type name */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the control for accessibility purpose.\r\n * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.\r\n */\r\n public set accessibilityTag(value: Nullable<IAccessibilityTag>) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable<IAccessibilityTag> = null;\r\n\r\n /**\r\n * Observable that fires whenever the accessibility event of the control has changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable<Nullable<IAccessibilityTag>>();\r\n\r\n /**\r\n * An event triggered when pointer wheel is scrolled\r\n */\r\n public onWheelObservable = new Observable<Vector2>();\r\n /**\r\n * An event triggered when the pointer moves over the control.\r\n */\r\n public onPointerMoveObservable = new Observable<Vector2>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control.\r\n */\r\n public onPointerOutObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer up\r\n */\r\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on\r\n */\r\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control receives an ENTER key down event\r\n */\r\n public onEnterPressedObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control is marked as dirty\r\n */\r\n public onDirtyObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered before drawing the control\r\n */\r\n public onBeforeDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered after the control was drawn\r\n */\r\n public onAfterDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control has been disposed\r\n */\r\n public onDisposeObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control isVisible is changed\r\n */\r\n public onIsVisibleChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Get the hosting AdvancedDynamicTexture\r\n */\r\n public get host(): AdvancedDynamicTexture {\r\n return this._host;\r\n }\r\n\r\n /** Gets or set information about font offsets (used to render and align text) */\r\n @serialize()\r\n public get fontOffset(): { ascent: number; height: number; descent: number } {\r\n return this._fontOffset;\r\n }\r\n\r\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\r\n this._fontOffset = offset;\r\n }\r\n\r\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\r\n @serialize()\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n this._alphaSet = true;\r\n this._alpha = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\r\n */\r\n public get highlightLineWidth(): number {\r\n return this._highlightLineWidth;\r\n }\r\n\r\n public set highlightLineWidth(value: number) {\r\n if (this._highlightLineWidth === value) {\r\n return;\r\n }\r\n\r\n this._highlightLineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\r\n */\r\n public get isHighlighted(): boolean {\r\n return this._isHighlighted;\r\n }\r\n\r\n public set isHighlighted(value: boolean) {\r\n if (this._isHighlighted === value) {\r\n return;\r\n }\r\n\r\n this._isHighlighted = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Indicates if the control should be serialized. Defaults to true.\r\n */\r\n @serialize()\r\n public isSerializable: boolean = true;\r\n\r\n /**\r\n * Gets or sets a string defining the color to use for highlighting this control\r\n */\r\n public get highlightColor(): string {\r\n return this._highlightColor;\r\n }\r\n\r\n public set highlightColor(value: string) {\r\n if (this._highlightColor === value) {\r\n return;\r\n }\r\n\r\n this._highlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleX(): number {\r\n return this._scaleX;\r\n }\r\n\r\n public set scaleX(value: number) {\r\n if (this._scaleX === value) {\r\n return;\r\n }\r\n\r\n this._scaleX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleY(): number {\r\n return this._scaleY;\r\n }\r\n\r\n public set scaleY(value: number) {\r\n if (this._scaleY === value) {\r\n return;\r\n }\r\n\r\n this._scaleY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the rotation angle (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get rotation(): number {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(value: number) {\r\n if (this._rotation === value) {\r\n return;\r\n }\r\n\r\n this._rotation = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on Y axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterY(): number {\r\n return this._transformCenterY;\r\n }\r\n\r\n public set transformCenterY(value: number) {\r\n if (this._transformCenterY === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on X axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterX(): number {\r\n return this._transformCenterX;\r\n }\r\n\r\n public set transformCenterX(value: number) {\r\n if (this._transformCenterX === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get horizontalAlignment(): number {\r\n return this._horizontalAlignment;\r\n }\r\n\r\n public set horizontalAlignment(value: number) {\r\n if (this._horizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._horizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the vertical alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get verticalAlignment(): number {\r\n return this._verticalAlignment;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n if (this._verticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._verticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _fixedRatio = 0;\r\n public set fixedRatio(value: number) {\r\n if (this._fixedRatio === value) {\r\n return;\r\n }\r\n\r\n this._fixedRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a fixed ratio for this control.\r\n * When different from 0, the ratio is used to compute the \"second\" dimension.\r\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\r\n * second dimension is computed as first dimension * fixedRatio\r\n */\r\n @serialize()\r\n public get fixedRatio(): number {\r\n return this._fixedRatio;\r\n }\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n set fixedRatioMasterIsWidth(value: boolean) {\r\n if (this._fixedRatioMasterIsWidth === value) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.\r\n * When the height of a control is set, this property is changed to false.\r\n */\r\n @serialize()\r\n get fixedRatioMasterIsWidth(): boolean {\r\n return this._fixedRatioMasterIsWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public set width(value: string | number) {\r\n this._fixedRatioMasterIsWidth = true;\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the control width in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get widthInPixels(): number {\r\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set widthInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = true;\r\n this.width = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n public set height(value: string | number) {\r\n this._fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get heightInPixels(): number {\r\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set heightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = false;\r\n this.height = value + \"px\";\r\n }\r\n\r\n /** Gets or set font family */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font style */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /**\r\n * Gets or sets style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n @serialize()\r\n public get style(): Nullable<Style> {\r\n return this._style;\r\n }\r\n\r\n public set style(value: Nullable<Style>) {\r\n if (this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n this._style = value;\r\n\r\n if (this._style) {\r\n this._styleObserver = this._style.onChangedObservable.add(() => {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n\r\n /** @internal */\r\n public get _isFontSizeInPercentage(): boolean {\r\n return this._fontSize.isPercentage;\r\n }\r\n\r\n /** Gets or sets font size in pixels */\r\n public get fontSizeInPixels(): number {\r\n const fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\r\n\r\n if (fontSizeToUse.isPixel) {\r\n return fontSizeToUse.getValue(this._host);\r\n }\r\n\r\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\r\n }\r\n\r\n public set fontSizeInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.fontSize = value + \"px\";\r\n }\r\n\r\n /** Gets or sets font size */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n }\r\n\r\n /** Gets or sets foreground color */\r\n @serialize()\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n public set color(value: string) {\r\n if (this._color === value) {\r\n return;\r\n }\r\n\r\n this._color = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets gradient. Setting a gradient will override the color */\r\n @serialize()\r\n public get gradient(): Nullable<BaseGradient> {\r\n return this._gradient;\r\n }\r\n\r\n public set gradient(value: Nullable<BaseGradient>) {\r\n if (this._gradient === value) {\r\n return;\r\n }\r\n\r\n this._gradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets z index which is used to reorder controls on the z axis */\r\n @serialize()\r\n public get zIndex(): number {\r\n return this._zIndex;\r\n }\r\n\r\n public set zIndex(value: number) {\r\n if (this.zIndex === value) {\r\n return;\r\n }\r\n\r\n this._zIndex = value;\r\n\r\n if (this.parent) {\r\n this.parent._reOrderControl(this);\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can be rendered */\r\n @serialize()\r\n public get notRenderable(): boolean {\r\n return this._doNotRender;\r\n }\r\n\r\n public set notRenderable(value: boolean) {\r\n if (this._doNotRender === value) {\r\n return;\r\n }\r\n\r\n this._doNotRender = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n @serialize()\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n this._markAsDirty(true);\r\n\r\n this.onIsVisibleChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /** Gets a boolean indicating that the control needs to update its rendering */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Gets the current linked mesh (or null if none)\r\n */\r\n public get linkedMesh(): Nullable<TransformNode> {\r\n return this._linkedMesh;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding should work like in CSS.\r\n * Basically, it will add the padding amount on each side of the parent control for its children.\r\n */\r\n @serialize()\r\n public get descendantsOnlyPadding(): boolean {\r\n return this._descendantsOnlyPadding;\r\n }\r\n\r\n public set descendantsOnlyPadding(value: boolean) {\r\n if (this._descendantsOnlyPadding === value) {\r\n return;\r\n }\r\n\r\n this._descendantsOnlyPadding = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingLeft(): string | number {\r\n return this._paddingLeft.toString(this._host);\r\n }\r\n\r\n public set paddingLeft(value: string | number) {\r\n if (this._paddingLeft.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingLeftInPixels(): number {\r\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingLeftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingLeft = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingLeftInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingLeftInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingRight(): string | number {\r\n return this._paddingRight.toString(this._host);\r\n }\r\n\r\n public set paddingRight(value: string | number) {\r\n if (this._paddingRight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingRightInPixels(): number {\r\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingRightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingRight = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingRightInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingRightInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingTop(): string | number {\r\n return this._paddingTop.toString(this._host);\r\n }\r\n\r\n public set paddingTop(value: string | number) {\r\n if (this._paddingTop.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingTopInPixels(): number {\r\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingTopInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingTop = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingTopInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingTopInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingBottom(): string | number {\r\n return this._paddingBottom.toString(this._host);\r\n }\r\n\r\n public set paddingBottom(value: string | number) {\r\n if (this._paddingBottom.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingBottomInPixels(): number {\r\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingBottomInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingBottom = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingBottomInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingBottomInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get left(): string | number {\r\n return this._left.toString(this._host);\r\n }\r\n\r\n public set left(value: string | number) {\r\n if (this._left.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get leftInPixels(): number {\r\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set leftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.left = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get top(): string | number {\r\n return this._top.toString(this._host);\r\n }\r\n\r\n public set top(value: string | number) {\r\n if (this._top.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get topInPixels(): number {\r\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set topInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.top = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetX(): string | number {\r\n return this._linkOffsetX.toString(this._host);\r\n }\r\n\r\n public set linkOffsetX(value: string | number) {\r\n if (this._linkOffsetX.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetXInPixels(): number {\r\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set linkOffsetXInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetX = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetY(): string | number {\r\n return this._linkOffsetY.toString(this._host);\r\n }\r\n\r\n public set linkOffsetY(value: string | number) {\r\n if (this._linkOffsetY.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetYInPixels(): number {\r\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set linkOffsetYInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetY = value + \"px\";\r\n }\r\n\r\n /** Gets the center coordinate on X axis */\r\n public get centerX(): number {\r\n return this._currentMeasure.left + this._currentMeasure.width / 2;\r\n }\r\n\r\n /** Gets the center coordinate on Y axis */\r\n public get centerY(): number {\r\n return this._currentMeasure.top + this._currentMeasure.height / 2;\r\n }\r\n\r\n /** Gets or sets if control is Enabled */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._markAsDirty();\r\n // if this control or any of it's descendants are under a pointer, we need to fire a pointerOut event\r\n const recursivelyFirePointerOut = (control: Control) => {\r\n if (!control.host) {\r\n return;\r\n }\r\n for (const pointer in control.host._lastControlOver) {\r\n if (control === this.host._lastControlOver[pointer]) {\r\n control._onPointerOut(control, null, true);\r\n delete control.host._lastControlOver[pointer];\r\n }\r\n }\r\n if ((control as Container).children !== undefined) {\r\n (control as Container).children.forEach(recursivelyFirePointerOut);\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\r\n this.onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n /** Gets or sets background color of control if it's disabled. Only applies to Button class. */\r\n @serialize()\r\n public get disabledColor(): string {\r\n return this._disabledColor;\r\n }\r\n\r\n public set disabledColor(value: string) {\r\n if (this._disabledColor === value) {\r\n return;\r\n }\r\n\r\n this._disabledColor = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */\r\n @serialize()\r\n public get disabledColorItem(): string {\r\n return this._disabledColorItem;\r\n }\r\n\r\n public set disabledColorItem(value: string) {\r\n if (this._disabledColorItem === value) {\r\n return;\r\n }\r\n\r\n this._disabledColorItem = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets/sets the overlap group of the control.\r\n * Controls with overlapGroup set to a number can be deoverlapped.\r\n * Controls with overlapGroup set to undefined are not deoverlapped.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#deoverlapping\r\n */\r\n @serialize()\r\n public overlapGroup?: number;\r\n /**\r\n * Gets/sets the deoverlap movement multiplier\r\n */\r\n @serialize()\r\n public overlapDeltaMultiplier?: number;\r\n\r\n /**\r\n * Array of animations\r\n */\r\n animations: Nullable<Animation[]> = null;\r\n\r\n // Focus functionality\r\n\r\n protected _focusedColor: Nullable<string> = null;\r\n /**\r\n * Border color when control is focused\r\n * When not defined the ADT color will be used. If no ADT color is defined, focused state won't have any border\r\n */\r\n public get focusedColor(): Nullable<string> {\r\n return this._focusedColor;\r\n }\r\n public set focusedColor(value: Nullable<string>) {\r\n this._focusedColor = value;\r\n }\r\n /**\r\n * The tab index of this control. -1 indicates this control is not part of the tab navigation.\r\n * A positive value indicates the order of the control in the tab navigation.\r\n * A value of 0 indicated the control will be focused after all controls with a positive index.\r\n * More than one control can have the same tab index and the navigation would then go through all controls with the same value in an order defined by the layout or the hierarchy.\r\n * The value can be changed at any time.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n */\r\n public tabIndex: number = -1;\r\n protected _isFocused = false;\r\n protected _unfocusedColor: Nullable<string> = null;\r\n\r\n /** Observable raised when the control gets the focus */\r\n public onFocusObservable = new Observable<Control>();\r\n /** Observable raised when the control loses the focus */\r\n public onBlurObservable = new Observable<Control>();\r\n /** Observable raised when a key event was processed */\r\n public onKeyboardEventProcessedObservable = new Observable<IKeyboardEvent>();\r\n\r\n /** @internal */\r\n public onBlur(): void {\r\n if (this._isFocused) {\r\n this._isFocused = false;\r\n if (this.focusedColor && this._unfocusedColor != null) {\r\n // Set color back to saved unfocused color\r\n this.color = this._unfocusedColor;\r\n }\r\n this.onBlurObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onFocus(): void {\r\n this._isFocused = true;\r\n\r\n if (this.focusedColor) {\r\n // Save the unfocused color\r\n this._unfocusedColor = this.color;\r\n this.color = this.focusedColor;\r\n }\r\n this.onFocusObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public keepsFocusWith(): Nullable<Control[]> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Function to focus a button programmatically\r\n */\r\n public focus() {\r\n this._host.moveFocusToControl(this);\r\n }\r\n\r\n /**\r\n * Function to unfocus a button programmatically\r\n */\r\n public blur() {\r\n this._host.focusedControl = null;\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public processKeyboard(evt: IKeyboardEvent): void {\r\n // if enter, trigger the new observable\r\n if (evt.key === \"Enter\") {\r\n this.onEnterPressedObservable.notifyObservers(this);\r\n }\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt, -1, this);\r\n }\r\n\r\n // Functions\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the name of the control\r\n */\r\n constructor(\r\n /** defines the name of the control */\r\n public name?: string\r\n ) {}\r\n\r\n /** @internal */\r\n protected _getTypeName(): string {\r\n return \"Control\";\r\n }\r\n\r\n /**\r\n * Gets the first ascendant in the hierarchy of the given type\r\n * @param className defines the required type\r\n * @returns the ascendant or null if not found\r\n */\r\n public getAscendantOfClass(className: string): Nullable<Control> {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n if (this.parent.getClassName() === className) {\r\n return this.parent;\r\n }\r\n\r\n return this.parent.getAscendantOfClass(className);\r\n }\r\n\r\n /**\r\n * Mark control element as dirty\r\n * @param force force non visible elements to be marked too\r\n */\r\n public markAsDirty(force = false): void {\r\n this._markAsDirty(force);\r\n }\r\n\r\n /**\r\n * Mark the element and its children as dirty\r\n */\r\n public markAllAsDirty(): void {\r\n this._markAllAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public _resetFontCache(): void {\r\n this._fontSet = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Determines if a container is an ascendant of the current control\r\n * @param container defines the container to look for\r\n * @returns true if the container is one of the ascendant of the control\r\n */\r\n public isAscendant(container: Control): boolean {\r\n if (!this.parent) {\r\n return false;\r\n }\r\n\r\n if (this.parent === container) {\r\n return true;\r\n }\r\n\r\n return this.parent.isAscendant(container);\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in local space\r\n */\r\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n this.getLocalCoordinatesToRef(globalCoordinates, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @param result defines the target vector2 where to store the result\r\n * @returns the current control\r\n */\r\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\r\n result.x = globalCoordinates.x - this._currentMeasure.left;\r\n result.y = globalCoordinates.y - this._currentMeasure.top;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets coordinates in parent local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in parent local space\r\n */\r\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\r\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Move the current control to a vector3 position projected onto the screen.\r\n * @param position defines the target position\r\n * @param scene defines the hosting scene\r\n */\r\n public moveToVector3(position: Vector3, scene: Scene): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Will store all controls that have this control as ascendant in a given array\r\n * @param results defines the array where to store the descendants\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n */\r\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * Will return all controls that have this control as ascendant\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results: Control[] = [];\r\n\r\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Link current control with a target mesh\r\n * @param mesh defines the mesh to link with\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\r\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\r\n if (mesh) {\r\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\r\n }\r\n return;\r\n }\r\n\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index !== -1) {\r\n this._linkedMesh = mesh;\r\n if (!mesh) {\r\n this._host._linkedControls.splice(index, 1);\r\n }\r\n return;\r\n } else if (!mesh) {\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._linkedMesh = mesh;\r\n this._host._linkedControls.push(this);\r\n }\r\n\r\n /**\r\n * Shorthand function to set the top, right, bottom, and left padding values on the control.\r\n * @param { string | number} paddingTop - The value of the top padding.\r\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\r\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\r\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTop = top;\r\n this.paddingRight = right;\r\n this.paddingBottom = bottom;\r\n this.paddingLeft = left;\r\n }\r\n\r\n /**\r\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\r\n * @param { number} paddingTop - The value in pixels of the top padding.\r\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\r\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\r\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTopInPixels = top;\r\n this.paddingRightInPixels = right;\r\n this.paddingBottomInPixels = bottom;\r\n this.paddingLeftInPixels = left;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\r\n const oldLeft = this._left.getValue(this._host);\r\n const oldTop = this._top.getValue(this._host);\r\n\r\n const parentMeasure = this.parent?._currentMeasure;\r\n if (parentMeasure) {\r\n this._processMeasures(parentMeasure, this._host.getContext());\r\n }\r\n\r\n let newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\r\n let newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\r\n\r\n const leftAndTopIgnoreAdaptiveScaling = this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling;\r\n if (leftAndTopIgnoreAdaptiveScaling) {\r\n if (Math.abs(newLeft - oldLeft) < 0.5) {\r\n newLeft = oldLeft;\r\n }\r\n\r\n if (Math.abs(newTop - oldTop) < 0.5) {\r\n newTop = oldTop;\r\n }\r\n }\r\n\r\n if (!leftAndTopIgnoreAdaptiveScaling && oldLeft === newLeft && oldTop === newTop) {\r\n return;\r\n }\r\n\r\n this.left = newLeft + \"px\";\r\n this.top = newTop + \"px\";\r\n\r\n this._left.ignoreAdaptiveScaling = true;\r\n this._top.ignoreAdaptiveScaling = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetLeft(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.left += offset;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetTop(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.top += offset;\r\n }\r\n\r\n /** @internal */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @internal */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _intersectsRect(rect: Measure, context?: ICanvasRenderingContext) {\r\n // make sure we are transformed correctly before checking intersections. no-op if nothing is dirty.\r\n this._transform(context);\r\n if (this._evaluatedMeasure.left >= rect.left + rect.width) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top >= rect.top + rect.height) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width <= rect.left) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height <= rect.top) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public invalidateRect() {\r\n this._transform();\r\n if (this.host && this.host.useInvalidateRectOptimization) {\r\n // Rotate by transform to get the measure transformed to global space\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\r\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\r\n // the previous measure is used to properly clear a control that is scaled down\r\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\r\n\r\n // Expand rect based on shadows\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n const offsetX = this._computeAdditionalOffsetX();\r\n const offsetY = this._computeAdditionalOffsetY();\r\n\r\n this.host.invalidateRect(\r\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\r\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\r\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\r\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markAsDirty(force = false): void {\r\n if (!this._isVisible && !force) {\r\n return;\r\n }\r\n\r\n this._isDirty = true;\r\n this._markMatrixAsDirty();\r\n\r\n // Redraw only this rectangle\r\n if (this._host) {\r\n this._host.markAsDirty();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _markAllAsDirty(): void {\r\n this._markAsDirty();\r\n\r\n if (this._font) {\r\n this._prepareFont();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _link(host: AdvancedDynamicTexture): void {\r\n this._host = host;\r\n if (this._host) {\r\n this.uniqueId = this._host.getScene()!.getUniqueId();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _transform(context?: ICanvasRenderingContext): void {\r\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\r\n return;\r\n }\r\n\r\n // postTranslate\r\n const offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\r\n const offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\r\n if (context) {\r\n context.translate(offsetX, offsetY);\r\n\r\n // rotate\r\n context.rotate(this._rotation);\r\n\r\n // scale\r\n context.scale(this._scaleX, this._scaleY);\r\n\r\n // preTranslate\r\n context.translate(-offsetX, -offsetY);\r\n }\r\n // Need to update matrices?\r\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\r\n this._cachedOffsetX = offsetX;\r\n this._cachedOffsetY = offsetY;\r\n this._isMatrixDirty = false;\r\n this._flagDescendantsAsMatrixDirty();\r\n\r\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\r\n\r\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlight(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n context.save();\r\n context.strokeStyle = this._highlightColor;\r\n context.lineWidth = this._highlightLineWidth;\r\n\r\n this._renderHighlightSpecific(context);\r\n context.restore();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n protected _getColor(context: ICanvasRenderingContext): string | ICanvasGradient {\r\n return this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n if (this._isFontSizeInPercentage) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._host && this._host.useSmallestIdeal && !this._font) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._fontSet) {\r\n this._prepareFont();\r\n this._fontSet = false;\r\n }\r\n\r\n if (this._font) {\r\n context.font = this._font;\r\n }\r\n\r\n if (this._color || this.gradient) {\r\n context.fillStyle = this._getColor(context);\r\n }\r\n\r\n if (Control.AllowAlphaInheritance) {\r\n context.globalAlpha *= this._alpha;\r\n } else if (this._alphaSet) {\r\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n this.host._numLayoutCalls++;\r\n\r\n this._currentMeasure.addAndTransformToRef(\r\n this._transformMatrix,\r\n -this._paddingLeftInPixels | 0,\r\n -this._paddingTopInPixels | 0,\r\n this._paddingRightInPixels | 0,\r\n this._paddingBottomInPixels | 0,\r\n this._prevCurrentMeasureTransformedIntoGlobalSpace\r\n );\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n let rebuildCount = 0;\r\n do {\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < 3);\r\n\r\n if (rebuildCount >= 3) {\r\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n this.invalidateRect();\r\n this._evaluateClippingState(parentMeasure);\r\n }\r\n\r\n this._wasDirty = this._isDirty;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n this._tempPaddingMeasure.copyFrom(parentMeasure);\r\n\r\n // Apply padding if in correct mode\r\n if (this.parent && this.parent.descendantsOnlyPadding) {\r\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\r\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\r\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\r\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\r\n }\r\n\r\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n // Let children take some pre-measurement actions\r\n this._preMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._measure();\r\n\r\n // Let children take some post-measurement actions\r\n this._postMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Convert to int values\r\n this._currentMeasure.left = this._currentMeasure.left | 0;\r\n this._currentMeasure.top = this._currentMeasure.top | 0;\r\n this._currentMeasure.width = this._currentMeasure.width | 0;\r\n this._currentMeasure.height = this._currentMeasure.height | 0;\r\n\r\n // Let children add more features\r\n this._additionalProcessing(this._tempPaddingMeasure, context);\r\n\r\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.onDirtyObservable.hasObservers()) {\r\n this.onDirtyObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _evaluateClippingState(parentMeasure: Measure) {\r\n // Since transformMatrix is used here, we need to have it freshly computed\r\n this._transform();\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.parent && this.parent.clipChildren) {\r\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\r\n // Early clip\r\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n }\r\n\r\n this._isClipped = false;\r\n }\r\n\r\n /** @internal */\r\n public _measure(): void {\r\n // Width / Height\r\n if (this._width.isPixel) {\r\n this._currentMeasure.width = this._width.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width *= this._width.getValue(this._host);\r\n }\r\n\r\n if (this._height.isPixel) {\r\n this._currentMeasure.height = this._height.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height *= this._height.getValue(this._host);\r\n }\r\n\r\n if (this._fixedRatio !== 0) {\r\n if (this._fixedRatioMasterIsWidth) {\r\n this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio;\r\n } else {\r\n this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n const parentWidth = parentMeasure.width;\r\n const parentHeight = parentMeasure.height;\r\n\r\n // Left / top\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (this.horizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = parentWidth - width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (parentWidth - width) / 2;\r\n break;\r\n }\r\n\r\n switch (this.verticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n y = 0;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n y = parentHeight - height;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n y = (parentHeight - height) / 2;\r\n break;\r\n }\r\n\r\n if (!this.descendantsOnlyPadding) {\r\n if (this._paddingLeft.isPixel) {\r\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\r\n }\r\n\r\n if (this._paddingRight.isPixel) {\r\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\r\n }\r\n\r\n if (this._paddingTop.isPixel) {\r\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\r\n }\r\n\r\n if (this._paddingBottom.isPixel) {\r\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\r\n }\r\n }\r\n\r\n if (this._left.isPixel) {\r\n this._currentMeasure.left += this._left.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\r\n }\r\n\r\n if (this._top.isPixel) {\r\n this._currentMeasure.top += this._top.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\r\n }\r\n\r\n this._currentMeasure.left += x;\r\n this._currentMeasure.top += y;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _postMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _clipForChildren(context: ICanvasRenderingContext): void {\r\n // DO nothing\r\n }\r\n\r\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\r\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\r\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\r\n context.beginPath();\r\n Control._ClipMeasure.copyFrom(this._currentMeasure);\r\n if (invalidatedRectangle) {\r\n // Rotate the invalidated rect into the control's space\r\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\r\n\r\n // Get the intersection of the rect in context space and the current context\r\n const intersection = new Measure(0, 0, 0, 0);\r\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\r\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\r\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\r\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\r\n Control._ClipMeasure.copyFrom(intersection);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = this.shadowBlur;\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n context.rect(\r\n Control._ClipMeasure.left + leftShadowOffset,\r\n Control._ClipMeasure.top + topShadowOffset,\r\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\r\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\r\n );\r\n } else {\r\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\r\n }\r\n\r\n context.clip();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\r\n if (!this.isVisible || this.notRenderable || this._isClipped) {\r\n this._isDirty = false;\r\n return false;\r\n }\r\n\r\n this.host._numRenderCalls++;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Transform\r\n this._transform(context);\r\n\r\n // Clip\r\n if (this.clipContent) {\r\n this._clip(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.onBeforeDrawObservable.hasObservers()) {\r\n this.onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\r\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\r\n } else {\r\n this._draw(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.useBitmapCache && this._wasDirty) {\r\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n this._renderHighlight(context);\r\n\r\n if (this.onAfterDrawObservable.hasObservers()) {\r\n this.onAfterDrawObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public contains(x: number, y: number): boolean {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n // Check\r\n if (x < this._currentMeasure.left) {\r\n return false;\r\n }\r\n\r\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\r\n return false;\r\n }\r\n\r\n if (y < this._currentMeasure.top) {\r\n return false;\r\n }\r\n\r\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\r\n return false;\r\n }\r\n\r\n if (this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\r\n return false;\r\n }\r\n\r\n if (!this.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: Nullable<PointerInfoBase>): void {\r\n const canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (this._enterCount > 0) {\r\n return false;\r\n }\r\n\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n this._enterCount++;\r\n\r\n const canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && !this._isEnabled) {\r\n return;\r\n }\r\n this._enterCount = 0;\r\n\r\n let canNotify: boolean = true;\r\n\r\n if (!target.isAscendant(this)) {\r\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\r\n }\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: Nullable<PointerInfoBase>): boolean {\r\n // Prevent pointerout to lose control context.\r\n // Event redundancy is checked inside the function.\r\n this._onPointerEnter(this, pi);\r\n\r\n if (this.tabIndex !== -1) {\r\n this.host.focusedControl = this;\r\n }\r\n\r\n if (this._downCount !== 0) {\r\n return false;\r\n }\r\n\r\n this._downCount++;\r\n\r\n this._downPointerIds[pointerId] = true;\r\n\r\n const canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.add((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: Nullable<PointerInfoBase>): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._downCount = 0;\r\n\r\n delete this._downPointerIds[pointerId];\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.delete((pi.event as IPointerEvent).pointerId);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n const canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\r\n\r\n if (canNotify && this.parent != null) {\r\n this.parent._onWheelScroll(deltaX, deltaY);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(\r\n type: number,\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._dummyVector2.copyFromFloats(x, y);\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this, pi);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this, pi);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\r\n this._host._registerLastControlDown(this, pointerId);\r\n this._host._lastPickedControl = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERUP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERWHEEL) {\r\n if (this._host._lastControlOver[pointerId]) {\r\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getStyleProperty(propName: \"fontStyle\" | \"fontWeight\" | \"fontFamily\", defaultValue: string): string {\r\n const prop = (this._style && this._style[propName]) ?? this[propName];\r\n if (!prop && this.parent) {\r\n return this.parent._getStyleProperty(propName, defaultValue);\r\n } else if (!this.parent) {\r\n return defaultValue;\r\n } else {\r\n return prop;\r\n }\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n this._font =\r\n this._getStyleProperty(\"fontStyle\", \"\") +\r\n \" \" +\r\n this._getStyleProperty(\"fontWeight\", \"\") +\r\n \" \" +\r\n this.fontSizeInPixels +\r\n \"px \" +\r\n this._getStyleProperty(\"fontFamily\", \"Arial\");\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font, this._host?.getScene()?.getEngine());\r\n\r\n //children need to be refreshed\r\n this.getDescendants().forEach((child) => child._markAllAsDirty());\r\n }\r\n\r\n /**\r\n * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.\r\n * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.\r\n * @param dim the dimension to check (width or height)\r\n * @returns if the dimension is fully defined\r\n */\r\n public isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n return this.getDimension(dim).isPixel;\r\n }\r\n\r\n /**\r\n * Gets the dimension of the control along a specified axis\r\n * @param dim the dimension to retrieve (width or height)\r\n * @returns the dimension value along the specified axis\r\n */\r\n public getDimension(dim: \"width\" | \"height\"): ValueAndUnit {\r\n if (dim === \"width\") {\r\n return this._width;\r\n } else {\r\n return this._height;\r\n }\r\n }\r\n\r\n /**\r\n * Clones a control and its descendants\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @returns the cloned control\r\n */\r\n public clone(host?: AdvancedDynamicTexture): Control {\r\n const serialization: any = {};\r\n this.serialize(serialization, true);\r\n\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serialization.className);\r\n const cloned = new controlType();\r\n cloned.parse(serialization, host);\r\n\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Parses a serialized object into this control\r\n * @param serializedObject the object with the serialized properties\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns this control\r\n */\r\n public parse(serializedObject: any, host?: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n this._urlRewriter = urlRewriter;\r\n SerializationHelper.Parse(() => this, serializedObject, null);\r\n\r\n this.name = serializedObject.name;\r\n\r\n this._parseFromContent(serializedObject, host ?? this._host);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n // Call prepareFont to guarantee the font is properly set before serializing\r\n if (allowCanvas) {\r\n this._prepareFont();\r\n }\r\n if (this._fontFamily) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n }\r\n if (this.fontSize) {\r\n serializationObject.fontSize = this.fontSize;\r\n }\r\n if (this.fontWeight) {\r\n serializationObject.fontWeight = this.fontWeight;\r\n }\r\n if (this.fontStyle) {\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n\r\n if (this._gradient) {\r\n serializationObject.gradient = {};\r\n this._gradient.serialize(serializationObject.gradient);\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n if (serializedObject.fontFamily) {\r\n this.fontFamily = serializedObject.fontFamily;\r\n }\r\n\r\n if (serializedObject.fontSize) {\r\n this.fontSize = serializedObject.fontSize;\r\n }\r\n\r\n if (serializedObject.fontWeight) {\r\n this.fontWeight = serializedObject.fontWeight;\r\n }\r\n\r\n if (serializedObject.fontStyle) {\r\n this.fontStyle = serializedObject.fontStyle;\r\n }\r\n\r\n // Gradient\r\n if (serializedObject.gradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.gradient.className);\r\n this._gradient = new className();\r\n this._gradient?.parse(serializedObject.gradient);\r\n }\r\n\r\n // Animations\r\n if (serializedObject.animations) {\r\n this.animations = [];\r\n for (let animationIndex = 0; animationIndex < serializedObject.animations.length; animationIndex++) {\r\n const parsedAnimation = serializedObject.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n this.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n\r\n if (serializedObject.autoAnimate && this._host && this._host.getScene()) {\r\n this._host\r\n .getScene()!\r\n .beginAnimation(\r\n this,\r\n serializedObject.autoAnimateFrom,\r\n serializedObject.autoAnimateTo,\r\n serializedObject.autoAnimateLoop,\r\n serializedObject.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n\r\n this.fixedRatioMasterIsWidth = serializedObject.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;\r\n }\r\n\r\n /** Releases associated resources */\r\n public dispose() {\r\n this.onDirtyObservable.clear();\r\n this.onBeforeDrawObservable.clear();\r\n this.onAfterDrawObservable.clear();\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n this.onWheelObservable.clear();\r\n\r\n // focus\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n\r\n if (this._styleObserver && this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n if (this.parent) {\r\n this.parent.removeControl(this);\r\n this.parent = null;\r\n }\r\n\r\n if (this._host) {\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index > -1) {\r\n this.linkWithMesh(null);\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n // Statics\r\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\r\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\r\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\r\n\r\n private static _VERTICAL_ALIGNMENT_TOP = 0;\r\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\r\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\r\n\r\n /** HORIZONTAL_ALIGNMENT_LEFT */\r\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_RIGHT */\r\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_CENTER */\r\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_TOP */\r\n public static get VERTICAL_ALIGNMENT_TOP(): number {\r\n return Control._VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_BOTTOM */\r\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\r\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_CENTER */\r\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\r\n return Control._VERTICAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetFontOffset(font: string, engineToUse?: AbstractEngine): { ascent: number; height: number; descent: number } {\r\n if (Control._FontHeightSizes[font]) {\r\n return Control._FontHeightSizes[font];\r\n }\r\n\r\n const engine = engineToUse || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n\r\n const result = engine.getFontOffset(font);\r\n Control._FontHeightSizes[font] = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a Control from parsed data\r\n * @param serializedObject defines parsed data\r\n * @param host defines the hosting AdvancedDynamicTexture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(\r\n () => {\r\n const newControl = new controlType() as Control;\r\n newControl._urlRewriter = urlRewriter;\r\n return newControl;\r\n },\r\n serializedObject,\r\n null\r\n );\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host, urlRewriter);\r\n\r\n return control;\r\n }\r\n\r\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => {};\r\n\r\n /**\r\n * @internal\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: number, arc: number, context: ICanvasRenderingContext): void {\r\n context.translate(x, y);\r\n context.scale(width, height);\r\n\r\n context.beginPath();\r\n context.arc(0, 0, 1, 0, 2 * Math.PI * arc, arc < 0);\r\n\r\n if (arc >= 1) {\r\n context.closePath();\r\n }\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n\r\n /**\r\n * Returns true if the control is ready to be used\r\n * @returns\r\n */\r\n public isReady(): boolean {\r\n // Most controls are ready by default, so the default implementation is to return true\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n"]}
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../../../../dev/gui/src/2D/controls/control.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport type { Nullable } from \"core/types\";\r\nimport type { Observer } from \"core/Misc/observable\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport type { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport type { Container } from \"./container\";\r\nimport type { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport type { Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { GetClass, RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport type { ICanvasGradient, ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport type { IAccessibilityTag } from \"core/IAccessibilityTag\";\r\nimport type { IKeyboardEvent, IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport type { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport type { Animation } from \"core/Animations/animation\";\r\nimport type { BaseGradient } from \"./gradient/BaseGradient\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { IFocusableControl } from \"./focusableControl\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#controls\r\n */\r\nexport class Control implements IAnimatable, IFocusableControl {\r\n /**\r\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\r\n */\r\n public static AllowAlphaInheritance = false;\r\n\r\n private _alpha = 1;\r\n private _alphaSet = false;\r\n private _zIndex = 0;\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @internal */\r\n public _currentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _font: string;\r\n /** @internal */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n protected _fontOffset: { ascent: number; height: number; descent: number };\r\n private _color = \"\";\r\n private _style: Nullable<Style> = null;\r\n private _styleObserver: Nullable<Observer<Style>>;\r\n /** @internal */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _isDirty = true;\r\n /** @internal */\r\n protected _wasDirty = false;\r\n /** @internal */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @internal */\r\n public _cachedParentMeasure = Measure.Empty();\r\n private _descendantsOnlyPadding = false;\r\n private _paddingLeft = new ValueAndUnit(0);\r\n private _paddingRight = new ValueAndUnit(0);\r\n private _paddingTop = new ValueAndUnit(0);\r\n private _paddingBottom = new ValueAndUnit(0);\r\n /** @internal */\r\n public _left = new ValueAndUnit(0);\r\n /** @internal */\r\n public _top = new ValueAndUnit(0);\r\n private _scaleX = 1.0;\r\n private _scaleY = 1.0;\r\n private _rotation = 0;\r\n private _transformCenterX = 0.5;\r\n private _transformCenterY = 0.5;\r\n /** @internal */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _transformedPosition = Vector2.Zero();\r\n private _isMatrixDirty = true;\r\n private _cachedOffsetX: number;\r\n private _cachedOffsetY: number;\r\n private _isVisible = true;\r\n private _isHighlighted = false;\r\n private _highlightColor = \"#4affff\";\r\n protected _highlightLineWidth = 2;\r\n /** @internal */\r\n public _linkedMesh: Nullable<TransformNode>;\r\n private _fontSet = false;\r\n private _dummyVector2 = Vector2.Zero();\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _doNotRender = false;\r\n private _downPointerIds: { [id: number]: boolean } = {};\r\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\r\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\r\n protected _isEnabled = true;\r\n protected _disabledColor = \"#9a9a9a\";\r\n protected _disabledColorItem = \"#6a6a6a\";\r\n protected _isReadOnly = false;\r\n private _gradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _rebuildLayout = false;\r\n\r\n /** @internal */\r\n protected _urlRewriter?: (url: string) => string;\r\n\r\n /**\r\n * Observable that fires when the control's enabled state changes\r\n */\r\n public onEnabledStateChangedObservable = new Observable<boolean>();\r\n\r\n /** @internal */\r\n public _customData: any = {};\r\n\r\n /** @internal */\r\n public _isClipped = false;\r\n\r\n /** @internal */\r\n public _automaticSize = false;\r\n\r\n /** @internal */\r\n public _tag: any;\r\n\r\n /**\r\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the control is readonly (default: false).\r\n * A readonly control will still raise pointer events but will not react to them\r\n */\r\n public get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n }\r\n\r\n /**\r\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\r\n */\r\n public get transformedMeasure(): Measure {\r\n return this._evaluatedMeasure;\r\n }\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\r\n @serialize()\r\n public isHitTestVisible = true;\r\n /** Gets or sets a boolean indicating if the control can block pointer events. False by default except on the following controls:\r\n * * Button controls (Button, RadioButton, ToggleButton)\r\n * * Checkbox\r\n * * ColorPicker\r\n * * InputText\r\n * * Slider\r\n */\r\n @serialize()\r\n public isPointerBlocker = false;\r\n /** Gets or sets a boolean indicating if the control can be focusable */\r\n @serialize()\r\n public isFocusInvisible = false;\r\n\r\n protected _clipChildren = true;\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n }\r\n\r\n @serialize()\r\n public get clipChildren() {\r\n return this._clipChildren;\r\n }\r\n\r\n protected _clipContent = true;\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n }\r\n\r\n @serialize()\r\n public get clipContent() {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\r\n */\r\n @serialize()\r\n public useBitmapCache = false;\r\n\r\n private _cacheData: Nullable<ImageData>;\r\n\r\n private _shadowOffsetX = 0;\r\n /** Gets or sets a value indicating the offset to apply on X axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetX() {\r\n return this._shadowOffsetX;\r\n }\r\n\r\n public set shadowOffsetX(value: number) {\r\n if (this._shadowOffsetX === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetX = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowOffsetY = 0;\r\n /** Gets or sets a value indicating the offset to apply on Y axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetY() {\r\n return this._shadowOffsetY;\r\n }\r\n\r\n public set shadowOffsetY(value: number) {\r\n if (this._shadowOffsetY === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetY = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowBlur = 0;\r\n private _previousShadowBlur = 0;\r\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\r\n @serialize()\r\n public get shadowBlur() {\r\n return this._shadowBlur;\r\n }\r\n\r\n public set shadowBlur(value: number) {\r\n if (this._shadowBlur === value) {\r\n return;\r\n }\r\n\r\n this._previousShadowBlur = this._shadowBlur;\r\n\r\n this._shadowBlur = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowColor = \"black\";\r\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\r\n @serialize()\r\n public get shadowColor() {\r\n return this._shadowColor;\r\n }\r\n\r\n public set shadowColor(value: string) {\r\n if (this._shadowColor === value) {\r\n return;\r\n }\r\n\r\n this._shadowColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the cursor to use when the control is hovered */\r\n @serialize()\r\n public hoverCursor = \"\";\r\n\r\n /** @internal */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @internal */\r\n protected _linkOffsetY = new ValueAndUnit(0);\r\n\r\n // Properties\r\n\r\n /** Gets the control type name */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the control for accessibility purpose.\r\n * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.\r\n */\r\n public set accessibilityTag(value: Nullable<IAccessibilityTag>) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable<IAccessibilityTag> = null;\r\n\r\n /**\r\n * Observable that fires whenever the accessibility event of the control has changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable<Nullable<IAccessibilityTag>>();\r\n\r\n /**\r\n * An event triggered when pointer wheel is scrolled\r\n */\r\n public onWheelObservable = new Observable<Vector2>();\r\n /**\r\n * An event triggered when the pointer moves over the control.\r\n */\r\n public onPointerMoveObservable = new Observable<Vector2>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control.\r\n */\r\n public onPointerOutObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer up\r\n */\r\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on\r\n */\r\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control receives an ENTER key down event\r\n */\r\n public onEnterPressedObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control is marked as dirty\r\n */\r\n public onDirtyObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered before drawing the control\r\n */\r\n public onBeforeDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered after the control was drawn\r\n */\r\n public onAfterDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control has been disposed\r\n */\r\n public onDisposeObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control isVisible is changed\r\n */\r\n public onIsVisibleChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Get the hosting AdvancedDynamicTexture\r\n */\r\n public get host(): AdvancedDynamicTexture {\r\n return this._host;\r\n }\r\n\r\n /** Gets or set information about font offsets (used to render and align text) */\r\n @serialize()\r\n public get fontOffset(): { ascent: number; height: number; descent: number } {\r\n return this._fontOffset;\r\n }\r\n\r\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\r\n this._fontOffset = offset;\r\n }\r\n\r\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\r\n @serialize()\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n this._alphaSet = true;\r\n this._alpha = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\r\n */\r\n public get highlightLineWidth(): number {\r\n return this._highlightLineWidth;\r\n }\r\n\r\n public set highlightLineWidth(value: number) {\r\n if (this._highlightLineWidth === value) {\r\n return;\r\n }\r\n\r\n this._highlightLineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\r\n */\r\n public get isHighlighted(): boolean {\r\n return this._isHighlighted;\r\n }\r\n\r\n public set isHighlighted(value: boolean) {\r\n if (this._isHighlighted === value) {\r\n return;\r\n }\r\n\r\n this._isHighlighted = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Indicates if the control should be serialized. Defaults to true.\r\n */\r\n @serialize()\r\n public isSerializable: boolean = true;\r\n\r\n /**\r\n * Gets or sets a string defining the color to use for highlighting this control\r\n */\r\n public get highlightColor(): string {\r\n return this._highlightColor;\r\n }\r\n\r\n public set highlightColor(value: string) {\r\n if (this._highlightColor === value) {\r\n return;\r\n }\r\n\r\n this._highlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleX(): number {\r\n return this._scaleX;\r\n }\r\n\r\n public set scaleX(value: number) {\r\n if (this._scaleX === value) {\r\n return;\r\n }\r\n\r\n this._scaleX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleY(): number {\r\n return this._scaleY;\r\n }\r\n\r\n public set scaleY(value: number) {\r\n if (this._scaleY === value) {\r\n return;\r\n }\r\n\r\n this._scaleY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the rotation angle (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get rotation(): number {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(value: number) {\r\n if (this._rotation === value) {\r\n return;\r\n }\r\n\r\n this._rotation = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on Y axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterY(): number {\r\n return this._transformCenterY;\r\n }\r\n\r\n public set transformCenterY(value: number) {\r\n if (this._transformCenterY === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on X axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterX(): number {\r\n return this._transformCenterX;\r\n }\r\n\r\n public set transformCenterX(value: number) {\r\n if (this._transformCenterX === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get horizontalAlignment(): number {\r\n return this._horizontalAlignment;\r\n }\r\n\r\n public set horizontalAlignment(value: number) {\r\n if (this._horizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._horizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the vertical alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get verticalAlignment(): number {\r\n return this._verticalAlignment;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n if (this._verticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._verticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _fixedRatio = 0;\r\n public set fixedRatio(value: number) {\r\n if (this._fixedRatio === value) {\r\n return;\r\n }\r\n\r\n this._fixedRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a fixed ratio for this control.\r\n * When different from 0, the ratio is used to compute the \"second\" dimension.\r\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\r\n * second dimension is computed as first dimension * fixedRatio\r\n */\r\n @serialize()\r\n public get fixedRatio(): number {\r\n return this._fixedRatio;\r\n }\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n set fixedRatioMasterIsWidth(value: boolean) {\r\n if (this._fixedRatioMasterIsWidth === value) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.\r\n * When the height of a control is set, this property is changed to false.\r\n */\r\n @serialize()\r\n get fixedRatioMasterIsWidth(): boolean {\r\n return this._fixedRatioMasterIsWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public set width(value: string | number) {\r\n this._fixedRatioMasterIsWidth = true;\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the control width in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get widthInPixels(): number {\r\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set widthInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = true;\r\n this.width = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n public set height(value: string | number) {\r\n this._fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get heightInPixels(): number {\r\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set heightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = false;\r\n this.height = value + \"px\";\r\n }\r\n\r\n /** Gets or set font family */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font style */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /**\r\n * Gets or sets style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n @serialize()\r\n public get style(): Nullable<Style> {\r\n return this._style;\r\n }\r\n\r\n public set style(value: Nullable<Style>) {\r\n if (this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n this._style = value;\r\n\r\n if (this._style) {\r\n this._styleObserver = this._style.onChangedObservable.add(() => {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n\r\n /** @internal */\r\n public get _isFontSizeInPercentage(): boolean {\r\n return this._fontSize.isPercentage;\r\n }\r\n\r\n /** Gets or sets font size in pixels */\r\n public get fontSizeInPixels(): number {\r\n const fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\r\n\r\n if (fontSizeToUse.isPixel) {\r\n return fontSizeToUse.getValue(this._host);\r\n }\r\n\r\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\r\n }\r\n\r\n public set fontSizeInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.fontSize = value + \"px\";\r\n }\r\n\r\n /** Gets or sets font size */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n }\r\n\r\n /** Gets or sets foreground color */\r\n @serialize()\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n public set color(value: string) {\r\n if (this._color === value) {\r\n return;\r\n }\r\n\r\n this._color = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets gradient. Setting a gradient will override the color */\r\n @serialize()\r\n public get gradient(): Nullable<BaseGradient> {\r\n return this._gradient;\r\n }\r\n\r\n public set gradient(value: Nullable<BaseGradient>) {\r\n if (this._gradient === value) {\r\n return;\r\n }\r\n\r\n this._gradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets z index which is used to reorder controls on the z axis */\r\n @serialize()\r\n public get zIndex(): number {\r\n return this._zIndex;\r\n }\r\n\r\n public set zIndex(value: number) {\r\n if (this.zIndex === value) {\r\n return;\r\n }\r\n\r\n this._zIndex = value;\r\n\r\n if (this.parent) {\r\n this.parent._reOrderControl(this);\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can be rendered */\r\n @serialize()\r\n public get notRenderable(): boolean {\r\n return this._doNotRender;\r\n }\r\n\r\n public set notRenderable(value: boolean) {\r\n if (this._doNotRender === value) {\r\n return;\r\n }\r\n\r\n this._doNotRender = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n @serialize()\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n this._markAsDirty(true);\r\n\r\n this.onIsVisibleChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /** Gets a boolean indicating that the control needs to update its rendering */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Gets the current linked mesh (or null if none)\r\n */\r\n public get linkedMesh(): Nullable<TransformNode> {\r\n return this._linkedMesh;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding should work like in CSS.\r\n * Basically, it will add the padding amount on each side of the parent control for its children.\r\n */\r\n @serialize()\r\n public get descendantsOnlyPadding(): boolean {\r\n return this._descendantsOnlyPadding;\r\n }\r\n\r\n public set descendantsOnlyPadding(value: boolean) {\r\n if (this._descendantsOnlyPadding === value) {\r\n return;\r\n }\r\n\r\n this._descendantsOnlyPadding = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingLeft(): string | number {\r\n return this._paddingLeft.toString(this._host);\r\n }\r\n\r\n public set paddingLeft(value: string | number) {\r\n if (this._paddingLeft.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingLeftInPixels(): number {\r\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingLeftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingLeft = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingLeftInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingLeftInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingRight(): string | number {\r\n return this._paddingRight.toString(this._host);\r\n }\r\n\r\n public set paddingRight(value: string | number) {\r\n if (this._paddingRight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingRightInPixels(): number {\r\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingRightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingRight = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingRightInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingRightInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingTop(): string | number {\r\n return this._paddingTop.toString(this._host);\r\n }\r\n\r\n public set paddingTop(value: string | number) {\r\n if (this._paddingTop.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingTopInPixels(): number {\r\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingTopInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingTop = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingTopInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingTopInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingBottom(): string | number {\r\n return this._paddingBottom.toString(this._host);\r\n }\r\n\r\n public set paddingBottom(value: string | number) {\r\n if (this._paddingBottom.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingBottomInPixels(): number {\r\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingBottomInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingBottom = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingBottomInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingBottomInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get left(): string | number {\r\n return this._left.toString(this._host);\r\n }\r\n\r\n public set left(value: string | number) {\r\n if (this._left.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get leftInPixels(): number {\r\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set leftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.left = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get top(): string | number {\r\n return this._top.toString(this._host);\r\n }\r\n\r\n public set top(value: string | number) {\r\n if (this._top.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get topInPixels(): number {\r\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set topInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.top = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetX(): string | number {\r\n return this._linkOffsetX.toString(this._host);\r\n }\r\n\r\n public set linkOffsetX(value: string | number) {\r\n if (this._linkOffsetX.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetXInPixels(): number {\r\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set linkOffsetXInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetX = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetY(): string | number {\r\n return this._linkOffsetY.toString(this._host);\r\n }\r\n\r\n public set linkOffsetY(value: string | number) {\r\n if (this._linkOffsetY.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetYInPixels(): number {\r\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set linkOffsetYInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetY = value + \"px\";\r\n }\r\n\r\n /** Gets the center coordinate on X axis */\r\n public get centerX(): number {\r\n return this._currentMeasure.left + this._currentMeasure.width / 2;\r\n }\r\n\r\n /** Gets the center coordinate on Y axis */\r\n public get centerY(): number {\r\n return this._currentMeasure.top + this._currentMeasure.height / 2;\r\n }\r\n\r\n /** Gets or sets if control is Enabled */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._markAsDirty();\r\n // if this control or any of it's descendants are under a pointer, we need to fire a pointerOut event\r\n const recursivelyFirePointerOut = (control: Control) => {\r\n if (!control.host) {\r\n return;\r\n }\r\n for (const pointer in control.host._lastControlOver) {\r\n if (control === this.host._lastControlOver[pointer]) {\r\n control._onPointerOut(control, null, true);\r\n delete control.host._lastControlOver[pointer];\r\n }\r\n }\r\n if ((control as Container).children !== undefined) {\r\n (control as Container).children.forEach(recursivelyFirePointerOut);\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\r\n this.onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n /** Gets or sets background color of control if it's disabled. Only applies to Button class. */\r\n @serialize()\r\n public get disabledColor(): string {\r\n return this._disabledColor;\r\n }\r\n\r\n public set disabledColor(value: string) {\r\n if (this._disabledColor === value) {\r\n return;\r\n }\r\n\r\n this._disabledColor = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */\r\n @serialize()\r\n public get disabledColorItem(): string {\r\n return this._disabledColorItem;\r\n }\r\n\r\n public set disabledColorItem(value: string) {\r\n if (this._disabledColorItem === value) {\r\n return;\r\n }\r\n\r\n this._disabledColorItem = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets/sets the overlap group of the control.\r\n * Controls with overlapGroup set to a number can be deoverlapped.\r\n * Controls with overlapGroup set to undefined are not deoverlapped.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#deoverlapping\r\n */\r\n @serialize()\r\n public overlapGroup?: number;\r\n /**\r\n * Gets/sets the deoverlap movement multiplier\r\n */\r\n @serialize()\r\n public overlapDeltaMultiplier?: number;\r\n\r\n /**\r\n * Array of animations\r\n */\r\n animations: Nullable<Animation[]> = null;\r\n\r\n // Focus functionality\r\n\r\n protected _focusedColor: Nullable<string> = null;\r\n /**\r\n * Border color when control is focused\r\n * When not defined the ADT color will be used. If no ADT color is defined, focused state won't have any border\r\n */\r\n public get focusedColor(): Nullable<string> {\r\n return this._focusedColor;\r\n }\r\n public set focusedColor(value: Nullable<string>) {\r\n this._focusedColor = value;\r\n }\r\n /**\r\n * The tab index of this control. -1 indicates this control is not part of the tab navigation.\r\n * A positive value indicates the order of the control in the tab navigation.\r\n * A value of 0 indicated the control will be focused after all controls with a positive index.\r\n * More than one control can have the same tab index and the navigation would then go through all controls with the same value in an order defined by the layout or the hierarchy.\r\n * The value can be changed at any time.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n */\r\n public tabIndex: number = -1;\r\n protected _isFocused = false;\r\n protected _unfocusedColor: Nullable<string> = null;\r\n\r\n /** Observable raised when the control gets the focus */\r\n public onFocusObservable = new Observable<Control>();\r\n /** Observable raised when the control loses the focus */\r\n public onBlurObservable = new Observable<Control>();\r\n /** Observable raised when a key event was processed */\r\n public onKeyboardEventProcessedObservable = new Observable<IKeyboardEvent>();\r\n\r\n /** @internal */\r\n public onBlur(): void {\r\n if (this._isFocused) {\r\n this._isFocused = false;\r\n if (this.focusedColor && this._unfocusedColor != null) {\r\n // Set color back to saved unfocused color\r\n this.color = this._unfocusedColor;\r\n }\r\n this.onBlurObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onFocus(): void {\r\n this._isFocused = true;\r\n\r\n if (this.focusedColor) {\r\n // Save the unfocused color\r\n this._unfocusedColor = this.color;\r\n this.color = this.focusedColor;\r\n }\r\n this.onFocusObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public keepsFocusWith(): Nullable<Control[]> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Function to focus a button programmatically\r\n */\r\n public focus() {\r\n this._host.moveFocusToControl(this);\r\n }\r\n\r\n /**\r\n * Function to unfocus a button programmatically\r\n */\r\n public blur() {\r\n this._host.focusedControl = null;\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public processKeyboard(evt: IKeyboardEvent): void {\r\n // if enter, trigger the new observable\r\n if (evt.key === \"Enter\") {\r\n this.onEnterPressedObservable.notifyObservers(this);\r\n }\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt, -1, this);\r\n }\r\n\r\n // Functions\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the name of the control\r\n */\r\n constructor(\r\n /** defines the name of the control */\r\n public name?: string\r\n ) {}\r\n\r\n /** @internal */\r\n protected _getTypeName(): string {\r\n return \"Control\";\r\n }\r\n\r\n /**\r\n * Gets the first ascendant in the hierarchy of the given type\r\n * @param className defines the required type\r\n * @returns the ascendant or null if not found\r\n */\r\n public getAscendantOfClass(className: string): Nullable<Control> {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n if (this.parent.getClassName() === className) {\r\n return this.parent;\r\n }\r\n\r\n return this.parent.getAscendantOfClass(className);\r\n }\r\n\r\n /**\r\n * Mark control element as dirty\r\n * @param force force non visible elements to be marked too\r\n */\r\n public markAsDirty(force = false): void {\r\n this._markAsDirty(force);\r\n }\r\n\r\n /**\r\n * Mark the element and its children as dirty\r\n */\r\n public markAllAsDirty(): void {\r\n this._markAllAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public _resetFontCache(): void {\r\n this._fontSet = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Determines if a container is an ascendant of the current control\r\n * @param container defines the container to look for\r\n * @returns true if the container is one of the ascendant of the control\r\n */\r\n public isAscendant(container: Control): boolean {\r\n if (!this.parent) {\r\n return false;\r\n }\r\n\r\n if (this.parent === container) {\r\n return true;\r\n }\r\n\r\n return this.parent.isAscendant(container);\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in local space\r\n */\r\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n this.getLocalCoordinatesToRef(globalCoordinates, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @param result defines the target vector2 where to store the result\r\n * @returns the current control\r\n */\r\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\r\n result.x = globalCoordinates.x - this._currentMeasure.left;\r\n result.y = globalCoordinates.y - this._currentMeasure.top;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets coordinates in parent local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in parent local space\r\n */\r\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\r\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Move the current control to a vector3 position projected onto the screen.\r\n * @param position defines the target position\r\n * @param scene defines the hosting scene\r\n */\r\n public moveToVector3(position: Vector3, scene: Scene): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Will store all controls that have this control as ascendant in a given array\r\n * @param results defines the array where to store the descendants\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n */\r\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * Will return all controls that have this control as ascendant\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results: Control[] = [];\r\n\r\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Link current control with a target mesh\r\n * @param mesh defines the mesh to link with\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\r\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\r\n if (mesh) {\r\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\r\n }\r\n return;\r\n }\r\n\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index !== -1) {\r\n this._linkedMesh = mesh;\r\n if (!mesh) {\r\n this._host._linkedControls.splice(index, 1);\r\n }\r\n return;\r\n } else if (!mesh) {\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._linkedMesh = mesh;\r\n this._host._linkedControls.push(this);\r\n }\r\n\r\n /**\r\n * Shorthand function to set the top, right, bottom, and left padding values on the control.\r\n * @param { string | number} paddingTop - The value of the top padding.\r\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\r\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\r\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTop = top;\r\n this.paddingRight = right;\r\n this.paddingBottom = bottom;\r\n this.paddingLeft = left;\r\n }\r\n\r\n /**\r\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\r\n * @param { number} paddingTop - The value in pixels of the top padding.\r\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\r\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\r\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTopInPixels = top;\r\n this.paddingRightInPixels = right;\r\n this.paddingBottomInPixels = bottom;\r\n this.paddingLeftInPixels = left;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\r\n const oldLeft = this._left.getValue(this._host);\r\n const oldTop = this._top.getValue(this._host);\r\n\r\n const parentMeasure = this.parent?._currentMeasure;\r\n if (parentMeasure) {\r\n this._processMeasures(parentMeasure, this._host.getContext());\r\n }\r\n\r\n let newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\r\n let newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\r\n\r\n const leftAndTopIgnoreAdaptiveScaling = this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling;\r\n if (leftAndTopIgnoreAdaptiveScaling) {\r\n if (Math.abs(newLeft - oldLeft) < 0.5) {\r\n newLeft = oldLeft;\r\n }\r\n\r\n if (Math.abs(newTop - oldTop) < 0.5) {\r\n newTop = oldTop;\r\n }\r\n }\r\n\r\n if (!leftAndTopIgnoreAdaptiveScaling && oldLeft === newLeft && oldTop === newTop) {\r\n return;\r\n }\r\n\r\n this.left = newLeft + \"px\";\r\n this.top = newTop + \"px\";\r\n\r\n this._left.ignoreAdaptiveScaling = true;\r\n this._top.ignoreAdaptiveScaling = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetLeft(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.left += offset;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetTop(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.top += offset;\r\n }\r\n\r\n /** @internal */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @internal */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _intersectsRect(rect: Measure, context?: ICanvasRenderingContext) {\r\n // make sure we are transformed correctly before checking intersections. no-op if nothing is dirty.\r\n this._transform(context);\r\n if (this._evaluatedMeasure.left >= rect.left + rect.width) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top >= rect.top + rect.height) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width <= rect.left) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height <= rect.top) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public invalidateRect() {\r\n this._transform();\r\n if (this.host && this.host.useInvalidateRectOptimization) {\r\n // Rotate by transform to get the measure transformed to global space\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\r\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\r\n // the previous measure is used to properly clear a control that is scaled down\r\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\r\n\r\n // Expand rect based on shadows\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n const offsetX = this._computeAdditionalOffsetX();\r\n const offsetY = this._computeAdditionalOffsetY();\r\n\r\n this.host.invalidateRect(\r\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\r\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\r\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\r\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markAsDirty(force = false): void {\r\n if (!this._isVisible && !force) {\r\n return;\r\n }\r\n\r\n this._isDirty = true;\r\n this._markMatrixAsDirty();\r\n\r\n // Redraw only this rectangle\r\n if (this._host) {\r\n this._host.markAsDirty();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _markAllAsDirty(): void {\r\n this._markAsDirty();\r\n\r\n if (this._font) {\r\n this._prepareFont();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _link(host: AdvancedDynamicTexture): void {\r\n this._host = host;\r\n if (this._host) {\r\n this.uniqueId = this._host.getScene()!.getUniqueId();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _transform(context?: ICanvasRenderingContext): void {\r\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\r\n return;\r\n }\r\n\r\n // postTranslate\r\n const offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\r\n const offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\r\n if (context) {\r\n context.translate(offsetX, offsetY);\r\n\r\n // rotate\r\n context.rotate(this._rotation);\r\n\r\n // scale\r\n context.scale(this._scaleX, this._scaleY);\r\n\r\n // preTranslate\r\n context.translate(-offsetX, -offsetY);\r\n }\r\n // Need to update matrices?\r\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\r\n this._cachedOffsetX = offsetX;\r\n this._cachedOffsetY = offsetY;\r\n this._isMatrixDirty = false;\r\n this._flagDescendantsAsMatrixDirty();\r\n\r\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\r\n\r\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlight(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n context.save();\r\n context.strokeStyle = this._highlightColor;\r\n context.lineWidth = this._highlightLineWidth;\r\n\r\n this._renderHighlightSpecific(context);\r\n context.restore();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n protected _getColor(context: ICanvasRenderingContext): string | ICanvasGradient {\r\n return this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n if (this._isFontSizeInPercentage) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._host && this._host.useSmallestIdeal && !this._font) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._fontSet) {\r\n this._prepareFont();\r\n this._fontSet = false;\r\n }\r\n\r\n if (this._font) {\r\n context.font = this._font;\r\n }\r\n\r\n if (this._color || this.gradient) {\r\n context.fillStyle = this._getColor(context);\r\n }\r\n\r\n if (Control.AllowAlphaInheritance) {\r\n context.globalAlpha *= this._alpha;\r\n } else if (this._alphaSet) {\r\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n this.host._numLayoutCalls++;\r\n\r\n this._currentMeasure.addAndTransformToRef(\r\n this._transformMatrix,\r\n -this._paddingLeftInPixels | 0,\r\n -this._paddingTopInPixels | 0,\r\n this._paddingRightInPixels | 0,\r\n this._paddingBottomInPixels | 0,\r\n this._prevCurrentMeasureTransformedIntoGlobalSpace\r\n );\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n let rebuildCount = 0;\r\n do {\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < 3);\r\n\r\n if (rebuildCount >= 3) {\r\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n this.invalidateRect();\r\n this._evaluateClippingState(parentMeasure);\r\n }\r\n\r\n this._wasDirty = this._isDirty;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n this._tempPaddingMeasure.copyFrom(parentMeasure);\r\n\r\n // Apply padding if in correct mode\r\n if (this.parent && this.parent.descendantsOnlyPadding) {\r\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\r\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\r\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\r\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\r\n }\r\n\r\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n // Let children take some pre-measurement actions\r\n this._preMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._measure();\r\n\r\n // Let children take some post-measurement actions\r\n this._postMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Convert to int values\r\n this._currentMeasure.left = this._currentMeasure.left | 0;\r\n this._currentMeasure.top = this._currentMeasure.top | 0;\r\n this._currentMeasure.width = this._currentMeasure.width | 0;\r\n this._currentMeasure.height = this._currentMeasure.height | 0;\r\n\r\n // Let children add more features\r\n this._additionalProcessing(this._tempPaddingMeasure, context);\r\n\r\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.onDirtyObservable.hasObservers()) {\r\n this.onDirtyObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n protected _evaluateClippingState(parentMeasure: Measure) {\r\n // Since transformMatrix is used here, we need to have it freshly computed\r\n this._transform();\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.parent && this.parent.clipChildren) {\r\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\r\n // Early clip\r\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n }\r\n\r\n this._isClipped = false;\r\n }\r\n\r\n /** @internal */\r\n public _measure(): void {\r\n // Width / Height\r\n if (this._width.isPixel) {\r\n this._currentMeasure.width = this._width.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width *= this._width.getValue(this._host);\r\n }\r\n\r\n if (this._height.isPixel) {\r\n this._currentMeasure.height = this._height.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height *= this._height.getValue(this._host);\r\n }\r\n\r\n if (this._fixedRatio !== 0) {\r\n if (this._fixedRatioMasterIsWidth) {\r\n this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio;\r\n } else {\r\n this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n const parentWidth = parentMeasure.width;\r\n const parentHeight = parentMeasure.height;\r\n\r\n // Left / top\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (this.horizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = parentWidth - width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (parentWidth - width) / 2;\r\n break;\r\n }\r\n\r\n switch (this.verticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n y = 0;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n y = parentHeight - height;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n y = (parentHeight - height) / 2;\r\n break;\r\n }\r\n\r\n if (!this.descendantsOnlyPadding) {\r\n if (this._paddingLeft.isPixel) {\r\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\r\n }\r\n\r\n if (this._paddingRight.isPixel) {\r\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\r\n }\r\n\r\n if (this._paddingTop.isPixel) {\r\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\r\n }\r\n\r\n if (this._paddingBottom.isPixel) {\r\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\r\n }\r\n }\r\n\r\n if (this._left.isPixel) {\r\n this._currentMeasure.left += this._left.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\r\n }\r\n\r\n if (this._top.isPixel) {\r\n this._currentMeasure.top += this._top.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\r\n }\r\n\r\n this._currentMeasure.left += x;\r\n this._currentMeasure.top += y;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _postMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _clipForChildren(context: ICanvasRenderingContext): void {\r\n // DO nothing\r\n }\r\n\r\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\r\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\r\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\r\n context.beginPath();\r\n Control._ClipMeasure.copyFrom(this._currentMeasure);\r\n if (invalidatedRectangle) {\r\n // Rotate the invalidated rect into the control's space\r\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\r\n\r\n // Get the intersection of the rect in context space and the current context\r\n const intersection = new Measure(0, 0, 0, 0);\r\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\r\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\r\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\r\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\r\n Control._ClipMeasure.copyFrom(intersection);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n const shadowOffsetX = this.shadowOffsetX;\r\n const shadowOffsetY = this.shadowOffsetY;\r\n const shadowBlur = this.shadowBlur;\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n context.rect(\r\n Control._ClipMeasure.left + leftShadowOffset,\r\n Control._ClipMeasure.top + topShadowOffset,\r\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\r\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\r\n );\r\n } else {\r\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\r\n }\r\n\r\n context.clip();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\r\n if (!this.isVisible || this.notRenderable || this._isClipped) {\r\n this._isDirty = false;\r\n return false;\r\n }\r\n\r\n this.host._numRenderCalls++;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Transform\r\n this._transform(context);\r\n\r\n // Clip\r\n if (this.clipContent) {\r\n this._clip(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.onBeforeDrawObservable.hasObservers()) {\r\n this.onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\r\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\r\n } else {\r\n this._draw(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.useBitmapCache && this._wasDirty) {\r\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n this._renderHighlight(context);\r\n\r\n if (this.onAfterDrawObservable.hasObservers()) {\r\n this.onAfterDrawObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public contains(x: number, y: number): boolean {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n // Check\r\n if (x < this._currentMeasure.left) {\r\n return false;\r\n }\r\n\r\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\r\n return false;\r\n }\r\n\r\n if (y < this._currentMeasure.top) {\r\n return false;\r\n }\r\n\r\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\r\n return false;\r\n }\r\n\r\n if (this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\r\n return false;\r\n }\r\n\r\n if (!this.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: Nullable<PointerInfoBase>): void {\r\n const canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (this._enterCount > 0) {\r\n return false;\r\n }\r\n\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n this._enterCount++;\r\n\r\n const canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && !this._isEnabled) {\r\n return;\r\n }\r\n this._enterCount = 0;\r\n\r\n let canNotify: boolean = true;\r\n\r\n if (!target.isAscendant(this)) {\r\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\r\n }\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: Nullable<PointerInfoBase>): boolean {\r\n // Prevent pointerout to lose control context.\r\n // Event redundancy is checked inside the function.\r\n this._onPointerEnter(this, pi);\r\n\r\n if (this.tabIndex !== -1) {\r\n this.host.focusedControl = this;\r\n }\r\n\r\n if (this._downCount !== 0) {\r\n return false;\r\n }\r\n\r\n this._downCount++;\r\n\r\n this._downPointerIds[pointerId] = true;\r\n\r\n const canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.add((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: Nullable<PointerInfoBase>): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._downCount = 0;\r\n\r\n delete this._downPointerIds[pointerId];\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n if (!this._host.usePointerTapForClickEvent) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.delete((pi.event as IPointerEvent).pointerId);\r\n }\r\n }\r\n\r\n public _onPointerPick(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._host.usePointerTapForClickEvent) {\r\n return false;\r\n }\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerPick(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector2.Zero(), +key as number, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n const canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\r\n\r\n if (canNotify && this.parent != null) {\r\n this.parent._onWheelScroll(deltaX, deltaY);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(\r\n type: number,\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._dummyVector2.copyFromFloats(x, y);\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this, pi);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this, pi);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\r\n this._host._registerLastControlDown(this, pointerId);\r\n this._host._lastPickedControl = this;\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERUP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n if (!this._host.usePointerTapForClickEvent) {\r\n delete this._host._lastControlDown[pointerId];\r\n }\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERWHEEL) {\r\n if (this._host._lastControlOver[pointerId]) {\r\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\r\n return true;\r\n }\r\n } else if (type === PointerEventTypes.POINTERTAP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerPick(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getStyleProperty(propName: \"fontStyle\" | \"fontWeight\" | \"fontFamily\", defaultValue: string): string {\r\n const prop = (this._style && this._style[propName]) ?? this[propName];\r\n if (!prop && this.parent) {\r\n return this.parent._getStyleProperty(propName, defaultValue);\r\n } else if (!this.parent) {\r\n return defaultValue;\r\n } else {\r\n return prop;\r\n }\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n this._font =\r\n this._getStyleProperty(\"fontStyle\", \"\") +\r\n \" \" +\r\n this._getStyleProperty(\"fontWeight\", \"\") +\r\n \" \" +\r\n this.fontSizeInPixels +\r\n \"px \" +\r\n this._getStyleProperty(\"fontFamily\", \"Arial\");\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font, this._host?.getScene()?.getEngine());\r\n\r\n //children need to be refreshed\r\n this.getDescendants().forEach((child) => child._markAllAsDirty());\r\n }\r\n\r\n /**\r\n * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.\r\n * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.\r\n * @param dim the dimension to check (width or height)\r\n * @returns if the dimension is fully defined\r\n */\r\n public isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n return this.getDimension(dim).isPixel;\r\n }\r\n\r\n /**\r\n * Gets the dimension of the control along a specified axis\r\n * @param dim the dimension to retrieve (width or height)\r\n * @returns the dimension value along the specified axis\r\n */\r\n public getDimension(dim: \"width\" | \"height\"): ValueAndUnit {\r\n if (dim === \"width\") {\r\n return this._width;\r\n } else {\r\n return this._height;\r\n }\r\n }\r\n\r\n /**\r\n * Clones a control and its descendants\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @returns the cloned control\r\n */\r\n public clone(host?: AdvancedDynamicTexture): Control {\r\n const serialization: any = {};\r\n this.serialize(serialization, true);\r\n\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serialization.className);\r\n const cloned = new controlType();\r\n cloned.parse(serialization, host);\r\n\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Parses a serialized object into this control\r\n * @param serializedObject the object with the serialized properties\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns this control\r\n */\r\n public parse(serializedObject: any, host?: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n this._urlRewriter = urlRewriter;\r\n SerializationHelper.Parse(() => this, serializedObject, null);\r\n\r\n this.name = serializedObject.name;\r\n\r\n this._parseFromContent(serializedObject, host ?? this._host);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n // Call prepareFont to guarantee the font is properly set before serializing\r\n if (allowCanvas) {\r\n this._prepareFont();\r\n }\r\n if (this._fontFamily) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n }\r\n if (this.fontSize) {\r\n serializationObject.fontSize = this.fontSize;\r\n }\r\n if (this.fontWeight) {\r\n serializationObject.fontWeight = this.fontWeight;\r\n }\r\n if (this.fontStyle) {\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n\r\n if (this._gradient) {\r\n serializationObject.gradient = {};\r\n this._gradient.serialize(serializationObject.gradient);\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n if (serializedObject.fontFamily) {\r\n this.fontFamily = serializedObject.fontFamily;\r\n }\r\n\r\n if (serializedObject.fontSize) {\r\n this.fontSize = serializedObject.fontSize;\r\n }\r\n\r\n if (serializedObject.fontWeight) {\r\n this.fontWeight = serializedObject.fontWeight;\r\n }\r\n\r\n if (serializedObject.fontStyle) {\r\n this.fontStyle = serializedObject.fontStyle;\r\n }\r\n\r\n // Gradient\r\n if (serializedObject.gradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.gradient.className);\r\n this._gradient = new className();\r\n this._gradient?.parse(serializedObject.gradient);\r\n }\r\n\r\n // Animations\r\n if (serializedObject.animations) {\r\n this.animations = [];\r\n for (let animationIndex = 0; animationIndex < serializedObject.animations.length; animationIndex++) {\r\n const parsedAnimation = serializedObject.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n this.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n\r\n if (serializedObject.autoAnimate && this._host && this._host.getScene()) {\r\n this._host\r\n .getScene()!\r\n .beginAnimation(\r\n this,\r\n serializedObject.autoAnimateFrom,\r\n serializedObject.autoAnimateTo,\r\n serializedObject.autoAnimateLoop,\r\n serializedObject.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n\r\n this.fixedRatioMasterIsWidth = serializedObject.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;\r\n }\r\n\r\n /** Releases associated resources */\r\n public dispose() {\r\n this.onDirtyObservable.clear();\r\n this.onBeforeDrawObservable.clear();\r\n this.onAfterDrawObservable.clear();\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n this.onWheelObservable.clear();\r\n\r\n // focus\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n\r\n if (this._styleObserver && this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n if (this.parent) {\r\n this.parent.removeControl(this);\r\n this.parent = null;\r\n }\r\n\r\n if (this._host) {\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index > -1) {\r\n this.linkWithMesh(null);\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n // Statics\r\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\r\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\r\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\r\n\r\n private static _VERTICAL_ALIGNMENT_TOP = 0;\r\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\r\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\r\n\r\n /** HORIZONTAL_ALIGNMENT_LEFT */\r\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_RIGHT */\r\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_CENTER */\r\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_TOP */\r\n public static get VERTICAL_ALIGNMENT_TOP(): number {\r\n return Control._VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_BOTTOM */\r\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\r\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_CENTER */\r\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\r\n return Control._VERTICAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetFontOffset(font: string, engineToUse?: AbstractEngine): { ascent: number; height: number; descent: number } {\r\n if (Control._FontHeightSizes[font]) {\r\n return Control._FontHeightSizes[font];\r\n }\r\n\r\n const engine = engineToUse || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n\r\n const result = engine.getFontOffset(font);\r\n Control._FontHeightSizes[font] = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a Control from parsed data\r\n * @param serializedObject defines parsed data\r\n * @param host defines the hosting AdvancedDynamicTexture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(\r\n () => {\r\n const newControl = new controlType() as Control;\r\n newControl._urlRewriter = urlRewriter;\r\n return newControl;\r\n },\r\n serializedObject,\r\n null\r\n );\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host, urlRewriter);\r\n\r\n return control;\r\n }\r\n\r\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => {};\r\n\r\n /**\r\n * @internal\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: number, arc: number, context: ICanvasRenderingContext): void {\r\n context.translate(x, y);\r\n context.scale(width, height);\r\n\r\n context.beginPath();\r\n context.arc(0, 0, 1, 0, 2 * Math.PI * arc, arc < 0);\r\n\r\n if (arc >= 1) {\r\n context.closePath();\r\n }\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n\r\n /**\r\n * Returns true if the control is ready to be used\r\n * @returns\r\n */\r\n public isReady(): boolean {\r\n // Most controls are ready by default, so the default implementation is to return true\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n"]}
|