Mercurial > hg > ugly-duckling
comparison src/app/visualisations/waves-base.component.ts @ 488:64ed45a0bad3
Introduce PlayheadRenderer, implement in the waves base. Make VerticallyBounded and VerticalScaleRenderer generic and remove bin equivalents. Forward calls for a PlayheadRenderer from VerticalScaleComponent on to its children. Also update other components accordingly.
author | Lucas Thompson <dev@lucas.im> |
---|---|
date | Wed, 05 Jul 2017 18:42:12 +0100 |
parents | de23ea6bcd0d |
children | ab43880f1cd5 |
comparison
equal
deleted
inserted
replaced
487:f2bb5ddae867 | 488:64ed45a0bad3 |
---|---|
9 import {ShapedFeatureData} from './FeatureUtilities'; | 9 import {ShapedFeatureData} from './FeatureUtilities'; |
10 | 10 |
11 const trackIdGenerator = countingIdProvider(0); | 11 const trackIdGenerator = countingIdProvider(0); |
12 | 12 |
13 // has to be an abstract class vs as interface for Angular's DI | 13 // has to be an abstract class vs as interface for Angular's DI |
14 export abstract class VerticallyBounded { | 14 export abstract class VerticallyBounded<T> { |
15 abstract get range(): [number, number]; | 15 abstract get range(): T; |
16 } | 16 } |
17 | 17 |
18 export abstract class VerticalScaleRenderer extends VerticallyBounded { | 18 export abstract class VerticalScaleRenderer<T> extends VerticallyBounded<T> { |
19 abstract renderScale(range: [number, number]): void; | 19 abstract renderScale(range: T): void; |
20 } | |
21 | |
22 export abstract class VerticallyBinned { | |
23 abstract get binNames(): string[]; | |
24 } | |
25 | |
26 export abstract class VerticalBinNameRenderer extends VerticallyBinned { | |
27 abstract renderNames(binNames: string[]): void; | |
28 } | 20 } |
29 | 21 |
30 export abstract class VerticalValueInspectorRenderer | 22 export abstract class VerticalValueInspectorRenderer |
31 extends VerticalScaleRenderer { | 23 extends VerticalScaleRenderer<[number, number]> { |
32 // TODO how do I know these layers are actually 'describable'? | 24 // TODO how do I know these layers are actually 'describable'? |
33 abstract renderInspector(range: [number, number], unit?: string): void; | 25 abstract renderInspector(range: [number, number], unit?: string): void; |
34 abstract get updatePosition(): OnSeekHandler; | 26 abstract get updatePosition(): OnSeekHandler; |
35 } | 27 } |
36 | 28 |
29 export abstract class PlayheadManager { | |
30 abstract update(time: number): void; | |
31 abstract remove(): void; | |
32 } | |
33 | |
34 export abstract class PlayheadRenderer { | |
35 abstract renderPlayhead(initialTime: number, colour: string): PlayheadManager; | |
36 } | |
37 | |
37 export type LayerRemover = () => void; | 38 export type LayerRemover = () => void; |
38 | 39 |
39 export abstract class WavesComponent<T extends ShapedFeatureData | AudioBuffer> | 40 export abstract class WavesComponent<T extends ShapedFeatureData | AudioBuffer> |
40 implements AfterViewInit { | 41 implements AfterViewInit, PlayheadRenderer { |
42 | |
41 @ViewChild('track') trackContainer: ElementRef; | 43 @ViewChild('track') trackContainer: ElementRef; |
42 @Input() set width(width: number) { | 44 @Input() set width(width: number) { |
43 if (this.timeline) { | 45 if (this.timeline) { |
44 requestAnimationFrame(() => { | 46 requestAnimationFrame(() => { |
45 this.timeline.timeContext.visibleWidth = width; | 47 this.timeline.timeContext.visibleWidth = width; |
79 ngAfterViewInit(): void { | 81 ngAfterViewInit(): void { |
80 this.height = | 82 this.height = |
81 this.trackContainer.nativeElement.getBoundingClientRect().height; | 83 this.trackContainer.nativeElement.getBoundingClientRect().height; |
82 this.renderTimeline(); | 84 this.renderTimeline(); |
83 this.update(); | 85 this.update(); |
86 } | |
87 | |
88 renderPlayhead(initialTime: number, colour: string): PlayheadManager { | |
89 console.warn('waves base render playhead'); | |
90 const cursor = new Waves.helpers.CursorLayer({ | |
91 height: this.height, | |
92 color: colour, | |
93 }); | |
94 cursor.currentPosition = initialTime; | |
95 return { | |
96 update: currentTime => { | |
97 cursor.currentPosition = currentTime; | |
98 cursor.update(); | |
99 }, | |
100 remove: this.addLayer(cursor) | |
101 }; | |
84 } | 102 } |
85 | 103 |
86 private update(): void { | 104 private update(): void { |
87 if (!this.waveTrack || !this.mFeature) { | 105 if (!this.waveTrack || !this.mFeature) { |
88 return; | 106 return; |
205 } | 223 } |
206 } | 224 } |
207 | 225 |
208 export abstract class VerticallyBoundedWavesComponent | 226 export abstract class VerticallyBoundedWavesComponent |
209 <T extends ShapedFeatureData> extends WavesComponent<T> | 227 <T extends ShapedFeatureData> extends WavesComponent<T> |
210 implements VerticalScaleRenderer { | 228 implements VerticalScaleRenderer<[number, number]> { |
211 abstract range: [number, number]; | 229 abstract range: [number, number]; |
212 | 230 |
213 renderScale(range: [number, number]): void { | 231 renderScale(range: [number, number]): void { |
214 this.addLayer(new Waves.helpers.ScaleLayer({ | 232 this.addLayer(new Waves.helpers.ScaleLayer({ |
215 tickColor: this.colour, | 233 tickColor: this.colour, |
220 } | 238 } |
221 } | 239 } |
222 | 240 |
223 export abstract class VerticallyBinnedWavesComponent | 241 export abstract class VerticallyBinnedWavesComponent |
224 <T extends ShapedFeatureData> extends WavesComponent<T> | 242 <T extends ShapedFeatureData> extends WavesComponent<T> |
225 implements VerticalBinNameRenderer { | 243 implements VerticalScaleRenderer<string[]> { |
226 abstract binNames: string[]; | 244 abstract range: string[]; |
227 | 245 |
228 renderNames(binNames: string[]): void { | 246 renderScale(binNames: string[]): void { |
229 this.addLayer(new Waves.helpers.DiscreteScaleLayer({ | 247 this.addLayer(new Waves.helpers.DiscreteScaleLayer({ |
230 tickColor: this.colour, | 248 tickColor: this.colour, |
231 textColor: this.colour, | 249 textColor: this.colour, |
232 height: this.height, | 250 height: this.height, |
233 binNames | 251 binNames |