diff 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
line wrap: on
line diff
--- a/src/app/visualisations/waves-base.component.ts	Wed Jul 05 17:28:24 2017 +0100
+++ b/src/app/visualisations/waves-base.component.ts	Wed Jul 05 18:42:12 2017 +0100
@@ -11,33 +11,35 @@
 const trackIdGenerator = countingIdProvider(0);
 
 // has to be an abstract class vs as interface for Angular's DI
-export abstract class VerticallyBounded {
-  abstract get range(): [number, number];
+export abstract class VerticallyBounded<T> {
+  abstract get range(): T;
 }
 
-export abstract class VerticalScaleRenderer extends VerticallyBounded {
-  abstract renderScale(range: [number, number]): void;
-}
-
-export abstract class VerticallyBinned {
-  abstract get binNames(): string[];
-}
-
-export abstract class VerticalBinNameRenderer extends VerticallyBinned {
-  abstract renderNames(binNames: string[]): void;
+export abstract class VerticalScaleRenderer<T> extends VerticallyBounded<T> {
+  abstract renderScale(range: T): void;
 }
 
 export abstract class VerticalValueInspectorRenderer
-  extends VerticalScaleRenderer {
+  extends VerticalScaleRenderer<[number, number]> {
   // TODO how do I know these layers are actually 'describable'?
   abstract renderInspector(range: [number, number], unit?: string): void;
   abstract get updatePosition(): OnSeekHandler;
 }
 
+export abstract class PlayheadManager {
+  abstract update(time: number): void;
+  abstract remove(): void;
+}
+
+export abstract class PlayheadRenderer {
+  abstract renderPlayhead(initialTime: number, colour: string): PlayheadManager;
+}
+
 export type LayerRemover = () => void;
 
 export abstract class WavesComponent<T extends ShapedFeatureData | AudioBuffer>
-  implements AfterViewInit {
+  implements AfterViewInit, PlayheadRenderer {
+
   @ViewChild('track') trackContainer: ElementRef;
   @Input() set width(width: number) {
     if (this.timeline) {
@@ -83,6 +85,22 @@
     this.update();
   }
 
+  renderPlayhead(initialTime: number, colour: string): PlayheadManager {
+    console.warn('waves base render playhead');
+    const cursor = new Waves.helpers.CursorLayer({
+      height: this.height,
+      color: colour,
+    });
+    cursor.currentPosition = initialTime;
+    return {
+      update: currentTime => {
+        cursor.currentPosition = currentTime;
+        cursor.update();
+      },
+      remove: this.addLayer(cursor)
+    };
+  }
+
   private update(): void {
     if (!this.waveTrack || !this.mFeature) {
       return;
@@ -207,7 +225,7 @@
 
 export abstract class VerticallyBoundedWavesComponent
 <T extends ShapedFeatureData> extends WavesComponent<T>
-  implements VerticalScaleRenderer {
+  implements VerticalScaleRenderer<[number, number]> {
   abstract range: [number, number];
 
   renderScale(range: [number, number]): void {
@@ -222,10 +240,10 @@
 
 export abstract class VerticallyBinnedWavesComponent
 <T extends ShapedFeatureData> extends WavesComponent<T>
-  implements VerticalBinNameRenderer {
-  abstract binNames: string[];
+  implements VerticalScaleRenderer<string[]> {
+  abstract range: string[];
 
-  renderNames(binNames: string[]): void {
+  renderScale(binNames: string[]): void {
     this.addLayer(new Waves.helpers.DiscreteScaleLayer({
       tickColor: this.colour,
       textColor: this.colour,