Pārlūkot izejas kodu

Improve the typings of AR Events

customisations
alemart 2 mēnešus atpakaļ
vecāks
revīzija
8e7f99690f

+ 1
- 1
src/core/session.ts Parādīt failu

93
  * A Session represents an intent to display AR content
93
  * A Session represents an intent to display AR content
94
  * and encapsulates the main loop (update-render cycle)
94
  * and encapsulates the main loop (update-render cycle)
95
  */
95
  */
96
-export class Session extends AREventTarget<SessionEventType>
96
+export class Session extends AREventTarget<SessionEvent>
97
 {
97
 {
98
     /** Number of active sessions */
98
     /** Number of active sessions */
99
     private static _count = 0;
99
     private static _count = 0;

+ 5
- 7
src/core/viewport.ts Parādīt failu

46
 type ViewportEventType = 'resize' | 'fullscreenchange';
46
 type ViewportEventType = 'resize' | 'fullscreenchange';
47
 
47
 
48
 /** An event emitted by a Viewport */
48
 /** An event emitted by a Viewport */
49
-class ViewportEvent extends AREvent<ViewportEventType> { }
50
-
51
-/** Viewport event target */
52
-class ViewportEventTarget extends AREventTarget<ViewportEventType> { }
49
+export class ViewportEvent extends AREvent<ViewportEventType> { }
53
 
50
 
54
 /** Viewport style (immersive mode) */
51
 /** Viewport style (immersive mode) */
55
-type ViewportStyle = 'best-fit' | 'stretch' | 'crop' | 'inline';
52
+export type ViewportStyle = 'best-fit' | 'stretch' | 'crop' | 'inline';
56
 
53
 
57
 
54
 
58
 
55
 
704
 
701
 
705
     /**
702
     /**
706
      * Called when the viewport receives a 'resize' event
703
      * Called when the viewport receives a 'resize' event
704
+     * @param event
707
      */
705
      */
708
-    private _onViewportResize(): void
706
+    private _onViewportResize(event: ViewportEvent): void
709
     {
707
     {
710
         const viewport = this._viewport;
708
         const viewport = this._viewport;
711
 
709
 
948
 /**
946
 /**
949
  * Viewport
947
  * Viewport
950
  */
948
  */
951
-export class Viewport extends ViewportEventTarget
949
+export class Viewport extends AREventTarget<ViewportEvent>
952
 {
950
 {
953
     /** Viewport resolution (controls the size of the drawing buffer of the foreground canvas) */
951
     /** Viewport resolution (controls the size of the drawing buffer of the foreground canvas) */
954
     private readonly _resolution: Resolution;
952
     private readonly _resolution: Resolution;

+ 1
- 1
src/trackers/image-tracker/image-tracker.ts Parādīt failu

119
 /**
119
 /**
120
  * The ImageTracker tracks an image (one at a time)
120
  * The ImageTracker tracks an image (one at a time)
121
  */
121
  */
122
-export class ImageTracker extends AREventTarget<ImageTrackerEventType> implements Tracker
122
+export class ImageTracker extends AREventTarget<ImageTrackerEvent> implements Tracker
123
 {
123
 {
124
     /** session */
124
     /** session */
125
     private _session: Nullable<Session>;
125
     private _session: Nullable<Session>;

+ 5
- 7
src/ui/fullscreen-button.ts Parādīt failu

20
  * A built-in fullscreen button introduced as a convenience
20
  * A built-in fullscreen button introduced as a convenience
21
  */
21
  */
22
 
22
 
23
-import { Viewport } from '../core/viewport';
23
+import { Viewport, ViewportEvent } from '../core/viewport';
24
 
24
 
25
 /** Button icon to be displayed when the fullscreen mode is disabled */
25
 /** Button icon to be displayed when the fullscreen mode is disabled */
26
 const BUTTON_ICON_OFF = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAbUlEQVRYR+2WOQ4AIAgE5f+PVhobDZANBZAsraAwXMoqFil+f9GBj8BW8dIiKt45at/XgShStHgvmfdekwAdIIEyAmh1Z/U5ikmABPoRsLZWtt+5DUlgHgGr6qM1Pf9XnO131L7fJEQjyOqXEzjP1YAhNmUTrgAAAABJRU5ErkJggg==';
26
 const BUTTON_ICON_OFF = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAbUlEQVRYR+2WOQ4AIAgE5f+PVhobDZANBZAsraAwXMoqFil+f9GBj8BW8dIiKt45at/XgShStHgvmfdekwAdIIEyAmh1Z/U5ikmABPoRsLZWtt+5DUlgHgGr6qM1Pf9XnO131L7fJEQjyOqXEzjP1YAhNmUTrgAAAABJRU5ErkJggg==';
47
     /** The HTML element of the button */
47
     /** The HTML element of the button */
48
     private readonly _button: HTMLButtonElement;
48
     private readonly _button: HTMLButtonElement;
49
 
49
 
50
-    /** Bound event handler */
51
-    private readonly _boundEventHandler: EventListener;
52
 
50
 
53
 
51
 
54
 
52
 
60
     {
58
     {
61
         this._viewport = viewport;
59
         this._viewport = viewport;
62
         this._button = this._createButton();
60
         this._button = this._createButton();
63
-        this._boundEventHandler = this._handleFullscreenEvent.bind(this);
61
+        this._handleFullscreenEvent = this._handleFullscreenEvent.bind(this);
64
     }
62
     }
65
 
63
 
66
     /**
64
     /**
72
     {
70
     {
73
         parent.appendChild(this._button);
71
         parent.appendChild(this._button);
74
         this._button.hidden = !isVisible;
72
         this._button.hidden = !isVisible;
75
-        this._viewport.addEventListener('fullscreenchange', this._boundEventHandler);
73
+        this._viewport.addEventListener('fullscreenchange', this._handleFullscreenEvent);
76
     }
74
     }
77
 
75
 
78
     /**
76
     /**
80
      */
78
      */
81
     release(): void
79
     release(): void
82
     {
80
     {
83
-        this._viewport.removeEventListener('fullscreenchange', this._boundEventHandler);
81
+        this._viewport.removeEventListener('fullscreenchange', this._handleFullscreenEvent);
84
         this._button.remove();
82
         this._button.remove();
85
     }
83
     }
86
 
84
 
145
     /**
143
     /**
146
      * Handle a fullscreenchange event
144
      * Handle a fullscreenchange event
147
      */
145
      */
148
-    private _handleFullscreenEvent(event: Event): void
146
+    private _handleFullscreenEvent(event: ViewportEvent): void
149
     {
147
     {
150
         const img = this._viewport.fullscreen ? BUTTON_ICON_ON : BUTTON_ICON_OFF;
148
         const img = this._viewport.fullscreen ? BUTTON_ICON_ON : BUTTON_ICON_OFF;
151
         this._button.style.backgroundImage = 'url(' + img + ')';
149
         this._button.style.backgroundImage = 'url(' + img + ')';

+ 22
- 11
src/utils/ar-events.ts Parādīt failu

22
 
22
 
23
 /**
23
 /**
24
  * AR Event Type
24
  * AR Event Type
25
+ * @internal
25
  */
26
  */
26
 type AREventType = string;
27
 type AREventType = string;
27
 
28
 
28
 /**
29
 /**
29
- * AR Event Listener (callback)
30
- */
31
-export type AREventListener = EventListener;
32
-
33
-/**
34
  * AR Event
30
  * AR Event
35
  */
31
  */
36
 export class AREvent<T extends AREventType> extends Event
32
 export class AREvent<T extends AREventType> extends Event
54
 }
50
 }
55
 
51
 
56
 /**
52
 /**
53
+ * Extract the AREventType from an AREvent
54
+ * @internal
55
+ */
56
+type AREventTypeOf<T> = T extends AREvent<infer U> ? U : never;
57
+
58
+/**
59
+ * AR Event Listener (a callback)
60
+ * @internal
61
+ */
62
+interface AREventListener<T>
63
+{
64
+    (evt: T extends AREvent<infer U> ? T : never): void;
65
+}
66
+
67
+/**
57
  * AR Event Target
68
  * AR Event Target
58
  */
69
  */
59
-export class AREventTarget<T extends AREventType> implements EventTarget
70
+export class AREventTarget<T>
60
 {
71
 {
61
     /** event target delegate */
72
     /** event target delegate */
62
     private readonly _delegate: EventTarget;
73
     private readonly _delegate: EventTarget;
76
      * @param type event type
87
      * @param type event type
77
      * @param callback
88
      * @param callback
78
      */
89
      */
79
-    addEventListener(type: T, callback: AREventListener): void
90
+    addEventListener(type: AREventTypeOf<T>, callback: AREventListener<T>): void
80
     {
91
     {
81
-        this._delegate.addEventListener(type, callback);
92
+        this._delegate.addEventListener(type, callback as EventListener);
82
     }
93
     }
83
 
94
 
84
     /**
95
     /**
86
      * @param type event type
97
      * @param type event type
87
      * @param callback
98
      * @param callback
88
      */
99
      */
89
-    removeEventListener(type: T, callback: AREventListener): void
100
+    removeEventListener(type: AREventTypeOf<T>, callback: AREventListener<T>): void
90
     {
101
     {
91
-        this._delegate.removeEventListener(type, callback);
102
+        this._delegate.removeEventListener(type, callback as EventListener);
92
     }
103
     }
93
 
104
 
94
     /**
105
     /**
97
      * @returns same value as a standard event target
108
      * @returns same value as a standard event target
98
      * @internal
109
      * @internal
99
      */
110
      */
100
-    dispatchEvent(event: AREvent<T>): boolean
111
+    dispatchEvent(event: T extends AREvent<infer U> ? T : never): boolean
101
     {
112
     {
102
         return this._delegate.dispatchEvent(event);
113
         return this._delegate.dispatchEvent(event);
103
     }
114
     }

Notiek ielāde…
Atcelt
Saglabāt