babylonjs-accessibility 5.36.0 → 5.38.0

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.
@@ -31244,91 +31244,130 @@ class HTMLTwinHostComponent extends react__WEBPACK_IMPORTED_MODULE_1__.Component
31244
31244
  constructor(props) {
31245
31245
  super(props);
31246
31246
  this._observersMap = new Map();
31247
- const a11yTreeItems = this._updateHTMLTwinItems();
31248
- this.state = {
31249
- a11yTreeItems: a11yTreeItems,
31250
- };
31251
- }
31252
- componentDidMount() {
31253
- const scene = this.props.scene;
31254
- // Find all a11y entities in the scene, assemble the a11y forest (a11yTreeItems), and update React state to let React update DOM.
31255
- const updateA11yTree = () => {
31256
- const a11yTreeItems = this._updateHTMLTwinItems();
31257
- this.setState({
31258
- a11yTreeItems: a11yTreeItems,
31259
- });
31260
- };
31261
- const addGUIObservers = (control) => {
31262
- // observe isVisible changed
31263
- if (!this._observersMap.has(control.onIsVisibleChangedObservable)) {
31264
- this._observersMap.set(control.onIsVisibleChangedObservable, control.onIsVisibleChangedObservable.add(updateA11yTree));
31265
- }
31266
- if (!this._observersMap.has(control.onAccessibilityTagChangedObservable)) {
31267
- this._observersMap.set(control.onAccessibilityTagChangedObservable, control.onAccessibilityTagChangedObservable.add(updateA11yTree));
31268
- }
31269
- if (control instanceof gui_2D_advancedDynamicTexture__WEBPACK_IMPORTED_MODULE_6__.Container) {
31270
- const container = control;
31271
- // observe add control and deal with new controls
31272
- if (!this._observersMap.has(container.onControlAddedObservable)) {
31273
- this._observersMap.set(container.onControlAddedObservable, container.onControlAddedObservable.add((newControl) => {
31274
- if (newControl) {
31275
- // deal with the new added control
31276
- addGUIObservers(newControl);
31277
- }
31278
- updateA11yTree();
31279
- }));
31247
+ /**
31248
+ * Adds observables to update the tree if any of the scene's nodes or GUI controls change.
31249
+ */
31250
+ this._addSceneObservers = () => {
31251
+ const scene = this.props.scene;
31252
+ // Find all a11y entities in the scene, assemble the a11y forest (a11yTreeItems), and update React state to let React update DOM.
31253
+ const updateA11yTree = () => {
31254
+ this._updateHTMLTwinItems();
31255
+ };
31256
+ const addGUIObservers = (control) => {
31257
+ // observe isVisible changed
31258
+ if (!this._observersMap.has(control.onIsVisibleChangedObservable)) {
31259
+ this._observersMap.set(control.onIsVisibleChangedObservable, control.onIsVisibleChangedObservable.add(updateA11yTree));
31260
+ }
31261
+ if (!this._observersMap.has(control.onAccessibilityTagChangedObservable)) {
31262
+ this._observersMap.set(control.onAccessibilityTagChangedObservable, control.onAccessibilityTagChangedObservable.add(updateA11yTree));
31263
+ }
31264
+ if (control instanceof gui_2D_advancedDynamicTexture__WEBPACK_IMPORTED_MODULE_6__.Container) {
31265
+ const container = control;
31266
+ // observe add control and deal with new controls
31267
+ if (!this._observersMap.has(container.onControlAddedObservable)) {
31268
+ this._observersMap.set(container.onControlAddedObservable, container.onControlAddedObservable.add((newControl) => {
31269
+ if (newControl) {
31270
+ // deal with the new added control
31271
+ addGUIObservers(newControl);
31272
+ }
31273
+ updateA11yTree();
31274
+ }));
31275
+ }
31276
+ // observe remove control
31277
+ if (!this._observersMap.has(container.onControlRemovedObservable)) {
31278
+ this._observersMap.set(container.onControlRemovedObservable, container.onControlRemovedObservable.add((removedControl) => {
31279
+ updateA11yTree();
31280
+ }));
31281
+ }
31282
+ // deal with children
31283
+ control._children.forEach((child) => {
31284
+ addGUIObservers(child);
31285
+ });
31280
31286
  }
31281
- // observe remove control
31282
- if (!this._observersMap.has(container.onControlRemovedObservable)) {
31283
- this._observersMap.set(container.onControlRemovedObservable, container.onControlRemovedObservable.add((removedControl) => {
31284
- updateA11yTree();
31285
- }));
31287
+ };
31288
+ const addNodeObservers = (node) => {
31289
+ if (!this._observersMap.has(node.onEnabledStateChangedObservable)) {
31290
+ this._observersMap.set(node.onEnabledStateChangedObservable, node.onEnabledStateChangedObservable.add(updateA11yTree));
31286
31291
  }
31287
- // deal with children
31288
- control._children.forEach((child) => {
31289
- addGUIObservers(child);
31292
+ if (!this._observersMap.has(node.onAccessibilityTagChangedObservable)) {
31293
+ this._observersMap.set(node.onAccessibilityTagChangedObservable, node.onAccessibilityTagChangedObservable.add(updateA11yTree));
31294
+ }
31295
+ // If the node has GUI, add observer to the controls
31296
+ if (this._isMeshGUI(node)) {
31297
+ const curMesh = node;
31298
+ const adt = curMesh.material?.getActiveTextures()[0];
31299
+ const guiRoot = adt.getChildren();
31300
+ guiRoot.forEach((control) => addGUIObservers(control));
31301
+ }
31302
+ };
31303
+ const _updateAndAddNode = (node) => {
31304
+ updateA11yTree();
31305
+ addNodeObservers(node);
31306
+ };
31307
+ const _updateAndAddTexture = (texture) => {
31308
+ updateA11yTree();
31309
+ texture.getChildren().forEach((control) => {
31310
+ addGUIObservers(control);
31290
31311
  });
31312
+ };
31313
+ // observe add node and deal with new nodes
31314
+ if (!this._observersMap.has(scene.onNewMeshAddedObservable)) {
31315
+ this._observersMap.set(scene.onNewMeshAddedObservable, scene.onNewMeshAddedObservable.add(_updateAndAddNode));
31291
31316
  }
31292
- };
31293
- const addNodeObservers = (node) => {
31294
- if (!this._observersMap.has(node.onEnabledStateChangedObservable)) {
31295
- this._observersMap.set(node.onEnabledStateChangedObservable, node.onEnabledStateChangedObservable.add(updateA11yTree));
31317
+ if (!this._observersMap.has(scene.onNewTransformNodeAddedObservable)) {
31318
+ this._observersMap.set(scene.onNewTransformNodeAddedObservable, scene.onNewTransformNodeAddedObservable.add(_updateAndAddNode));
31296
31319
  }
31297
- if (!this._observersMap.has(node.onAccessibilityTagChangedObservable)) {
31298
- this._observersMap.set(node.onAccessibilityTagChangedObservable, node.onAccessibilityTagChangedObservable.add(updateA11yTree));
31320
+ if (!this._observersMap.has(scene.onNewTextureAddedObservable)) {
31321
+ this._observersMap.set(scene.onNewTextureAddedObservable, scene.onNewTextureAddedObservable.add((newTexture) => {
31322
+ if (this._isFullscreenGUI(newTexture)) {
31323
+ setTimeout(() => {
31324
+ if (newTexture.isReady()) {
31325
+ _updateAndAddTexture(newTexture);
31326
+ }
31327
+ else {
31328
+ newTexture.onLoadObservable.addOnce(() => {
31329
+ _updateAndAddTexture(newTexture);
31330
+ });
31331
+ }
31332
+ });
31333
+ }
31334
+ }));
31299
31335
  }
31300
- // If the node has GUI, add observer to the controls
31301
- if (this._isGUI(node)) {
31302
- const curMesh = node;
31303
- const adt = curMesh.material?.getActiveTextures()[0];
31304
- const guiRoot = adt.getChildren();
31305
- guiRoot.forEach((control) => addGUIObservers(control));
31336
+ // observe remove node
31337
+ if (!this._observersMap.has(scene.onMeshRemovedObservable)) {
31338
+ this._observersMap.set(scene.onMeshRemovedObservable, scene.onMeshRemovedObservable.add(updateA11yTree));
31339
+ }
31340
+ if (!this._observersMap.has(scene.onTransformNodeRemovedObservable)) {
31341
+ this._observersMap.set(scene.onTransformNodeRemovedObservable, scene.onTransformNodeRemovedObservable.add(updateA11yTree));
31342
+ }
31343
+ if (!this._observersMap.has(scene.onTextureRemovedObservable)) {
31344
+ this._observersMap.set(scene.onTextureRemovedObservable, scene.onTextureRemovedObservable.add(updateA11yTree));
31306
31345
  }
31346
+ // observe node enabled changed
31347
+ scene.getNodes().forEach((node) => {
31348
+ addNodeObservers(node);
31349
+ });
31350
+ scene.textures.forEach((texture) => {
31351
+ if (this._isFullscreenGUI(texture)) {
31352
+ texture.getChildren().forEach((control) => {
31353
+ addGUIObservers(control);
31354
+ });
31355
+ }
31356
+ });
31307
31357
  };
31308
- // observe add node and deal with new nodes
31309
- if (!this._observersMap.has(scene.onNewMeshAddedObservable)) {
31310
- this._observersMap.set(scene.onNewMeshAddedObservable, scene.onNewMeshAddedObservable.add((newNode) => {
31311
- updateA11yTree();
31312
- addNodeObservers(newNode);
31313
- }));
31314
- }
31315
- if (!this._observersMap.has(scene.onNewTransformNodeAddedObservable)) {
31316
- this._observersMap.set(scene.onNewTransformNodeAddedObservable, scene.onNewTransformNodeAddedObservable.add((newNode) => {
31317
- updateA11yTree();
31318
- addNodeObservers(newNode);
31319
- }));
31320
- }
31321
- // observe remove node
31322
- if (!this._observersMap.has(scene.onMeshRemovedObservable)) {
31323
- this._observersMap.set(scene.onMeshRemovedObservable, scene.onMeshRemovedObservable.add(updateA11yTree));
31324
- }
31325
- if (!this._observersMap.has(scene.onTransformNodeRemovedObservable)) {
31326
- this._observersMap.set(scene.onTransformNodeRemovedObservable, scene.onTransformNodeRemovedObservable.add(updateA11yTree));
31358
+ this.state = { a11yTreeItems: [] };
31359
+ }
31360
+ componentDidUpdate(prevProps, prevState, snapshot) {
31361
+ // If we changed scenes, we have to re-attach observers to the new scene.
31362
+ if (prevProps.scene !== this.props.scene) {
31363
+ this._observersMap.clear();
31364
+ this._addSceneObservers();
31365
+ this._updateHTMLTwinItems();
31327
31366
  }
31328
- // observe node enabled changed
31329
- scene.getNodes().forEach((node) => {
31330
- addNodeObservers(node);
31331
- });
31367
+ }
31368
+ componentDidMount() {
31369
+ this._addSceneObservers();
31370
+ this._updateHTMLTwinItems();
31332
31371
  }
31333
31372
  componentWillUnmount() {
31334
31373
  this._observersMap.forEach((observer, observable) => {
@@ -31351,7 +31390,20 @@ class HTMLTwinHostComponent extends react__WEBPACK_IMPORTED_MODULE_1__.Component
31351
31390
  }
31352
31391
  }
31353
31392
  const a11yTreeItems = this._getHTMLTwinItemsFromNodes(rootNodes);
31354
- return a11yTreeItems;
31393
+ // Get GUI twin tree nodes
31394
+ const guiRootNodes = [];
31395
+ for (const texture of this.props.scene.textures) {
31396
+ if (this._isFullscreenGUI(texture) && texture.isReady()) {
31397
+ guiRootNodes.push(texture.rootContainer);
31398
+ }
31399
+ }
31400
+ const a11yGuiTreeItems = this._getHTMLTwinItemsFromGUI(guiRootNodes);
31401
+ for (const guiItem of a11yGuiTreeItems) {
31402
+ a11yTreeItems.push(guiItem);
31403
+ }
31404
+ this.setState({
31405
+ a11yTreeItems,
31406
+ });
31355
31407
  }
31356
31408
  _getHTMLTwinItemsFromNodes(rootItems) {
31357
31409
  if (!rootItems || rootItems.length === 0) {
@@ -31364,7 +31416,7 @@ class HTMLTwinHostComponent extends react__WEBPACK_IMPORTED_MODULE_1__.Component
31364
31416
  if (!curNode.isEnabled()) {
31365
31417
  continue;
31366
31418
  }
31367
- if (this._isGUI(curNode)) {
31419
+ if (this._isMeshGUI(curNode)) {
31368
31420
  // if node texture is GUI, add that as a a11y GUI item (renders differently)
31369
31421
  const curMesh = curNode;
31370
31422
  const adt = curMesh.material?.getActiveTextures()[0];
@@ -31401,7 +31453,10 @@ class HTMLTwinHostComponent extends react__WEBPACK_IMPORTED_MODULE_1__.Component
31401
31453
  }
31402
31454
  return result;
31403
31455
  }
31404
- _isGUI(node) {
31456
+ _isFullscreenGUI(texture) {
31457
+ return texture.getClassName() === "AdvancedDynamicTexture" && !!(texture.layer && !texture.layer.isBackground);
31458
+ }
31459
+ _isMeshGUI(node) {
31405
31460
  let isGUI = false;
31406
31461
  if (node instanceof core_Meshes_abstractMesh__WEBPACK_IMPORTED_MODULE_5__.AbstractMesh) {
31407
31462
  const curMesh = node;