@shopware-ag/dive 1.15.3 → 1.15.4

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.
@@ -1,9 +1,10 @@
1
1
  import { type Object3D } from "three";
2
2
  import { DIVEScene } from "../../scene/Scene.ts";
3
3
  import DIVETransformTool from "../transform/TransformTool.ts";
4
+ import { findInterface } from "../../helper/findInterface/findInterface.ts";
4
5
  import type DIVEOrbitControls from "../../controls/OrbitControls.ts";
5
- import { type DIVESelectable, findSelectableInterface } from "../../interface/Selectable.ts";
6
- import { type DIVEMoveable } from "../../interface/Moveable.ts";
6
+ import { type DIVESelectable } from "../../interface/Selectable.ts";
7
+ import { type DIVEMovable } from "../../interface/Movable.ts";
7
8
  import { type DIVEBaseTool } from "../BaseTool.ts";
8
9
 
9
10
  export const isSelectTool = (tool: DIVEBaseTool): tool is DIVESelectTool => {
@@ -17,7 +18,7 @@ export interface DIVEObjectEventMap {
17
18
  /**
18
19
  * A Tool to select and move objects in the scene.
19
20
  *
20
- * Objects have to implement the DIVESelectable interface to be selectable and DIVEMoveable to be moveable.
21
+ * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.
21
22
  *
22
23
  * @module
23
24
  */
@@ -46,8 +47,8 @@ export class DIVESelectTool extends DIVETransformTool {
46
47
  }
47
48
 
48
49
  public AttachGizmo(selectable: DIVESelectable): void {
49
- if ('isMoveable' in selectable) {
50
- const movable = selectable as (Object3D & DIVESelectable & DIVEMoveable);
50
+ if ('isMovable' in selectable) {
51
+ const movable = selectable as (Object3D & DIVESelectable & DIVEMovable);
51
52
  this._gizmo.attach(movable);
52
53
  this.SetGizmoVisibility(movable.visible);
53
54
  }
@@ -61,7 +62,7 @@ export class DIVESelectTool extends DIVETransformTool {
61
62
  super.onClick(e);
62
63
 
63
64
  const first = this._raycaster.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];
64
- const selectable = findSelectableInterface(first?.object);
65
+ const selectable = findInterface<DIVESelectable>(first?.object, 'isSelectable');
65
66
 
66
67
  // if nothing is hit
67
68
  if (!first || !selectable) {
@@ -234,7 +234,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
234
234
  mock_intersectObjects.mockReturnValueOnce([{
235
235
  object: {
236
236
  isSelectable: true,
237
- isMoveable: true,
237
+ isMovable: true,
238
238
  onSelect: mock_onSelect,
239
239
  parent: {
240
240
  name: 'this is the test scene root!!!',
@@ -250,7 +250,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
250
250
  const selectTool = new DIVESelectTool(mockScene, mockController);
251
251
  const mock_onSelect = jest.fn();
252
252
  expect(() => selectTool.Select({ isSelectable: true })).not.toThrow();
253
- expect(() => selectTool.Select({ isMoveable: true, onSelect: mock_onSelect } as unknown as DIVESelectable)).not.toThrow();
253
+ expect(() => selectTool.Select({ isMovable: true, onSelect: mock_onSelect } as unknown as DIVESelectable)).not.toThrow();
254
254
  expect(mock_onSelect).toHaveBeenCalledTimes(1);
255
255
  });
256
256
 
@@ -258,7 +258,7 @@ describe('dive/toolbox/select/DIVESelectTool', () => {
258
258
  const selectTool = new DIVESelectTool(mockScene, mockController);
259
259
  const mock_onDeselect = jest.fn();
260
260
  expect(() => selectTool.Deselect({ isSelectable: true })).not.toThrow();
261
- expect(() => selectTool.Deselect({ isMoveable: true, onDeselect: mock_onDeselect } as unknown as DIVESelectable)).not.toThrow();
261
+ expect(() => selectTool.Deselect({ isMovable: true, onDeselect: mock_onDeselect } as unknown as DIVESelectable)).not.toThrow();
262
262
  expect(mock_onDeselect).toHaveBeenCalledTimes(1);
263
263
  });
264
264
 
@@ -2,7 +2,8 @@ import { DIVEBaseTool } from "../BaseTool.ts";
2
2
  import { DIVEScene } from "../../scene/Scene.ts";
3
3
  import DIVEOrbitControls from "../../controls/OrbitControls.ts";
4
4
  import { TransformControls } from "three/examples/jsm/Addons";
5
- import { type DIVEMoveable } from "../../interface/Moveable.ts";
5
+ import { type DIVEMovable } from "../../interface/Movable.ts";
6
+ import { implementsInterface } from "../../helper/isInterface/implementsInterface.ts";
6
7
 
7
8
  export const isTransformTool = (tool: DIVEBaseTool): tool is DIVETransformTool => {
8
9
  return (tool as DIVETransformTool).isTransformTool !== undefined;
@@ -15,7 +16,7 @@ export interface DIVEObjectEventMap {
15
16
  /**
16
17
  * A Tool to select and move objects in the scene.
17
18
  *
18
- * Objects have to implement the DIVESelectable interface to be selectable and DIVEMoveable to be moveable.
19
+ * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.
19
20
  *
20
21
  * @module
21
22
  */
@@ -32,19 +33,29 @@ export default class DIVETransformTool extends DIVEBaseTool {
32
33
  this._gizmo = new TransformControls(this._controller.object, this._controller.domElement);
33
34
  this._gizmo.mode = 'translate';
34
35
 
36
+ // happens when pointerDown event is called on gizmo
35
37
  this._gizmo.addEventListener('mouseDown', () => {
36
38
  controller.enabled = false;
39
+
40
+ if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
41
+ if (!this._gizmo.object.onMoveStart) return;
42
+ this._gizmo.object.onMoveStart();
43
+ });
44
+
45
+ // happens when pointerMove event is called on gizmo
46
+ this._gizmo.addEventListener('objectChange', () => {
47
+ if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
48
+ if (!this._gizmo.object.onMove) return;
49
+ this._gizmo.object.onMove();
37
50
  });
38
51
 
52
+ // happens when pointerUp event is called on gizmo
39
53
  this._gizmo.addEventListener('mouseUp', () => {
40
54
  controller.enabled = true;
41
- });
42
55
 
43
- this._gizmo.addEventListener('objectChange', () => {
44
- if (!this._gizmo.object) return;
45
- if (!('isMoveable' in this._gizmo.object)) return;
46
- if (!('onMove' in this._gizmo.object)) return;
47
- (this._gizmo.object as DIVEMoveable).onMove!();
56
+ if (!implementsInterface<DIVEMovable>(this._gizmo.object, 'isMovable')) return;
57
+ if (!this._gizmo.object.onMoveEnd) return;
58
+ this._gizmo.object.onMoveEnd();
48
59
  });
49
60
 
50
61
  scene.add(this._gizmo);
@@ -108,12 +108,14 @@ jest.mock('three/examples/jsm/Addons.js', () => {
108
108
  this.object = {};
109
109
  callback({ value: false });
110
110
  this.object = {
111
- isMoveable: true
111
+ isMovable: true
112
112
  };
113
113
  callback({ value: false });
114
114
  this.object = {
115
- isMoveable: true,
115
+ isMovable: true,
116
116
  onMove: jest.fn(),
117
+ onMoveStart: jest.fn(),
118
+ onMoveEnd: jest.fn(),
117
119
  };
118
120
  callback({ value: false });
119
121
  },
@@ -1,11 +0,0 @@
1
-
2
- /**
3
- * Interface for objects that can be moved in the scene.
4
- *
5
- * @module
6
- */
7
-
8
- export interface DIVEMoveable {
9
- isMoveable: true;
10
- onMove?: () => void;
11
- }
@@ -1,87 +0,0 @@
1
- import { type Object3D } from 'three';
2
- import * as Moveable_DEF from '../Moveable';
3
- import * as Rotatable_DEF from '../Rotatable';
4
- import * as Scalable_DEF from '../Scalable';
5
- import * as Selectable_DEF from '../Selectable';
6
- import * as Draggable_DEF from '../Draggable';
7
- import * as Hoverable_DEF from '../Hoverable';
8
-
9
- describe('interfaces', () => {
10
- it('should be defined', () => {
11
- expect(Moveable_DEF).toBeDefined();
12
- expect(Rotatable_DEF).toBeDefined();
13
- expect(Scalable_DEF).toBeDefined();
14
- expect(Selectable_DEF).toBeDefined();
15
- expect(Draggable_DEF).toBeDefined();
16
- expect(Hoverable_DEF).toBeDefined();
17
- });
18
-
19
- it('should identify Selectable', () => {
20
- const Selectable = { isSelectable: true };
21
- expect(Selectable_DEF.isSelectable(Selectable as unknown as Object3D)).toBe(true);
22
- });
23
-
24
- it('should find Selectable', () => {
25
- let Selectable = {
26
- isSelectable: true,
27
- } as unknown as Object3D & Selectable_DEF.DIVESelectable;
28
- expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(Selectable);
29
-
30
- let parent = {
31
- isSelectable: true,
32
- }
33
- Selectable = {
34
- parent: parent,
35
- } as unknown as Object3D & Selectable_DEF.DIVESelectable;
36
- expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(parent);
37
-
38
- Selectable = { isSelectable: true, parent: null } as unknown as Object3D & Selectable_DEF.DIVESelectable;
39
- expect(Selectable_DEF.findSelectableInterface(Selectable as unknown as Object3D)).toBe(undefined);
40
- });
41
-
42
- it('should identify Draggable', () => {
43
- const Draggable = { isDraggable: true };
44
- expect(Draggable_DEF.isDraggable(Draggable as unknown as Object3D)).toBe(true);
45
- });
46
-
47
- it('should find Draggable', () => {
48
- let Draggable = {
49
- isDraggable: true,
50
- } as unknown as Object3D & Draggable_DEF.DIVEDraggable;
51
- expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(Draggable);
52
-
53
- let parent = {
54
- isDraggable: true,
55
- }
56
- Draggable = {
57
- parent: parent,
58
- } as unknown as Object3D & Draggable_DEF.DIVEDraggable;
59
- expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(parent);
60
-
61
- Draggable = { isDraggable: true, parent: null } as unknown as Object3D & Draggable_DEF.DIVEDraggable;
62
- expect(Draggable_DEF.findDraggableInterface(Draggable as unknown as Object3D)).toBe(undefined);
63
- });
64
-
65
- it('should identify Hoverable', () => {
66
- const Hoverable = { isHoverable: true };
67
- expect(Hoverable_DEF.isHoverable(Hoverable as unknown as Object3D)).toBe(true);
68
- });
69
-
70
- it('should find Hoverable', () => {
71
- let Hoverable = {
72
- isHoverable: true,
73
- } as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
74
- expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(Hoverable);
75
-
76
- let parent = {
77
- isHoverable: true,
78
- }
79
- Hoverable = {
80
- parent: parent,
81
- } as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
82
- expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(parent);
83
-
84
- Hoverable = { isHoverable: true, parent: null } as unknown as Object3D & Hoverable_DEF.DIVEHoverable;
85
- expect(Hoverable_DEF.findHoverableInterface(Hoverable as unknown as Object3D)).toBe(undefined);
86
- });
87
- });