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