@babylonjs/gui 7.12.0 → 7.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,6 @@ import { Layer } from "@babylonjs/core/Layers/layer.js";
10
10
  import type { Scene } from "@babylonjs/core/scene.js";
11
11
  import { Container } from "./controls/container";
12
12
  import { Control } from "./controls/control";
13
- import type { IFocusableControl } from "./controls/focusableControl";
14
13
  import { Style } from "./style";
15
14
  import { Viewport } from "@babylonjs/core/Maths/math.viewport.js";
16
15
  /**
@@ -121,6 +120,11 @@ export declare class AdvancedDynamicTexture extends DynamicTexture {
121
120
  * Gets or sets a boolean indicating that the canvas must be reverted on Y when updating the texture
122
121
  */
123
122
  applyYInversionOnUpdate: boolean;
123
+ /**
124
+ * A boolean indicating whether or not the elements can be navigated to using the tab key.
125
+ * Defaults to false.
126
+ */
127
+ disableTabNavigation: boolean;
124
128
  /**
125
129
  * Gets or sets a number used to scale rendering size (2 means that the texture will be twice bigger).
126
130
  * Useful when you want more antialiasing
@@ -198,8 +202,8 @@ export declare class AdvancedDynamicTexture extends DynamicTexture {
198
202
  /**
199
203
  * Gets or sets the current focused control
200
204
  */
201
- get focusedControl(): Nullable<IFocusableControl>;
202
- set focusedControl(control: Nullable<IFocusableControl>);
205
+ get focusedControl(): Nullable<Control>;
206
+ set focusedControl(control: Nullable<Control>);
203
207
  /**
204
208
  * Gets or sets a boolean indicating if the texture must be rendered in background or foreground when in fullscreen mode
205
209
  */
@@ -344,6 +348,7 @@ export declare class AdvancedDynamicTexture extends DynamicTexture {
344
348
  private _translateToPicking;
345
349
  /** Attach to all scene events required to support pointer events */
346
350
  attach(): void;
351
+ private _focusNextElement;
347
352
  /**
348
353
  * @internal
349
354
  */
@@ -380,7 +385,7 @@ export declare class AdvancedDynamicTexture extends DynamicTexture {
380
385
  * Move the focus to a specific control
381
386
  * @param control defines the control which will receive the focus
382
387
  */
383
- moveFocusToControl(control: IFocusableControl): void;
388
+ moveFocusToControl(control: Control): void;
384
389
  private _manageFocus;
385
390
  private _attachPickingToSceneRender;
386
391
  private _attachToOnPointerOut;
@@ -316,6 +316,11 @@ export class AdvancedDynamicTexture extends DynamicTexture {
316
316
  * Gets or sets a boolean indicating that the canvas must be reverted on Y when updating the texture
317
317
  */
318
318
  this.applyYInversionOnUpdate = true;
319
+ /**
320
+ * A boolean indicating whether or not the elements can be navigated to using the tab key.
321
+ * Defaults to false.
322
+ */
323
+ this.disableTabNavigation = false;
319
324
  /**
320
325
  * If this is set, even when a control is pointer blocker, some events can still be passed through to the scene.
321
326
  * Options from values are PointerEventTypes
@@ -387,6 +392,12 @@ export class AdvancedDynamicTexture extends DynamicTexture {
387
392
  }
388
393
  });
389
394
  this._preKeyboardObserver = scene.onPreKeyboardObservable.add((info) => {
395
+ // check if tab is pressed
396
+ if (!this.disableTabNavigation && info.type === KeyboardEventTypes.KEYDOWN && info.event.code === "Tab") {
397
+ this._focusNextElement(!info.event.shiftKey);
398
+ info.event.preventDefault();
399
+ return;
400
+ }
390
401
  if (!this._focusedControl) {
391
402
  return;
392
403
  }
@@ -923,6 +934,39 @@ export class AdvancedDynamicTexture extends DynamicTexture {
923
934
  this._attachToOnPointerOut(scene);
924
935
  this._attachToOnBlur(scene);
925
936
  }
937
+ _focusNextElement(forward = true) {
938
+ // generate the order of tab-able controls
939
+ const sortedTabbableControls = [];
940
+ this.executeOnAllControls((control) => {
941
+ if (control.isFocusInvisible || !control.isVisible || control.tabIndex < 0) {
942
+ return;
943
+ }
944
+ sortedTabbableControls.push(control);
945
+ });
946
+ // if no control is tab-able, return
947
+ if (sortedTabbableControls.length === 0) {
948
+ return;
949
+ }
950
+ sortedTabbableControls.sort((a, b) => {
951
+ // if tabIndex is 0, put it in the end of the list, otherwise sort by tabIndex
952
+ return a.tabIndex === 0 ? 1 : b.tabIndex === 0 ? -1 : a.tabIndex - b.tabIndex;
953
+ });
954
+ // if no control is focused, focus the first one
955
+ if (!this._focusedControl) {
956
+ sortedTabbableControls[0].focus();
957
+ }
958
+ else {
959
+ const currentIndex = sortedTabbableControls.indexOf(this._focusedControl);
960
+ let nextIndex = currentIndex + (forward ? 1 : -1);
961
+ if (nextIndex < 0) {
962
+ nextIndex = sortedTabbableControls.length - 1;
963
+ }
964
+ else if (nextIndex >= sortedTabbableControls.length) {
965
+ nextIndex = 0;
966
+ }
967
+ sortedTabbableControls[nextIndex].focus();
968
+ }
969
+ }
926
970
  /**
927
971
  * Register the clipboard Events onto the canvas
928
972
  */